Appium基于安卓的各种FindElement的控件定位方法实践和建议
AppiumDriver的各种findElement方法的尝试,尝试的目标应用是SDK自带的Notepad应用。
1. findElementByName
1.1 示例
- el = driver.findElementByName("Add note");
- assertThat(el.getText(),equalTo("Add note"));
1.2 如何获得Name
安卓设备没有找到适合的方法,尝试用Appium Inspector,但是使用了当前最新的“AppiumForWindows-1.2.3.1”没有看到这个属性,且Inspector在Windows下面非常的不稳定,很容易crash。真心期望Appium团队尽快解决这个问题
iOS设备倒可以用Appium Inspector获得(以下图片来自网上)
1.3 建议
个人建议可以尝试先用view显示的文本作为name看是否能拿到该控件,按照我个人的经验一般都是会成功的,所以我很怀疑安卓上面控件的name是否就等于text。如果确实还是不行的话就只好放弃用name了。或者等待Appium后来的稳定的inspector发布后看是否可以获得控件的name。
这个方法在Appium1.0之后其实已经过时而要被findElementByAccessibilityId取代得了,不知道为什么还能调用,猜想是Appium团队想保留一定的兼容性以平滑过度吧。请查看:https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/migrating-to-1-0.md
2. findElementByAndroidUIAutomator
2.1 示例
- el = driver.findElementByAndroidUIAutomator("new UiSelector().text("Add note")");
- assertThat(el.getText(),equalTo("Add note"));
2.2 如何获得UIAutomator参数
UIAutomator获取控件的方式多种多样,都是通过UiSelector对象来去查找,比如使用view的text文本去当前窗口查找控件,这里不做累述,往后会另起一篇文章来描述UIAUtomator获取控件的方式,到时直接套用进来就可以了。
3. findElementByClassName
3.1 示例
- el = driver.findElementByClassName("android.widget.TextView");
- assertThat(el.getText(),equalTo("Add note"));
3.2 如何获得控件的ClassName
可以使用UIAutomatorViewer工具直接查看
3.3 建议
使用ClassName一般获得的view都不止一个,所以应该需要遍历一遍得到的views,然后缩写搜索条件来获得目标控件。示例中因为只有一个textview控件在窗口上面,所以不需要遍历。
4. findElementById
4.1 示例
- el = driver.findElementById("android:id/title");
- assertThat(el.getText(),equalTo("Add note"));
4.2 如何获得Resource Id
可以通过UIAutomatorViewer获得
4.3 建议
如果目标设备的API Level低于18则UIAutomatorViewer不能获得对应的Resource ID,只有等于大于18的时候才能使用。
5. findElementByAccessibilityId
5.1 示例
- el = driver.findElementByAccessibilityId("menu_add_note_description");
- assertThat(el.getText(),equalTo("node"));
5.2 如何获得AccessibilityId
5.3 注释
6. findElementByCssSelector
7. findElementByLinkText
8. findElementByPartialLinkText
9.findElementByTagName
10.findEelementByXPath
10.1 示例
- el = driver.findElementByXPath("//android.widget.TextView[contains(@text,'Add note')]");
- //el = driver.findElement(By.xpath("//android.widget.TextView"));
- assertThat(el.getText(),equalTo("Add note"));
10.2 XPath格式变化
从老版本的Appium0.18.x升级到现在的Appium1.x后,注意class name和xpath策略的变化:你现在需要使用FQCN来描述你的控件。也就是说原来的:
findElementByXpath(""//TextView[contains(@text,'Add note')]"")
需要改成
findElementByXpath("//android.widget.TextView[contains(@text,'Add note')]")
详细变动请查看《Appium0.18.x迁移到Appium1.x须知事项》
10.3参考
sometimes uiautomator fails to create the dump.xml. A client side retry may help. I don't think there's much we can do about the problem until Google fixes uiautomator.
11. 终极方法:AppiumDriver getPageSource
--------------------------------------------------------------------------------
关注微信公众号(测试工程师小站)即可在手机上查阅,并可接收更多测试分享,发送【测试资料】更可获取百G测试教程~