appium桌面版本以及一些自动化测试方方封装

少年乘勇气,百战过乌孙。这篇文章主要讲述appium桌面版本以及一些自动化测试方方封装相关的知识,希望能为你提供帮助。
appium_desktop标签(空格分隔): appium_desktop
一 appium_desktop_v1.2.6
1.appium_desktop在github上最新下载地址:appium桌面版本地址

appium桌面版本以及一些自动化测试方方封装

文章图片

2.一路傻瓜式安装就好了:
appium桌面版本以及一些自动化测试方方封装

文章图片

3.然后点击搜索按钮(右上角)
三 inspector
1.元素定位探测器,在Desired Capabilitis下表格输入参数配置信息:
" platformName" : " android" , " deviceName" : " 8681-M02-0x253b1876" , " platformVersion" : " 5.1" , " appPackage" : " com.zhan.toefltom" , " appActivity" : " com.zhan.toefltom.SplashActivity" , " app" : " F:\特殊处理包H5\toefl_V2.1.0_071610_release.apk"

appium桌面版本以及一些自动化测试方方封装

文章图片

2.参数配置好之后可以保存下,连接手机,再点Start Session按钮就能定位元素了
appium桌面版本以及一些自动化测试方方封装

文章图片

3.用上图导航栏的箭头按钮,定位左边app的元素属性
四 弹出框的坑
1.这里有个坑,这种弹出框的元素无法定位到,需要用UI Automator Viewer这个工具才能定位到
appium桌面版本以及一些自动化测试方方封装

文章图片

五 对比分析
inspector优点
appium自带的inspector可以查看xpath路径,对比xpath不熟悉的同学可以很好的帮助
inspector缺点
1.有些弹出框的元素无法定位到
2.过分依赖工具匹配出来的xpath会让你变懒,形成对工具的依赖
总结:xpath实际上是定位的下下策,能不用尽量不用,另外不要一直复制xpath粘贴,那对你定位一点帮助也没有,想用xpath的同学,多学习语法,自己去写!
六:如果定位的过程你使用了全部的招数都无法定位到元素:
so:那就要使用坐标定位了
七:定位坐标
appium桌面版本以及一些自动化测试方方封装

文章图片

如图我们可以看到对应的坐标的属性
 android特有的wait_activity属性
在启动app的时候,如果直接做下一步点击操作,经常会报错,于是我们会在启动完成的时候加sleep。
那么问题来了,这个sleep时间到底设置多少合适呢?设置长了,就浪费时间,设置短了,就会找不到元素报错了,这个时候我们可以用wait_activity的语法,等到你想点击的页面activity出现了,再点击,可以有效的节省时间。
  • wait_activity(self, activity, timeout, interval=1):
    等待指定的activity出现直到超时,interval为扫描间隔1秒
    即每隔几秒获取一次当前的activity, android特有的
    返回的True 或 False
    activity - 需等待的目标 activity
    • timeout - 最大超时时间,单位是s
    • interval - 循环查询时间
      用法:driver.wait_activity(‘.activity.xxx’,5,2)
  • 二、获取current_activity
    1.打开app后,先sleep10秒,等app完全启动完成进入主页面,然后获取当前界面的activity
from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait import time from time import sleep import datetimedesired_caps = { " platformName" : " Android" , " deviceName" : " 8681-M02-0x253b1876" , " platformVersion" : " 5.1" , " appPackage" : " com.zhan.toefltom" , " appActivity" : " com.zhan.toefltom.SplashActivity" } driver = webdriver.Remote(" http://127.0.0.1:4723/wd/hub" , desired_caps) ac =driver.current_activity print(ac)

