基本框架
实现
- 打开web页面用户登录成功,拿到token值
- 打开手机app 使用从Web 页面上获取到的token值进行登录
创建一个新项目
新建git 项目
创建成功之后,将项目下载到本地
用Pycharm 打开项目
安装依赖库
- 配置项目的虚拟环境
选择虚拟环境。
使用的技术框架
- pytest 单元测试框架
- python-appium-client 手机app自动化测试框架
- selenium web 自动化测试框架
- openpyxl excel文件数据驱动
- pyyaml 配置文件
- allure-pytest 测试报告
requirements.txt
allure-pytest==2.8.34
allure-python-commons==2.8.34
appdirs==1.4.4
Appium-Python-Client==1.0.2
asgiref==3.3.1
atomicwrites==1.4.0
attrs==20.3.0
certifi==2020.12.5
chardet==4.0.0
click==7.1.2
colorama==0.4.4
ddt==1.4.2
distlib==0.3.1
Django==3.1.7
et-xmlfile==1.1.0
filelock==3.0.12
Flask==1.1.2
idna==2.10
iniconfig==1.1.1
itsdangerous==1.1.0
jdcal==1.4.1
Jinja2==2.11.2
MarkupSafe==1.1.1
mysql-connector-python==8.0.23
openpyxl==3.0.7
packaging==20.7
pipenv==2020.11.15
pluggy==0.13.1
protobuf==3.15.3
py==1.9.0
pymongo==3.11.4
pyparsing==2.4.7
pytest==6.1.2
pytest-html==3.1.1
pytest-metadata==1.11.0
pytz==2021.1
PyYAML==5.4.1
requests==2.25.1
robotframework==4.0.2
robotframework-pythonlibcore==2.2.1
robotframework-seleniumlibrary==5.1.3
schedule==0.6.0
selenium==3.141.0
six==1.15.0
sqlparse==0.4.1
toml==0.10.2
unittest-xml-reporting==3.0.4
urllib3==1.26.4
virtualenv==20.4.3
virtualenv-clone==0.5.4
Werkzeug==1.0.1
xlrd==2.0.1
xlutils==2.0.0
xlwt==1.3.0
使用 命令
pip install -r requirements.txt
封装driver
web自动化使用的是Selenium, 手机App 自动化使用的是 appium, 两者之间使用的库的方法原理都是一样。
项目的根目录下, 还是使用 pytest 的 fixtures 功能 ,在自动化 web,app 之前先把web 和 app 驱动设置好
下载 ChromeDriver, 需要下载两个Chromedriver
https://npm.taobao.org/mirrors/chromedriver/
- 驱动Web浏览器
- 驱动手机app里面的H5页面
Web浏览器Driver
根据浏览器的版本下载 最近的版本
手机App的驱动
下载对应的版本
将两个driver 下载下来之后放到 drivers 目录中,分别重命名一下
根目录下创建 conftest.py
import pytest
from selenium import webdriver as web # web 的 webdriver
from appium import webdriver as app # appium 的webdriver
import os
root_dir = os.path.dirname(os.path.abspath(__file__))
@pytest.fixture(scope="session")
def wdriver():
# 定义浏览器的驱动
driverpath = os.path.join(root_dir,'drivers/webchromedriver.exe')
wdriver = web.Chrome(executable_path=driverpath)
wdriver.implicitly_wait(5)
wdriver.maximize_window()
yield wdriver
# 所有的测试运行完毕之后 关闭 浏览器
wdriver.quit()
@pytest.fixture(scope='session')
def adriver():
# 定义 手机app driver
chromedriver = os.path.join(root_dir,'drivers/appchromedriver.exe')
desired_caps = {
'platformName': 'Android', # 测试Android系统
'udid': "127.0.0.1:62001", # adb devices 命令查看 设置为自己的设备
'automationName': 'UiAutomator2', # 自动化引擎
'noReset': False, # 不要重置app的状态
'fullReset': False, # 不要清理app的缓存数据
'chromedriverExecutable': chromedriver, # chromedriver 对应的绝对路径
'appPackage': "org.cnodejs.android.md", # 应用的包名
'appActivity': ".ui.activity.LaunchActivity" # 应用的活动页名称
}
adriver = app.Remote('http://127.0.0.1:4723/wd/hub', desired_capabilities=desired_caps)
adriver.implicitly_wait(5) # 全局的隐式等待时间
yield adriver # 将driver 传递出来
# 所有的用例执行之后
adriver.quit()
进行基本的测试
在testcases下创建 test_tmp.py 文件
"""
临时测试 能否正常启动 app web
"""
import time
def test_drivers(wdriver,adriver):
"""
1. 打开浏览器端 访问 http://47.100.175.62:3000/ 使用 fanmao_36 密码 123456 登录
2. 手机app 也到登录页面
:return:
"""
wdriver.get("http://47.100.175.62:3000/")
wdriver.find_element_by_xpath('//a[@href="/signin"]').click()
wdriver.find_element_by_id('name').send_keys('fanmao_36')
wdriver.find_element_by_id('pass').send_keys('123456')
wdriver.find_element_by_xpath('//*[@type="submit"]').click()
# 手机app端的操作
adriver.find_element_by_xpath('//*[@resource-id="org.cnodejs.android.md:id/toolbar"]/android.widget.ImageButton').click()
time.sleep(1)
adriver.find_element_by_id('org.cnodejs.android.md:id/tv_login_name').click()
运行测试用例,可以看到web和app都已经运行起来。