上一篇讲到基于Java语言的appium自动化测试。老实说,在使用的过程中让人极其不快,它没有接口自动化的速度,甚至于比UI自动化慢很多。在代码运行过程中,总是会由于各种问题,导致代码运行中断,需要我们不断的加等待时间来增强代码的稳定性。其次就是对于元素的获取很麻烦,appium自带的截屏工具会与脚本运行占端口,对于元素定位失败想重新获取其他元素进行定位时,还需要重新启动截屏工具。最后就是adb也不是很稳定,总是会出环境变量的一些问题。所以说,就效率而言,移动端进行自动化,还使用Java语言,应该考虑好是否真的可行。
今天带来的是运用python语言进行appium移动端自动化测试,整体会比Java语言来的流畅,运行速度也会有所提高,如果需要自动化,运用python是一个不错的选择
一、脚本开发基本步骤
- 引入头文件
- 配置appium参数
- 启动appium
- 定位元素
- 关闭
# 引入头文件
from appium import webdriver
# 配置appium参数
desired_caps = {}
desired_caps['platformName'] = '平台'
desired_caps['platformVersion'] = '版本号'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['appPackage'] = '包名'
desired_caps["noReset"] = True
desired_caps['appActivity'] = '活动界面地址'
# 启动appium
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 定位元素
......
# 关闭
driver.quit()
二、元素定位
1. ID定位
# resourceId属性的方法
driver.find_element_by_id('resource_Id的值')
# 以accessibility_id进行定位,对Android而言,就是content-description属性
driver.find_element_by_accessibility_id('content-description的值')
2. ClassName 定位
# 定位唯一元素
driver.find_element_by_class_name("class的值")#如果有很多个,默认第一个
# 找到所有android.widget.EditText并定位第?个
driver.find_elements_by_class_name("class的值")[1]#表示第二个
3. Xpath 定位
driver.find_element_by_xpath(路径)
driver.find_elements_by_xpath(路径)[0] #是个list
4. Uiautomator 定位
#text属性的方法 知道text属性的全部信息
driver.find_element_by_android_uiautomator('new UiSelector().text("Custom View")').click()
5. 知道text属性的一部分部信息
# textContains,随便一部分
driver.find_element_by_android_uiautomator('new UiSelector().textContains("View")').click()
#textStartsWith,开头部分
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("Custom")').click()
6. #class属性的方法
#className
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").text("text值")').click()
7. #classNameMatches
driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches(".*TextView$").text("text值")').click()
8. #resourceId属性的方法
#resourceIdMatches
#com.tencent.qqlite:id/login .*表示前面的任何字母,$表示到此为止 下面的是点击登陆按键
driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".*id/login$")').click();
9. #元素的其他属性
- clickable(true)表示这个元素是否可以点击,可以用来缩小查找范围
driver.find_element_by_android_uiautomator('new UiSelector().clickable(true).text("Custom View")').click()
三、元素操控
- click() --点击
- send_keys() --输入
- clear() --清空
- driver.get_window_size()[‘width’]
driver.get_window_size()[‘height’] - driver.swipe() --滑动
四、python+appium+unittest
步骤:
- 写一个类,继承unittest.TestCase
- setUp函数中写配置appium参数和调用appium
- 测试用例函数中写登录qq的代码
- tearDown函数中写关闭app的代码
- 最后unittest.main()调用
比如:
xiaoMiCase.py
import time
import unittest
from appium import webdriver
class xiaoMiCase(unittest.TestCase):
def setUp(self):
# 配置appium参数
# 定义一个字典
des_cps = {}
# 平台
des_cps['platformName'] = 'android'
# 设备名
des_cps['deviceName'] = 'Android Emulator'
# 版本号
des_cps['platformVersion'] = '5.1.1'
# 不需要重新设置
des_cps['noReset'] = True
# 包名
des_cps['appPackage'] = 'com.xiaomi.shop'
# 活动页
des_cps['appActivity'] = 'com.xiaomi.shop2.activity.MainActivity'
# 启动aapium
self.dr = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des_cps)
def testXiaoMi(self):
time.sleep(2)
self.dr.find_element_by_android_uiautomator('new UiSelector().text("分类")').click()
time.sleep(2)
self.dr.find_element_by_android_uiautomator('new UiSelector().text("电视")').click()
time.sleep(2)
self.dr.find_element_by_android_uiautomator('new UiSelector().text("激光投影电视")').click()
time.sleep(2)
self.dr.find_element_by_android_uiautomator('new UiSelector().text("米家投影仪 青春版2")').click()
time.sleep(2)
aa = self.dr.find_element_by_id('com.xiaomi.shop2.plugin.goodsdetail:id/product_name').is_displayed()
self.assertTrue(aa)
def tearDown(self):
time.sleep(5)
self.dr.quit()
maintest.py
import unittest
from HTMLTestRunner import HTMLTestRunner
discover = unittest.defaultTestLoader.discover(r'C:\XXX\python\appium1\case',pattern='*.py')
with open(r"C:\XXX\res.html","wb") as f:
runner = HTMLTestRunner(stream=f,verbosity=-1,title='移动端自动化测试报告',description='抖音、QQ、小米移动端测试报告')
runner.run(discover)
至于自动化集成部署,请移步:自动化测试集成之Jenkins的安装与部署