本文首发于 TesterHome 社区, 文末有福利 !链接 https://testerhome.com/topics/19327
前言
做 UI 自动化测试有段时间了,在 TesterHome
社区看了大量文章,也在网上搜集了不少资料,加上自己写代码、调试过程中摸索了很多东西,踩了不少坑,才有了这篇文章。希望能给做 UI
自动化测试小伙伴们提供些许帮助。
文本主要介绍用 Pytest+Allure+Appium 实现 UI
自动化测试过程中的一些好用的方法和避坑经验。文章可能有点干,看官们多喝水!O(∩_∩)O~
主要用了啥:
- Python3
- Appium
- Allure-pytest
- Pytest
Appium 不常见却好用的方法
1. Appium 直接执行 adb shell 方法
1. # Appium 启动时增加 --relaxed-security 参数 Appium 即可执行类似adb shell的方法
2.
3. 2. > appium -p 4723 --relaxed-security
4.
5.
6.
7.
8. 1. # 使用方法
9.
10. 2. def adb_shell(self, command, args, includeStderr=False):
11.
12. 3. """
13.
14. 4. appium --relaxed-security 方式启动
15.
16. 5. adb_shell('ps',['|','grep','android'])
17.
18. 6.
19.
20.
21. 7. :param command:命令
22.
23. 8. :param args:参数
24.
25. 9. :param includeStderr: 为 True 则抛异常
26.
27. 10. :return:
28.
29. 11. """
30.
31. 12. result = self.driver.execute_script('mobile: shell', {
32.
33. 13. 'command': command,
34.
35. 14. 'args': args,
36.
37. 15. 'includeStderr': includeStderr,
38.
39. 16. 'timeout': 5000
40.
41. 17. })
42.
43. 18. return result['stdout']
44.
45.
46.
2. Appium 直接截取元素图片的方法
1. element = self.driver.find_element_by_id('cn.xxxxxx:id/login_sign')
2.
3. 2. pngbyte = element.screenshot_as_png
4.
5. 3. image_data = BytesIO(pngbyte)
6.
7. 4. img = Image.open(image_data)
8.
9. 5. img.save('element.png')
10.
11. 6. # 该方式能直接获取到登录按钮区域的截图
12.
13.
14.
3. Appium 直接获取手机端日志
1. # 使用该方法后,手机端 logcat 缓存会清除归零,从新记录
2.
3. 2. # 建议每条用例执行完执行一边清理,遇到错误再保存减少陈余 log 输出
4.
5. 3. # Android
6.
7. 4. logcat = self.driver.get_log('logcat')
8.
9. 5.
10.
11.
12. 6. # iOS 需要安装 brew install libimobiledevice
13.
14. 7. logcat = self.driver.get_log('syslog')
15.
16. 8.
17.
18.
19. 9. # web 获取控制台日志
20.
21. 10. logcat = self.driver.get_log('browser')
22.
23. 11.
24.
25.
26. 12. c = '\n'.join([i['message'] for i in logcat])
27.
28. 13. allure.attach(c, 'APPlog', allure.attachment_type.TEXT)
29.
30. 14. #写入到 allure 测试报告中
31.
32.
33.
4. Appium 直接与设备传输文件
1. # 发送文件
2.
3. 2. #Android
4.
5. 3. driver.push_file('/sdcard/element.png', source_path='D:\works\element.png')
6.
7. 4.
8.
9.
10. 5. # 获取手机文件
11.
12. 6. png = driver.pull_file('/sdcard/element.png')
13.
14. 7. with open('element.png', 'wb') as png1:
15.
16. 8. png1.write(base64.b64decode(png))
17.
18. 9.
19.
20.
21. 10. # 获取手机文件夹,导出的是zip文件
22.
23. 11. folder = driver.pull_folder('/sdcard/test')
24.
25. 12. with open('test.zip', 'wb') as folder1:
26.
27. 13. folder1.write(base64.b64decode(folder))
28.
29. 14.
30.
31.
32. 15. # iOS
33.
34. 16. # 需要安装 ifuse
35.
36. 17. # > brew install ifuse 或者 > brew cask install osxfuse 或者 自行搜索安装方式
37.
38. 18.
39.
40.
41. 19. driver.push_file('/Documents/xx/element.png', source_path='D:\works\element.png')
42.
43. 20.
44.
45.
46. 21. # 向 App 沙盒中发送文件
47.
48. 22. # iOS 8.3 之后需要应用开启 UIFileSharingEnabled 权限不然会报错
49.
50. 23. bundleId = 'cn.xxx.xxx' # APP名字
51.
52. 24. driver.push_file('@{bundleId}/Documents/xx/element.png'.format(bundleId=bundleId), source_path='D:\works\element.png')
53.
54.
55.
Pytest 与 Unittest 初始化上的区别
很多人都使用过 Unitest,先说一下 Pytest 和 Unitest 在 Hook method上的一些区别:
1. Pytest 与 Unitest 类似,但有些许区别
以下是 Pytest
1. class TestExample:
2.
3. 2. def setup(self):
4.
5. 3. print("setup class:TestStuff")
6.
7. 4.
8.