通过方式android_sdk.tools中的uiautomatorviewer.bat进行元素定位:
(1)双击uiautomatorviewer.bat
会出现UI Automator Viewer窗口,打开手机应用(如:360手机助手),
点击左上角图标会出现以下界面,手机会上传实时界面给UI Automator Viewer。
关注两个字段:resource-id,class这两个字段。(如:我点击了“跳过”,就会有对应字段信息出现)
(2)假定我们的业务流程是,点击“下载”,进入下载管理界面。
流程分析:需要先找到“下载”的位置坐标,即唯一id;然后进行点击操作。
id我们在(1)中已经可以获取到,id = download_content_img
那么代码如下:
element1=driver.find_element_by_id(‘download_content_img’)
element1.click()
注意点:
(1)首先我们要确定业务流程,我们要保证所要获取的id在当前界面且id为唯一id
(2)find_elements_by_id注意“s”
(3)如果不是唯一id,需要这样:
存在多个id的情况时,可以运用集合的概念,python中不能对一个集合或者列表做输出或者点击,从业务流程的角度确定“下载”是第几次操作,可以看出我们的上述业务中的“下载”是第一次操作,因此角标计作0
els=driver.find_elements_by_id('download_content_img')
els[0].click()
(4)find_element_by_id和find_elements_by_id差别
find_elements_by_id()和find_elements_by_class_name(),通过这种方式找出来的元素肯定是多个的,但是python中不能对list列表或者集合做输出或者点击操作,因此需要使用到角标,角标从0开始(第一个元素id)。
如:
els=driver.find_elements_by_id('skip_view')
els[0].click()
find_element_by_id只能获取到唯一id。
(5)driver.implicitly_wait(10)和time.sleep(10)差别
driver.implicitly_wait(10) 智能等待,程序等待10秒钟,直到找到这个id才停止或者超过10秒超时强制停止;然后继续执行后续代码。
time.sleep(10)非智能的等待,程序等待10秒,超时才继续执行后续代码。
(6)如何以一个编程的思维去找到正确的id,找到元素id仅仅是一个步骤而已,如何去优化这个步骤:
例如:
给定需求,点击“下载”按钮,进入下载界面,再点击“换一换”,更换应用。
常规代码如下,但是可能无法实现想要实现的需求,可能无法顺利执行:
els1=driver.find_element_by_id(‘download_content_img’)
els1.click()
els2=driver.find_element_by_id(‘group_header_rght’)
els2.click()
原因
a、“换一换”这个元素id可能不会那么顺利的被找到
b、如果两个元素的id都在同一个界面,就会出现问题
更改代码如下:
els1=driver.find_element_by_id(‘download_content_img’)
els1.click()
while:
if driver.current_activity ==‘com.qihoo.appstore.home.LauncherActivity’:
break
els2=driver.find_element_by_id(‘group_header_rght’)
els2.click()