温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

appium的元素定位是什么

发布时间:2021-10-19 17:15:13 来源:亿速云 阅读:190 作者:柒染 栏目:大数据

今天就跟大家聊聊有关appium的元素定位是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

下面从工具介绍以及定位策略来简单介绍下如何去对一个元素进行定位.

常用工具介绍
工具    支持平台    说明
appium-inspector    android,iOS native    官方appium-desktop安装包自带, 命令行安装没有该工具
app-inspector    android,iOS native    阿里开源的macaca框架带的工具, 可以单独安装:
npm install -g app-inspector
UIAutomatorviewer    android native    android sdk自带工具软件
Chrome Inspect    android,iOS webview    android webview可以直接使用, iOS webview需要安装ios-webkit-debug-proxy, 
并且以ios_webkit_debug_proxy -f chrome-devtools://devtools/bundled/inspector.html 启动使用;
常用定位策略
通用定位策略(适用于全平台):
findElement(s)ByName;
findElementById;
findElement(s)ByClassName
findElement(s)ByXPath
以上4种是非常基础的定位策略,不多做介绍, 其中XPath的定位方式稍微复杂, 读者可以熟悉下xpath的语法, 会有很大帮助;

Android独有定位策略:
findElement(s)ByAndroidUIAutomator 
该定位方式其实就是通过UIautomator框架的UISelector定位方式转化为来, 如果对UISelector比较熟悉, 这个理解起来就很简单了;
介绍几种简单的UISelector定位方式, new UiSelector.resourceId(), new UISelector.text, new UISelector.className()
e.g:
driver.findElementByAndroidUIAutomator("new UiSelector().className(\"android.widget.ImageView\").clickable(true)");
driver.findElementByAndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().textContains(\"测试\"))");
1
2
iOS独有定位策略:
findElement(s)ByIosUIAutomation, 仅在使用UIAutomation框架下有效
findElement(s)ByIosNsPredicate, 仅在使用XCUItest框架下有效, 是原生支持的定位策略 
通过元素的一种属性或者多重属性进行定位, 元素的属性包括type, value, name, label, enabled, visible;
元素定位的基本格式为: 属性+运算符+值形式
运算符有比较运算符>,<,==,>=,<=,!=, 范围运算符IN,BETWEEN, 字符串运算符CONTAINS、BEGINSWITH、ENDSWITH, 也可以是使用通配运算符LIKE
e.g:
driver.findElementByIosNsPredicate("type == XCUIElementTypeStaticText AND label CONTAINS '测试' AND enabled == true")
1
webview独有定位策略
findElement(s)ByCssSelector
高级用法
级联调用
级联调用很好理解, 比如要通过A节点来查找A节点的子节点B, 即driver.findElementsByClassName(“a”).findElementByXpath(“b”);

pagefactory初始化元素
一般在做UI自动化项目的时候肯定会分层封装, 将页面封装成一个个页面对象, 然后在业务处理代码中直接调用页面对象的方法, appium提供了Page Object design pattern.如下:

    @FindBy(id = "list")
    @AndroidFindBy(xpath = "//android.widget.ListView")
    @iOSXCUITFindBy(iOSNsPredicate = "type=='XCUIElementTypeScrollView'")
    MobileElement loanList;
1
2
3
4
以上代码定义了一个MobileElement loanList 元素, 
1. 如果在webview下就是用driver.findElementByid("list")寻找该元素, 
2. 如果在android native下则使用driver.findElementByXpath("//android.widget.ListView")寻找该元素, 
3. 如果在ios native下则使用driver.findElementByiOSNsPredicate("type=='XCUIElementTypeScrollView'")

短短4行代码就解决了跨平台寻找元素的问题, 甚至可以为该元素添加一个@WithTimeout注解, 为该元素设置一个implicit time, 解决元素加载慢导致的NosuchElementException;

编写好了元素定位的策略之后, 就需要初始化该页面元素对象, appium提供了多种元素初始化的方法, 例如:

PageFactory.initElements(new AppiumFieldDecorator(driver, 1000, TimeUnit.MILLISECONDS), this);
1
使用该方法即可初始化刚才的元素定位代码, 然后就可以直接操作元素loanList而无需额外其他操作;

这样一来代码非常简洁清晰, 后期就算元素变化频繁, 也只需要修改元素定位策略的3行代码, 提高了代码的可维护性, 减少了维护成本;
   

看完上述内容,你们对appium的元素定位是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI