Appium [开源分享] 基于 Appium-python3 的移动自动化测试框架 AppiumLich,附相关系列教程

Mio4kon · 2017年04月13日 · 最后由 问世花妖 回复于 2018年11月30日 · 4623 次阅读

简介

AppiumLich 基于 Appium, python3, Allure.测试case清晰明了,定位元素基于 pageobject的模式,并自动生成 pageobject的相关代码,封装Appium API提供更加实用强大的API.

源码地址: https://github.com/mio4kon/appium-lich

运行效果: http://mio4kon.qiniudn.com/case-2.gif

下面附上几篇学习的系统教程,非常适合新手入门.最后两篇是基于AppiumLich框架的实践.

移动端自动化测试系列之一——Appium环境搭建

移动端自动化测试系列之二——pytest入门详解

移动端自动化测试系列之三——Allure测试报告

移动端自动化测试系列之四——生成定位元素

移动端自动化测试系列之五——AppiumLich框架使用

环境要求

Python3:

brew install python3

Python3 Package

pip3 install <package> 
  • Appium-Python-Client
  • Jinja2
  • PyYAML
  • pytest
  • pytest-allure-adaptor
  • watchdog
  • termcolor (not needed)

Appium

npm install -g appium
npm install -g appium-doctor

appium-doctor to ensure your system is set up properly

more

Allure-Commandline

Allure Framework is a flexible lightweight multi-language test report tool with the possibility to add screenshots, logs and so on. It provides modular architecture and neat web reports with the ability to store attachments, steps, parameters and many more.

brew tap qatools/formulas 
brew install allure-commandline

more

Run Test

start appium service:

appium --address 127.0.0.1 --port 4723 --log "log_path" --log-timestamp --local-timezone --session-override

run test:

cd project_path
python3 run.py

Html-Report will be generate on project_path/report/html/index.html

report shot:

Write Test Case

开启watchdog

cd project_path
python3 watch_dog.py

打开 project_path/data/pages.yaml,以下面模板定位元素:


---
LoginPage:
dec: 登录页面
locators:
-
name: 注册
timeOutInSeconds: 20
type: name
value: 注册

写测试case

class TestLogin:
def test_login(self, action: ElementActions):
L.d('test_login')
account = Steps.get_account()
action.click(HomePage.登录入口)
action.text(LoginPage.账户, account[0])
action.text(LoginPage.密码, account[1])
action.sleep(1)
action.click(LoginPage.登录)
assert action.is_toast_show('欢迎回来')

TODO

  • 兼容iOS
  • 集成 stf
共收到 75 条回复 时间 点赞

楼主,你的博客打开实在太慢了。。挂在国外的吧?有机会可以把你的文章搬到社区来

恒温 回复

是放在Github Page上的.我搞搞看

@Mio4kon 请问这是什么用法 方法定义后面带->
谢谢
def get_environment_info(self) -> EnvironmentInfo:
env_path = self.config.env_yaml_path
with open(env_path, 'r') as f:
env_info = yaml.safe_load(f)
return env_info

erinet 回复

这个是显式告诉返回值是EnvironmentInfo类型.可以方便ide提示

好吊

学习一下

感谢分享

—— 来自TesterHome官方 安卓客户端

楼主是不是将所有页面的信息都写在pages.yaml吗?能不能提供详细点的说明,谢谢😂

@Mio4kon (Mio4kon)
请问楼主

命令无法执行的问题搞定了 现在就是怎么使用allure生成工具 生成报告呢 windows7环境

提示 not found

10楼 已删除

@Mio4kon 楼主麻烦看下什么问题

Tester_web 回复

要进入所在的目录文件夹,或者把全路径都写了 .
命令格式是:

allure generate <生成的xml路径>/ -o <要生成的html路径>
erinet 回复

appium服务器开了吗?

appium --address 127.0.0.1 --port 4723 --log "log_path" --log-timestamp --local-timezone --session-override

@Mio4kon 楼主,我使用了 allure generate <生成的xml路径>/ -o <要生成的html路径> 怎么生成的是一堆乱的文件
index.html 是一个空的模板页

用例多了之后怎么管理?

Mio4kon 回复

楼主,方便留下微信号或者QQ号吗?有些问题不太明白

@Mio4kon 请教个问题
pytest.main(args) 这行代码进入那行代码首先执行?

Imp 回复

看下你生成的xml,最好试下<要生成的html路径>设置在一个子文件夹里.防止覆盖源文件

jojotester 回复

管理元素还是用例?
用例多的话可以写多个test文件,把一些重复的过程封装到Steps中.还可以使用Allure的severity, features等注释将用例归类.

erinet 回复

这个就是相当于执行命令行:pytest

Mio4kon 回复

不知道符不符合论坛规矩啊哈哈哈,有啥问题论坛问也行.我都会回答的

Mio4kon 回复

steps相当于公用(通用)的操作了?能否再多介绍下steps在多用例中使用的思路?在写多个tests时候

Mio4kon 回复

嗯,后面试过生成在一个子文件夹下,可是生成的index.html 没有任何元素,还在找原因

Imp 回复

可以看下用例执行完后生成的xml文件有没有内容.

jojotester 回复

并不是通用的才会定义step.我会把一些常用的操作例如登录,注册,进入主页等会重复使用的放到一个单独的Step文件里.方便写用例. 而且测试报告也会很清楚.不会重复使用的也可以用step注释,只不过不会放到单独的文件了.目的只是看报告清楚.
还有比如一个功能可能有多个场景,可以用features和stories配合使用.

请教下一个用例有多个检查点时,用这个框架该怎么处理呢?
情况1:检查点A和检查点B是前后顺序,A PASS了才能继续B
情况2:检查点A和B是并行关系

jojotester 回复

如果检查点A,检查点B放在一个test_method的话很简单.A ERROR的话本身就不会执行B.
如果放在两个test_method的话要用到pytest的xfail.
文档可以看
https://docs.pytest.org/en/latest/skipping.html
例子:
http://stackoverflow.com/questions/12411431/pytest-how-to-skip-the-rest-of-tests-in-the-class-if-one-has-failed
并行关系的话我都放在两个test_method处理的.或者你可举一个具体的例子.

@Mio4kon 'automationName': 'UIAutomator2', 这个对andriod版本有要求吧 我在4.3版本下运行 webdriver 起不来

有个疑惑请教下,
test_home.py下的test_login用例的失败会不会一直占着appium的session不释放?
test_home.py的执行失败会不会影响到另外的test_me.py?

erinet 回复

额..是的.4.3的要删掉这个配置.有空我把他变成根据系统版本来配置吧

jojotester 回复

1.和成功失败没关系.我写的例子用的是action,域是"module".所有同一"module"下不会释放,如果希望每个method都释放可以用action2
2.不会

可以分多个pagexx.yaml吗 ? 如果把所有页面元素都写在pages.yaml下 不方便分类维护吧

Mio4kon 回复

删掉的话 后面的text方法报错

erinet 回复

click 报什么错? 我试了下4.3版本click没问题,只是Toast不能用这种方式验证了.
Toast 是在Appium 1.6.3 Releases中加入的

Android - Uiautomator2

Add ability to verify TOAST messages (these can't be interacted with, only
text retrieval allowed)

分多个page.yaml有在做考虑

Mio4kon 回复

我说错了 是text有问题

brew install allure-commandline 一直报错“curl: (7) Failed to connect to github-cloud.s3.amazonaws.com port 443: Operation timed out”,重试了N次都没装上,楼主是怎么装上的额?

brew install allure-commandline
Updating Homebrew...
==> Installing allure-commandline from qatools/formulas
==> Downloading https://github.com/allure-framework/allure-core/releases/downloa
######################################################################## 100.0%
curl: (7) Failed to connect to github-cloud.s3.amazonaws.com port 443: Operation timed out
Error: Failed to download resource "allure-commandline"
Download failed: https://github.com/allure-framework/allure-core/releases/download/allure-core-1.4.23/allure-commandline.zip
erinet 回复

现在最新代码支持拆分pages.yaml了.
你那个找不到text的问题估计是selenium版本的问题.建议装3.0.2版本.具体见我的博客里提到:

移动端自动化测试系列之一——Appium环境搭建

tester 回复

应该是国内连不上亚马逊的服务器,换一下homebrew的镜像源吧

40楼 已删除
Mio4kon 回复

楼主留下QQ号呗!!或者微信号

有点强势啊,膜拜。

Imp 回复

@bulecat 空白页面解决了吗

Mio4kon 回复

我用的是python3为什么还是不行,

我也是空白页,求助~~

直接运行test_home.py,报错的,楼主能解决下吗?

======================================================================

ERROR: test.test_home.TestLogin.test_login

Traceback (most recent call last):
File "C:\Program Files\Python35\lib\site-packages\nose\case.py", line 198, in runTest
self.test(*self.arg)
TypeError: test_login() missing 1 required positional argument: 'action'


Ran 1 test in 0.002s

六星 回复

不能直接运行test_home.py ,要运行 run.py

@Mio4kon win7下安装Allure Commandline(allure1-1.5.4\allure-commandline\src\main\scripts\allure.bat),提示“此时不应有 \Java\jdk1.8.0_112”。将allure.bat中的%修改成%%后再执行,无响应。不知该如何解决?

刚写楼主分享 刚刚打算入职新公司,是做app测试的,而且十分幸运也是要求用python写测试。

