目录
一、UIAutomatorViewer的使用
1.存放位置
- 在安卓SDK的tools的bin文件目录下,有个uiautomatorviewer.bat
2.作用
- 可以使用该工具获取元素特征信息
3.使用场景
a.电脑连接真机或者打开模拟器
b.启动要测试的APP
c.然后去tools的bin文件目录下,打开uiautomatorviewer.bat,打开后,界面如下(会自动打开一个命令行窗口,该命令行窗口不能关闭,关闭之后,整个工具其实也是被关闭了):
4.点击Device Screenshot按钮,可获取到当前测试的APP界面,如图二(可以看到QQ的坐标轴位置以及它的text、id和class属性等,可以用于定位)
5.注意事项
a.点击Device Screenshot按钮,可能会报错,界面会提示:“Unable to connect adb. Check if adb is installed correctly.”,但是此时你又有连接设备。
解决方案:可以打开命令行输入 adb kill-server ,然后再输入adb start-server
b.打开这个工具的时候会自动打开一个命令行窗口,该命令行窗口不能关闭,关闭之后,整个工具其实也是被关闭了
二、UIAutomatorVirwer定位元素方法
1.定位一个元素:常用的定位方法有三种,通过id、class、xpath定位
a.通过id定位:参数为resource-id
driver.find_element_by_id("resource-id")
b.通过class定位:参数为class
driver.find_element_by_class_name("class")
c.通过xpath定位:xpath的表达式(有两种方式)
driver.find_element_by_xpath("//*[@content-desc='xxx']").click()
driver.find_element_by_xpath("//*[@text='xxx']").click()
下图截图为通过UIAutomatorVirwer定位某元素,其中包含resource-id、class和xpath参数
注意:如果有多个元素属性一致,那么使用使用find_element_by_id/xpath/class方法找到的是第一个
2.定位一组元素:一组元素和一个元素的区别就在于多和少,那就是英语上常用的s,如下代码
#通过id定位
driver.find_elements_by_id("resource-id")
#通过class定位
driver.find_elements_by_class_name("class")
#通过xpath定位方式1
driver.find_elements_by_xpath("//*[@content-desc='xxx']").click()
#通过xpath定位方式2
driver.find_elements_by_xpath("//*[@text='xxx']").click()
三、元素等待
1.作用:当我们在查找元素的时候,这个时候元素可能还没有出来,所以无法定位到,此时可以添加一个元素等待
2.分类:分为显式等待和隐式等待
a.显式等待:通过WebDriverWait 对象中的until的方法,设置之后,会有一个超时时间等待,在这个超时时间内每0.5s去查找一次,这个0.5是可以自己设置的。如果没有找到元素,则报错:TimeOutException,如果找到了,则执行下一步操作
b.隐式等待:通过driver调用implicitly_wait()方法,括号里面为超时时间,如果设置了超时时间,超过这个时间,所有的定位元素的方法都会在这个时间内等待元素的出现。假设没有出现匹配元素,则报错:NoSuchElementException,如果出现了,则执行下一步动作。
3.隐式等待和显式等待的区别
a.隐式等待是针对全局的,但更简单
b.显式等待可以针对每个元素进行单独设置
四、元素滑动和拖拽
1.元素滑动
a.swipe:参数是坐标点
driver.swipe(x1, y1, x2, y2, t)
b.scroll:参数是元素
driver.scroll(起始元素,结束元素)
2.元素拖拽
a.drag_and_drop:参数是元素,将结束元素的位置拖动至起始位置
driver.drag_and_drop(起始元素,结束元素)
3.TouchAction
a.将每个小步骤组合成一组动作
b.几个常用方法
#轻敲
tap()
#抬起
release()
#按下
press()
#等待
wait()
#长按
longpress()
#移动
move_to()
几个动作组合在一起,按下某个控件后松开,然后使perform方法执行
TouchAction(driver).press(x,y).release().perform()
欢迎大家补充~