基本框架
未命名表单.png

实现

  1. 打开web页面用户登录成功,拿到token值
  2. 打开手机app 使用从Web 页面上获取到的token值进行登录

创建一个新项目

新建git 项目
image.png
创建成功之后,将项目下载到本地
image.png
用Pycharm 打开项目
image.png

安装依赖库

  1. 配置项目的虚拟环境

image.png
选择虚拟环境。
image.png


使用的技术框架

  • pytest 单元测试框架
  • python-appium-client 手机app自动化测试框架
  • selenium web 自动化测试框架
  • openpyxl excel文件数据驱动
  • pyyaml 配置文件
  • allure-pytest 测试报告

requirements.txt

  1. allure-pytest==2.8.34
  2. allure-python-commons==2.8.34
  3. appdirs==1.4.4
  4. Appium-Python-Client==1.0.2
  5. asgiref==3.3.1
  6. atomicwrites==1.4.0
  7. attrs==20.3.0
  8. certifi==2020.12.5
  9. chardet==4.0.0
  10. click==7.1.2
  11. colorama==0.4.4
  12. ddt==1.4.2
  13. distlib==0.3.1
  14. Django==3.1.7
  15. et-xmlfile==1.1.0
  16. filelock==3.0.12
  17. Flask==1.1.2
  18. idna==2.10
  19. iniconfig==1.1.1
  20. itsdangerous==1.1.0
  21. jdcal==1.4.1
  22. Jinja2==2.11.2
  23. MarkupSafe==1.1.1
  24. mysql-connector-python==8.0.23
  25. openpyxl==3.0.7
  26. packaging==20.7
  27. pipenv==2020.11.15
  28. pluggy==0.13.1
  29. protobuf==3.15.3
  30. py==1.9.0
  31. pymongo==3.11.4
  32. pyparsing==2.4.7
  33. pytest==6.1.2
  34. pytest-html==3.1.1
  35. pytest-metadata==1.11.0
  36. pytz==2021.1
  37. PyYAML==5.4.1
  38. requests==2.25.1
  39. robotframework==4.0.2
  40. robotframework-pythonlibcore==2.2.1
  41. robotframework-seleniumlibrary==5.1.3
  42. schedule==0.6.0
  43. selenium==3.141.0
  44. six==1.15.0
  45. sqlparse==0.4.1
  46. toml==0.10.2
  47. unittest-xml-reporting==3.0.4
  48. urllib3==1.26.4
  49. virtualenv==20.4.3
  50. virtualenv-clone==0.5.4
  51. Werkzeug==1.0.1
  52. xlrd==2.0.1
  53. xlutils==2.0.0
  54. xlwt==1.3.0

使用 命令

  1. pip install -r requirements.txt

封装driver

web自动化使用的是Selenium, 手机App 自动化使用的是 appium, 两者之间使用的库的方法原理都是一样。
项目的根目录下, 还是使用 pytest 的 fixtures 功能 ,在自动化 web,app 之前先把web 和 app 驱动设置好

下载 ChromeDriver, 需要下载两个Chromedriver
https://npm.taobao.org/mirrors/chromedriver/

    1. 驱动Web浏览器
    1. 驱动手机app里面的H5页面

Web浏览器Driver
image.png
根据浏览器的版本下载 最近的版本
image.png
手机App的驱动
image.png
下载对应的版本
image.png

将两个driver 下载下来之后放到 drivers 目录中,分别重命名一下
image.png

根目录下创建 conftest.py

  1. import pytest
  2. from selenium import webdriver as web # web 的 webdriver
  3. from appium import webdriver as app # appium 的webdriver
  4. import os
  5. root_dir = os.path.dirname(os.path.abspath(__file__))
  6. @pytest.fixture(scope="session")
  7. def wdriver():
  8. # 定义浏览器的驱动
  9. driverpath = os.path.join(root_dir,'drivers/webchromedriver.exe')
  10. wdriver = web.Chrome(executable_path=driverpath)
  11. wdriver.implicitly_wait(5)
  12. wdriver.maximize_window()
  13. yield wdriver
  14. # 所有的测试运行完毕之后 关闭 浏览器
  15. wdriver.quit()
  16. @pytest.fixture(scope='session')
  17. def adriver():
  18. # 定义 手机app driver
  19. chromedriver = os.path.join(root_dir,'drivers/appchromedriver.exe')
  20. desired_caps = {
  21. 'platformName': 'Android', # 测试Android系统
  22. 'udid': "127.0.0.1:62001", # adb devices 命令查看 设置为自己的设备
  23. 'automationName': 'UiAutomator2', # 自动化引擎
  24. 'noReset': False, # 不要重置app的状态
  25. 'fullReset': False, # 不要清理app的缓存数据
  26. 'chromedriverExecutable': chromedriver, # chromedriver 对应的绝对路径
  27. 'appPackage': "org.cnodejs.android.md", # 应用的包名
  28. 'appActivity': ".ui.activity.LaunchActivity" # 应用的活动页名称
  29. }
  30. adriver = app.Remote('http://127.0.0.1:4723/wd/hub', desired_capabilities=desired_caps)
  31. adriver.implicitly_wait(5) # 全局的隐式等待时间
  32. yield adriver # 将driver 传递出来
  33. # 所有的用例执行之后
  34. adriver.quit()

进行基本的测试

在testcases下创建 test_tmp.py 文件

  1. """
  2. 临时测试 能否正常启动 app web
  3. """
  4. import time
  5. def test_drivers(wdriver,adriver):
  6. """
  7. 1. 打开浏览器端 访问 http://47.100.175.62:3000/ 使用 fanmao_36 密码 123456 登录
  8. 2. 手机app 也到登录页面
  9. :return:
  10. """
  11. wdriver.get("http://47.100.175.62:3000/")
  12. wdriver.find_element_by_xpath('//a[@href="/signin"]').click()
  13. wdriver.find_element_by_id('name').send_keys('fanmao_36')
  14. wdriver.find_element_by_id('pass').send_keys('123456')
  15. wdriver.find_element_by_xpath('//*[@type="submit"]').click()
  16. # 手机app端的操作
  17. adriver.find_element_by_xpath('//*[@resource-id="org.cnodejs.android.md:id/toolbar"]/android.widget.ImageButton').click()
  18. time.sleep(1)
  19. adriver.find_element_by_id('org.cnodejs.android.md:id/tv_login_name').click()

运行测试用例,可以看到web和app都已经运行起来。