请问,现在国内用python写测试的多么,通常是哪个版本的python比较多?另外 python3在你的这个例子里面是不是必须的?

谢谢啦

@Mio4kon 我是在win7下载zip包(GitHub)安装出现上述问题的,也不知是文档还是文件原因,总之折腾了一段时间未能解决(无论是Allure1还是Allure2,LZ教程中提供的链接是Allure1)。今天改用Scoop包管理方式才装上Allure。方法如下:

  1. 安装Scoop(可百度搜索【Scoop在windows平台上进行环境快速部署】)
  2. 在Powershell下(【附件 -> Windows PowerShell】下)通过Scoop安装Allure
scoop install allure

@bulecat @xiaocong168 @huangxiaojiao 我也遇到Allure空白页问题(打开xml有内容),试过Chrome、FF、IE等浏览器,只有FF能正常打开,不清楚是不是浏览器兼容问题。

框架里写到运行watch_dog,对yaml文件做了改动并且保存的话,page.py会自动生成代码,试了下没反应。所以目前还是自己手动去吧页面信息输入到page.py中。。是哪里的问题呢?
还有,allure可以做到失败页面截图么?我看到report中log很详细,但是好像没有截图

李卓 回复

截图有的.代码很多还没推.过几天可能会版本更新上去.

niky 回复

空白页的原因是因为报告用到了ajax本地请求,不支持file协议.建议报告集成到Jenkins或者使用chrome的插件web server. 还有一种方法就是利用pychram IDE右键html文件open in browser

Imp 回复

空白页的原因是因为报告用到了ajax本地请求,不支持file协议.建议报告集成到Jenkins或者使用chrome的插件web server. 还有一种方法就是利用pychram IDE右键html文件open in browser

victor 回复

我用的是python3. 我建议没有历史包袱的话就用python3吧

summiter 回复

Allure1 有很多方式可以装.比如npm可以用下面这种,改下版本号.
现在框架已经改成Allure2了.不过代码还没有提交.
npm install -g allure-commandline@2.0.1 --save-dev

李卓 回复

看下有没有保存信息.然后yaml文件有没有写错.空格什么的是否对齐.

summiter 回复

空白问题见我上面的回复

erinet 回复

暂时没有

Imp 回复

我已经解决了 生成的报告不能直接打开的 你要用一个web服务 把报告文件部署近期访问

整个项目过了一遍,楼主很赞。
个人感觉对报告的后续发送处理加上就更好,如把报告的概要(版本、时间、通过项数)通过post http发送出去(例如微信公众号api),这样闭环之后,在实际工作使用中更好点。

你的TODO干的怎么样?

Mio4kon 回复

现在就是用的你那个框架做手机UI自动化,case可以顺利的跑,也遇到几个问题。

  1. 这几天一直在想怎么可以做到assert失败之后自动截图。一条case执行到assert失败,就会停止,try except去截图的话,会导致原本应该fail的case变成pass,上网查很多用java的会写个监听程序,不知道python里面怎么实现?
  2. 也在想怎么可以让appium在某些case之间不关闭app,保留当前页面继续跑,比如测试登录时密码为空和错误2种情况,没有必要关闭,重新打开app。本来我给放一条case里面,但是一旦assert失败,后面的代码都不会执行。
  3. 怎么控制test case的执行步骤比较好?
  4. 还有上次提到的watchdog没有自动更新page文件,试了下,运行page文件夹下的tools是可以自动更新page的,这个我等下再看看watchdog哪里有问题😆 😆
erinet 回复

咋弄


我运行出来是这样的,求助啊,各位大神

回复

我第一次跑report就可以打开的啊,难道是因为用的pycharm的关系?反正我去文件夹里面直接双击index.html也能看到完整报告。
上面Mio4kon不是回复说:“空白页的原因是因为报告用到了ajax本地请求,不支持file协议.建议报告集成到Jenkins或者使用chrome的插件web server. 还有一种方法就是利用pychram IDE右键html文件open in browser”,你试试呗

楼主问个问题,就是用uiautomaterviewer定位的时候,针对NAF的节点怎么定位呢?这些控件是不被Uiautomator工具识别

李卓 回复

都试了,没用,莫名的蛋疼

楼主,我这边执行时 self.appium_v = Shell.invoke('appium -v').splitlines()[0].strip(),Shell.invoke('appium -v')获取的总是空,导致报错,求解~

73楼 已删除
75楼 已删除

小白看不懂utils目录下的代码···就大佬讲解下。

utils-shell self.adb('get-serialno').stdout.read()strip()我一直报错,self.adb('get-serialno')这段返回是一个字符串,studout方法不是文本嘛,所以一直报错'str' object has no attribute 'stdout'···求解惑

79楼 已删除
仅楼主可见
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册