appium(二)

210 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

网页定位

前一节课我们学习了使用uiautomatorviewer.bat定位控件,可能有些同学也发现了一些问 题,有些控件出现了无法定位的情况,比如itool 游戏中的这个"继续"按钮。

image.png 这是什么原因导致的? 这是由于在app红色框部分是手机网页,uiautomatorviewer.bat并不能定位网页元素。那么 我们用什么方法可以定位到网页元素,这里介绍一个chrome自带的审查插件inspect 要使用inspect工具,第一次时需要进行翻墙(只要使用一次后,该插件就会被自动下载到 chrome中,以后就不用再翻墙了)。

inspect使用

1.在itools中打开itool 游戏

image.png 2.在已翻墙chrome中,输入chrome://inspect,然后按enter

3.检测到已打开的手机软件

image.png 4.点击上图的inspect,出现下图的html脚本

image.png 5.点击图示位置按钮

image.png 6.出现itool 游戏中的网页界面

image.png 7.点击放大镜图标,再选择要检查控件"继续"

image.png 8.移出html,就可以看到已经查看到了该元素的所有属性。

image.png 到了这里大家是不是有熟悉的感觉,又回到了我们学习过的webdriver中了。

定位网页元素的方法

我们以点击,下图的按钮为例

image.png

    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种元素定位方法:

image.png

  1. driver.find_element_by_id(id) id 对应uiautomatorviewer.bat中的名字是resource-id

  2. driver.find_element_by_name(name) name 对应uiautomatorviewer.bat中的名字是text

  3. driver.find_element_by_class_name(class) class_name 对应uiautomatorviewer.bat中的名字是class

  4. driver.find_element_by_xpath(xpath)

前3中方法的使用和在webdriver一模一样,就不再重复介绍了。 基本上正常工作过程中,都是用前3种方法,当实在无法定位时,可以使用xpath定位。

xpath定位

我们以定位itool 游戏中的游戏按钮为例子

image.png

    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定位用得少的原因。