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

Mio4kon · 2017年04月13日 · 最后由 牛马搬砖君 回复于 2018年11月30日 · 4267 次阅读

简介

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

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

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

环境要求

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

74楼 已删除

@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 有问题

匿名 #37 · 2017年04月18日

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 环境搭建

应该是国内连不上亚马逊的服务器,换一下 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') 获取的总是空,导致报错,求解~

79楼 已删除
75楼 已删除

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

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

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