• appium 控件定位


    转自:http://www.2cto.com/kf/201410/340345.html

    AppiumDriver的各种findElement方法的尝试,尝试的目标应用是SDK自带的Notepad应用。

    1. findElementByName

    1.1 示例

    1
    2
    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。<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eK49re9t6jU2kFwcGl1bTEuMNauuvPG5Mq10tG+rbn9yrG2+NKqsbtmaW5kRWxlbWVudEJ5QWNjZXNzaWJpbGl0eUlkyKG0+rXDwcujrLK71qq1wM6qyrLDtLu5xNy199PDo6yyws/rysdBcHBpdW3NxbbTz+uxo8H00ru2qLXEvObI3dDU0tTGvbusuf22yLDJoaPH67Lpv7Sjumh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vYWR2YW5jZWQtY29uY2VwdHMvbWlncmF0aW5nLXRvLTEtMC5tZDwvcD4KPGgxPjIuIGZpbmRFbGVtZW50QnlBbmRyb2lkVUlBdXRvbWF0b3I8L2gxPgo8aDI+Mi4xIMq+wP08L2gyPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;"> 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 示例

    1
    2
    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 示例

    1
    2
    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 示例

    1
    2
    el = driver.findElementByAccessibilityId("menu_add_note_description");
    assertThat(el.getText(),equalTo("node"));

    5.2 如何获得AccessibilityId

    可以通过UIAutomatorViewer或者Appium Inspector获得

    5.3 注释

    Accessibility ID在Android上面就等同于contentDescription,这个属性是方便一些生理功能有缺陷的人使用应用程序的。比如我们有一个ImageView里面放置一张颜色复杂的图片,可能一些色弱色盲的人,分不清这张图片中画的是什么东西。如果用户安装了辅助浏览工具比如TalkBack,TalkBack就会大声朗读出用户目前正在浏览的内容。TextView控件TalkBack可以直接读出里面的内容,但是ImageView TalkBack就只能去读contentDescription的值,告诉用户这个图片到底是什么。
    鉴于这是一个隐藏属性,而Android上用于查找控件的各种属性可能有所缺失或者有重复(比如id重复,比如一个list下面的所有项可能都是叫做“id/text1”),所以最佳的办法就是跟开发团队沟通好每个view都赋予一个唯一的contentDescription。

    6. findElementByCssSelector

    TBD, 这个方法应该是针对WebView容器下面的控件定位的,因为现在针对的是Native App暂时还没有用到,所以先标记下,今后需要的时候加上去。

    7. findElementByLinkText

    TBD, 这个方法应该是针对WebView容器下面的控件定位的,因为现在这很对的是Native App暂时还没有用到,所以先标记下,今后需要的时候加上去。

    8. findElementByPartialLinkText

    TBD, 这个方法应该是针对WebView容器下面的控件定位的,因为现在这很对的是Native App暂时还没有用到,所以先标记下,今后需要的时候加上去。

    9.findElementByTagName

    这个方法Appium1.0以后已经过时并被以上的findElementByClassName取代了,请查看https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/migrating-to-1-0.md

    10.findEelementByXPath

    10.1 示例

    1
    2
    3
    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参考

    据说不是很稳定:https://github.com/appium/appium/issues/3371 bootstraponline commented on 13 Aug

    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

    最后介绍AppiumDriver的getPageSource函数,可以把当前页面的元素以XML的方式打印出来,建议大家在找不到view的相应属性的时候就调用该函数来慢慢查找了^_^

  • 相关阅读:
    vue打包编译报错,These dependencies were not found:core-js/modules/es
    JS 新语法「可选链」「双问号」已进入 Stage 3
    vue 本地和线上跨域的问题 个人解决方案
    vue-router懒加载或者按需加载
    brew 切换国内的源
    vue 数组、对象 深度拷贝和赋值
    全局axios默认值 和 自定义实例默认值
    npm install 报node-sass错误
    linux端口探测
    linux批量操作(一)
  • 原文地址:https://www.cnblogs.com/melody-emma/p/4682189.html
Copyright © 2020-2023  润新知