等待activity
1.用sleep太浪费时间了,并且不知道什么时候能启动完成,所以尽量不用sleep
2.上一步已经获取当主页面的activity了,那就可以用wait_activity等它出现了,再做下一步的点击操作
 新版本的appium不支持name定位了:
  • 一、 name定位报错
    1.最新版appium V1.7用name定位,报错:
    selenium.common.exceptions.InvalidSelectorException: Message: Locator Strategy ‘name‘ is not supported for this session
    2.这个报错是说name这个定位方法目前已经不支持了,因为appium从1.5版本开始就已经抛弃了name这种定位方法了。
  • 二、 xpath定位
    1.既然name定位抛弃了,那就说明有更先进的定位代替了它,事实上xpath定位里面已经包含了name这种定位方法。
  • 2.平常用过selenium,在定位页面上文本的时候,应该知道这个xpath语法:
//*[text()=' 页面text文本' ]

appium里面的xpath语法跟selenium有一点点区别:
//*[@text=' 页面text文本' ]

  • 三、 text属性
    1.上面的xpath语法适合页面上这个text属性是唯一的,才好直接定位到,那么问题来了:如果页面上有多个text属性的文本一样,怎么办?
    2.xpath语法里面*是代表匹配任意的值,在selenium里面*是匹配任意标签,appium里的*是匹配任意class名称,如果几个文本的class属性不一样,就可以通过以下组合:
//android.widget.TextView[@text=' 小说' ]

appium桌面版本以及一些自动化测试方方封装

文章图片

 toast提示消息判断
  • 1.查看appium v1.7版本官方文档
    2.目前1.7的android版可以支持:Espresso、UiAutomator2、UiAutomator、Selendroid四种驱动模式
    UiAutomator2是目前最稳的。
  • 二、toast定位
    1.先看下toast长什么样,如下图,像这种弹出来的消息" 再按一次退出" ,这种就是toast了。
appium桌面版本以及一些自动化测试方方封装

文章图片

2.想要定位toast提示:
需要:
from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep desired_caps = { ' platformName' : ' Android' , ' deviceName' : ' ***' , ' platformVersion' : ' 4.4.2' , ' appPackage' : ' *****' , ' appActivity' : ' ****' , ' noReset' : ' true' , ' automationName' : ' Uiautomator2' } driver = webdriver.Remote(' http://127.0.0.1:4723/wd/hub' , desired_caps) # 等主页面activity出现 driver.wait_activity(" .****" , 10) driver.back()# 点返回 # 定位toast元素 toast_loc = (" xpath" , " .//*[contains(@text,' 再按一次退出' )]" ) t = WebDriverWait(driver, 10, 0.1).until(EC.presence_of_element_located(toast_loc)) print t

上述:***自行测试中填写自己的内容
3.打印出来的结果,出现如下信息,说明定位到toast了
< appium.webdriver.webelement.WebElement (session=" 02813cce-9aaf-4754-a532-07ef7aebeb88" , element=" 339f72c4-d2e0-4d98-8db0-69be741a3d1b" )>
封装toast判断:
1.有时候我们需要单独封装一个方法来判断toast是否存在,存在返回True,不存在返回False
3.打印出来的结果,出现如下信息,说明定位到toast了
def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5): # driver - 传driver #text- 页面上看到的文本内容 #timeout - 最大超时时间,默认30s #poll_frequency- 间隔查询时间,默认0.5s查询一次 try: toast_loc = (" xpath" , " .//*[contains(@text,' %s' )]" %text) WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(toast_loc)) return True except: return False if __name__ == " __main__" : driver = webdriver.Remote(' http://127.0.0.1:4723/wd/hub' , desired_caps) # 等主页面activity出现 driver.wait_activity(" .base.ui.MainActivity" , 10) driver.back()# 点返回 # 判断是否存在toast-' 再按一次退出' print is_toast_exist(driver, " 再按一次退出" )

 list定位:
当你定位元素的时候发现页面元素不唯一的时候,怎么办,这时候我们可以通过find_elements等list的取值来获取自己想要的元素,然后进行操作;
find_element有13种定位
appium桌面版本以及一些自动化测试方方封装

文章图片

find_elements也有13种
appium桌面版本以及一些自动化测试方方封装

文章图片

driver.find_elements_by_id(" ***" )[0].click()

