重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
今天就跟大家聊聊有关appium的元素定位是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
我们提供的服务有:成都网站制作、成都做网站、微信公众号开发、网站优化、网站认证、库车ssl等。为数千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的库车网站制作公司
下面从工具介绍以及定位策略来简单介绍下如何去对一个元素进行定位.
常用工具介绍
工具 支持平台 说明
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的元素定位是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。