持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
网页定位
前一节课我们学习了使用uiautomatorviewer.bat定位控件,可能有些同学也发现了一些问 题,有些控件出现了无法定位的情况,比如itool 游戏中的这个"继续"按钮。
这是什么原因导致的? 这是由于在app红色框部分是手机网页,uiautomatorviewer.bat并不能定位网页元素。那么 我们用什么方法可以定位到网页元素,这里介绍一个chrome自带的审查插件inspect 要使用inspect工具,第一次时需要进行翻墙(只要使用一次后,该插件就会被自动下载到 chrome中,以后就不用再翻墙了)。
inspect使用
1.在itools中打开itool 游戏
2.在已翻墙chrome中,输入chrome://inspect,然后按enter
3.检测到已打开的手机软件
4.点击上图的inspect,出现下图的html脚本
5.点击图示位置按钮
6.出现itool 游戏中的网页界面
7.点击放大镜图标,再选择要检查控件"继续"
8.移出html,就可以看到已经查看到了该元素的所有属性。
到了这里大家是不是有熟悉的感觉,又回到了我们学习过的webdriver中了。
定位网页元素的方法
我们以点击,下图的按钮为例
1. #coding=utf-8
2. from appium import webdriver
3. import time
4.
5. desired_caps = {}
6. desired_caps['platformName'] = 'Android'
7. desired_caps['platformVersion'] = '4.4.2'
8. desired_caps['deviceName'] = 'Android Emulator'
9. desired_caps['appPackage'] = 'cn.itools.avdmarket'
10. desired_caps['appActivity'] = '.ui.activity.HostActivity'
11. driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps )
12.
13. time.sleep(3)
14. #获取当前窗口页面组成,并打印cn.itools.avdmarket
15. print driver.contexts
运行结果:
1. H:\Python27\python.exe H:/pyfile/test1.py
2. [u'NATIVE_APP', u'WEBVIEW_cn.itools.avdmarket']
3.
4. Process finished with exit code 0
NATIVE_APP 代表本地UI界面
WEBVIEW_cn.itools.avdmarket 就是我们要找的网页界面
2.转到网页界面,并点击按钮
2. from appium import webdriver
3. import time
4.
5. desired_caps = {}
6. desired_caps['platformName'] = 'Android'
7. desired_caps['platformVersion'] = '4.4.2'
8. desired_caps['deviceName'] = 'Android Emulator'
9. desired_caps['appPackage'] = 'cn.itools.avdmarket'
10. desired_caps['appActivity'] = '.ui.activity.HostActivity'
11. driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps )
12.
13. time.sleep(3)
14. #转到网页界面
15. driver.switch_to.context("WEBVIEW_cn.itools.avdmarket")
16. #获取所有classname为"install"的元素地址
17. elements=driver.find_elements_by_class_name("install")
18. #遍历元素地址
19. for x in elements:
20. #判断属性resname的值
21. if x.get_attribute("resname")==u"山口山战记":
22. x.click()
driver.switch_to.context("WEBVIEW_cn.itools.avdmarket") 这是appium转页面控制的 函数,可以从本地APP界面转到网页界面,也可以从网页界面转到本地APP界面。参数就是我 们前面 print driver.contexts 获取到的值。
定位元素
常用的4种元素定位方法:
-
driver.find_element_by_id(id) id 对应uiautomatorviewer.bat中的名字是resource-id
-
driver.find_element_by_name(name) name 对应uiautomatorviewer.bat中的名字是text
-
driver.find_element_by_class_name(class) class_name 对应uiautomatorviewer.bat中的名字是class
-
driver.find_element_by_xpath(xpath)
前3中方法的使用和在webdriver一模一样,就不再重复介绍了。 基本上正常工作过程中,都是用前3种方法,当实在无法定位时,可以使用xpath定位。
xpath定位
我们以定位itool 游戏中的游戏按钮为例子
1. #coding=utf-8
2. from appium import webdriver
3. import time
4.
5. desired_caps = {}
6. desired_caps['platformName'] = 'Android'
7. desired_caps['platformVersion'] = '4.4.2'
8. desired_caps['deviceName'] = 'Android Emulator'
9. desired_caps['appPackage'] = 'cn.itools.avdmarket'
10. desired_caps['appActivity'] = '.ui.activity.HostActivity'
11. driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps )
12. time.sleep(3)
13. driver.find_element_by_xpath("//android.widget.TextView[@text='游戏']") .click()
14. time.sleep(3)
这里是用的相对路径的方法
android.widget.TextView 定位到android.widget中的TextView控件 [@text='游戏'] 由于TextView可能不止1个,我们再做个判断,text='游戏' 大家在这里也就看出来了,既然我们需要做属性判断,那么我们为什么不直接就用属性定位。 这也是xpath定位用得少的原因。