android_uiautomator
  • appium的前身就是封装android的uiautomator这个框架来的,所以uiautomator的一些定位方法也可以用;
    text
    1.通过text文本定位语法
    new UiSelector().text(" text文本" )
    2.文本比较长的时候,可以用textContains模糊匹配,只要文本包含匹配内容就可以了。
    new UiSelector().textContains(" 包含text文本" )
    3.textStartsWith是以某个文本开头的匹配
    new UiSelector().textStartsWith(" 以text文本开头" )
    4.正则匹配textMatches,这个需要配合正则表达式,就不举例了。
    new UiSelector().textMatches(" 正则表达式" )
#等主页面activity出现 driver.wait_activity(" .base.ui.MainActivity" , 10) loc_text = ' new UiSelector().text(" 图书" )' #text内容 driver.find_element_by_android_uiautomator(loc_text).click() loc_textContains = ' new UiSelector().textContains(" 图" )' #textContains driver.find_element_by_android_uiautomator(loc_textContains).click() loc_textStart = ' new UiSelector().textStartsWith(" 图" )' #textStartsWith driver.find_element_by_android_uiautomator(loc_textStart).click()

className
1.页面上的class属性一般不唯一,多半用在复数定位时候。比如通过class属性定位‘排行‘这个按钮下标就是2。
new UiSelector().className(" className" )
2.className复数定位loc_class = ‘new UiSelector().className(" android.widget.TextView" )‘driver.find_elements_by_android_uiautomator(loc_class)2.click()
3.escription
1.由于这个app的contenet-des属性都是空的,就不用代码演示了,跟上面方法一样。
new UiSelector().description(" contenet-des属性" )
 android_uiautomator定位进阶
上一篇介绍uiautomator的定位方式都是类似这种‘new UiSelector().xxx(" xxx" )‘,看起非常长,我也记不住,怎样去除呢?
一、组合定位
1.一般组合用id,class,text这三个属性会比较好一点,其次description这个属性也可以一起两两组合
2.id与text属性组合
2.id与text属性组合
# id+text id_text = ' resourceId(" com.baidu.yuedu:id/webbooktitle" ).text(" 小说" )' driver.find_element_by_android_uiautomator(id_text).click()

3.class与text属性组合
sleep(2) #class+text class_text = ' className(" android.widget.TextView" ).text(" 图书" )' driver.find_element_by_android_uiautomator(class_text).click()

4.其它更多组合,id,class也可以与其它的index,checkable,clickable,password等这些不常用的属性组合
二、 父子定位childSelector
1.有时候不能直接定位某个元素,但是它的父元素很好定位,这时候就先定位父元素,通过父元素找儿子。
#父子关系childSelector son = ' resourceId(" com.baidu.yuedu:id/rl_tabs" ).childSelector(text(" 小说" ))' driver.find_element_by_android_uiautomator(son).click()

appium桌面版本以及一些自动化测试方方封装

文章图片

三、兄弟定位:
# 兄弟关系fromParent brother = ' resourceId(" com.baidu.yuedu:id/lefttitle" ).fromParent(text(" 图书" ))' driver.find_element_by_android_uiautomator(brother).click()

appium桌面版本以及一些自动化测试方方封装

文章图片

长按操作:
长按long_press
1.长按的操作可以用前面讲到的TouchAction类里面的long_press方法操作
def long_press(self, el=None, x=None, y=None, duration=1000): ? ? ? ? 长按操作,可以传定位的元素对象,也可以传坐标 ? ? ? ? el 是定位元素的对象 ? ? ? ? x,y是传坐标 ? ? ? ? duration是按住的持续时间,默认1000,单位是毫秒??

【appium桌面版本以及一些自动化测试方方封装】2.实现方法
TouchAction(driver).long_press(el).perform()#长按

el = driver.find_elements_by_id(" com.tencent.mm:id/apv" )[0] # 长按 TouchAction(driver).long_press(el).perform() time.sleep(3)


    推荐阅读