移动端自动化测试
Appium 工作原理
Appium Server是Appium的服务端,作为一个Web接口服务,使用Node.js实现。Appium Server接收到Client发送的指令后,将这些指令转换为移动端能够识别的指令,然后发送给移动端设备,并对移动端设备进行操作
Appium 测试框架
import unittest
from appium import webdriver
class MyTestCase(unittest.TestCase):
def setUp(self) -> None:
capabilities = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='127.0.0.1:62001',
appPackage='com.jhss.youguu',
appActivity='.SplashActivity',
noReset=False,
skipDeviceInitialization=True
)
appium_server_url = 'http://localhost:4723'
self.driver = webdriver.Remote(appium_server_url, capabilities)
self.driver.implicitly_wait(6)
def tearDown(self) -> None:
self.driver.quit()
Appium 方法
# 启动app
driver.launch_app()
driver.start_activity('com.jhss.youguu', '.SplashActivity')
# 截屏
driver.save_screenshot('error.png')
# 切换上下文
contexts = driver.contexts
# print(driver.current_context)
# print(contexts)
driver.switch_to.context(contexts[1])
# print(driver.current_context)
# 滑动
driver.swipe(1360, 970, 80, 970)
# 长按
ele = driver.find_element(By.XPATH, '//android.widget.TextView[@content-desc="文本"]')
TouchAction(driver).long_press(ele, 6000).release().perform()
# 短按
ele = driver.find_element(By.XPATH, '//android.widget.TextView[@content-desc="文本"]')
TouchAction(driver).press(ele).release().perform()
# 手势移动
TouchAction(driver).press(x=400, y=970).move_to(x=400, y=1594).move_to(x=1028, y=1594).perform()
# 滚动
ele1 = driver.find_element_by_android_uiautomator('new UiSelector().text("文本")')
ele2 = driver.find_element_by_android_uiautomator('new UiSelector().text("文本")')
driver.scroll(ele1, ele2)
# 拖拽
ele1 = driver.find_element_by_android_uiautomator('new UiSelector().text("文本")')
ele2 = driver.find_element_by_android_uiautomator('new UiSelector().text("文本")')
driver.drag_and_drop(ele1, ele2)
# 切换至后台
driver.background_app(2)
# 安装应用
driver.install_app(r"D:路径")
# 卸载应用
driver.remove_app('com.dongqiudi.news')
# 判断app是否存在
print(driver.is_app_installed('com.jingdong.app.mall'))
# 查看当前Activity名
print(driver.current_activity)
# 查看当前包名
print(driver.current_package)
# 电源键
driver.unlock()
Appium 发送文件
file_path = r'D:路径'
path = '/storage/emulated/0/Apps/'
# 发送文件到手机
with open(file_path, 'rb') as fp:
data = str(base64.b64encode(fp.read()), 'utf-8')
driver.push_file(path, data)
# 发送手机文件到电脑
data = driver.pull_file(path)
with open(file_path, 'wb') as fp:
fp.write(base64.b64decode(data))
Appium 定位方式
# 文本定位
find_e = 'new UiSelector().text("文本")'
driver.find_element_by_android_uiautomator(find_e).click()
# 父级定位
father = 'resourceId("com.jhss.youguu:id/rl_left").childSelector(resourceId("com.jhss.youguu:id/head_pic"))'
driver.find_element_by_android_uiautomator(father).click()
# 兄弟定位
brother = 'resourceId("com.jhss.youguu:id/ll_fake_search_btn").fromParent(resourceId("com.jhss.youguu:id/rl_left"))'
driver.find_element_by_android_uiautomator(brother).click()
# 模糊定位
driver.find_element(By.XPATH, '//android.widget.ImageView[contains(@resource-id,"pic")]').click()
# 模糊定位(结尾)
driver.find_element(By.XPATH, '//android.widget.ImageView[ends-with(@resource-id,"pic")]').click()
# 模糊定位(开始)
driver.find_element(By.XPATH, '//android.widget.ImageView[starts-with(@resource-id,"pic")]').click()
数据驱动
# csv数据驱动
def get_data_csv(filepath):
lis = []
with open(filepath) as f:
data = csv.reader(f)
next(data)
for line in data:
lis.append(line)
return lis
# execl数据驱动
def get_data_excel(filepath, sheetname):
data = load_workbook(filepath)
value = data[sheetname]
lis = []
for line in value:
l1 = [line[0].value, line[1].value, line[2].value, line[3].value]
lis.append(l1)
lis.pop(0)
return lis
测试报告
# html测试报告
import HTMLTestRunner_cn
import unittest
def report():
report = HTMLTestRunner_cn.HTMLTestRunner(
open('./report/report.html'', 'wb'),
description='本次执行了xx条用例',
title='测试报告'
)
return report
if __name__ == '__main__':
suite = unittest.defaultTestLoader.discover(start_dir='./case', pattern='test*.py')
Tools().report().run(suite)
元素值
# html测试报告
import HTMLTestRunner_cn
import unittest
def report():
report = HTMLTestRunner_cn.HTMLTestRunner(
open('./report/report.html'', 'wb'),
description='本次执行了xx条用例',
title='测试报告'
)
return report
if __name__ == '__main__':
suite = unittest.defaultTestLoader.discover(start_dir='./case', pattern='test*.py')
Tools().report().run(suite)