java-appium-527进阶-1 UiAutomator12区别和封装

1.UiAutomator和UiAtumator2的区别:

1.1 UiAutomator1有关于id定位的策略

UiAutomator1 id定位在resourceid匹配失败时,会匹配contentDesc。
安卓会根据id进行3种情况的判断:

  • 1.resourceId 如user_profile_icon
  • 2.accessibility id
  • 3.Strings.xml 研发所写的resource id,包含包名,如com.xueqiu.android:id/user_profile_icon。如果传入的text是resource Id将只使用resource id选择器

1418970-20181022112338792-1099802249.jpg

更多信息在appium/appium-android-bootstrap分支,详见https://github.com/appium-boneyard/appium-android-bootstrap/blob/master/bootstrap/src/io/appium/android/bootstrap/handler/Find.java。

1.2 UiAutomator2定位策略

UiAutomator2中id定位只匹配resourceId

if (by instanceof ById) {String locator = rewriteIdLocator((ById) by);return CustomUiDevice.getInstance().findObject(android.support.test.uiautomator.By.res(locator));} else if (by instanceof By.ByAccessibilityId) {return CustomUiDevice.getInstance().findObject(android.support.test.uiautomator.By.desc(by.getElementLocator()));} else if (by instanceof ByClass) {return CustomUiDevice.getInstance().findObject(android.support.test.uiautomator.By.clazz(by.getElementLocator()));} else if (by instanceof By.ByXPath) {final NodeInfoList matchedNodes = getXPathNodeMatch(by.getElementLocator(), null);if (matchedNodes.size() == 0) {throw new ElementNotFoundException();}return CustomUiDevice.getInstance().findObject(matchedNodes);} else if (by instanceof By.ByAndroidUiAutomator) {UiSelector selector = toSelector(by.getElementLocator());if (selector == null) {throw new UiSelectorSyntaxException(by.getElementLocator(), "");}return CustomUiDevice.getInstance().findObject(selector);
}

详见:https://github.com/appium/appium-uiautomator2-server/blob/master/app/src/main/java/io/appium/uiautomator2/handler/FindElement.java

2. 查找控件方法的简单封装

在UiAutomator1中,id定位会去匹配contentDesc,此处只考虑xpath, id, contentDesc。
传入String,辅以正则表达式,如果匹配Xpath,就用xpath定位;如果匹配id,就用id定位

    public WebElement locate(String locate){if (locate.matches("\\/\\/.*")){return  driver.findElementByXPath(locate);}else{return driver.findElementById(locate);}}

3. id和xpath定位的区别

1418970-20181005105605232-1748706704.png
使用id,contentDesc,class定位都是使用uiatumator自带的方法,使用xpath定位需要先获取节点信息,再对节点信息做检索
同一个元素:id: "com.xueqiu.android:id/tv_login" xpath: //*[@resource-id,"com.xueqiu.android:id/tv_login" ]

# 使用该命令可以查看执行时间,v代表详细信息,此处只查看结果和执行时间,将--v去除
time curl -X POST http://127.0.0.1:4723/wd/hub/session/${SessionId}/elements --data-binary '{"using":"id","value":"com.xueqiu.android:id/tv_login"}' -H "Content-Type: application/json; charset=UTF-8" --v

1418970-20181004151953554-760908803.png

4.总结

1.UiAutomator使用id在匹配resourceId失败时,会使用ACCESSIBILITY_ID定位
UiAtumator2使用id定位被限制,只能使用resourceId定位
2.使用xpath和id定位,耗时差别可接受

封装寻找控件方法的测试代码

test.java

import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;import org.junit.experimental.theories.Theories;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;public class XueqiuDemo {private AndroidDriver driver;@Beforepublic void setUp() throws MalformedURLException {DesiredCapabilities desiredCapabilities = new DesiredCapabilities();desiredCapabilities.setCapability("platformName", "android");desiredCapabilities.setCapability("deviceName", "domo");desiredCapabilities.setCapability("appPackage", "com.xueqiu.android");desiredCapabilities.setCapability("appActivity", ".view.WelcomeActivityAlias");URL remoteUrl = new URL("http://localhost:4723/wd/hub");driver = new AndroidDriver(remoteUrl, desiredCapabilities);driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);}@Testpublic void sampleTest() throws InterruptedException {locate("com.xueqiu.android:id/user_profile_icon").click();Thread.sleep(2000);locate("com.xueqiu.android:id/tv_login").click();Thread.sleep(2000);locate("com.xueqiu.android:id/tv_login_by_phone_or_others").click();Thread.sleep(2000);locate("com.xueqiu.android:id/register_phone_number").sendKeys("123456789");}public WebElement locate(String locate){if (locate.matches("\\/\\/.*")){return  driver.findElementByXPath(locate);}else{return driver.findElementById(locate);}}@Afterpublic void tearDown() {driver.quit();}
}

转载于:https://www.cnblogs.com/csj2018/p/9741808.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(19):巩固练习

/任务 5 有三位老师,王老师,孙老师和小李老师, 王老师工龄最长(15年),孙老师工龄比王老师小3年, 小李老师工龄最短,是王老师和孙老师工龄和的二分之一 再除以2的余数正好是他的工龄,编写程序从控…

mysql分组获取其他字段_sqlserver group by后获取其他字段(多种方法)

大家都知道用group by的话,select 后面指定的字段必须与group by后面的一致。group by 只有个别字段,如果拿出其他未分组的字段信息呢?在网上搜了下,总结如下:使用了group by 之后,就要求select后面的字段包…

搜索引擎基础概念(1)—— 倒排索引

“ 吾有三剑,唯子所择;皆不能杀人,且先言其状。一曰含光,视之不可见,运之不知有。其所触也,泯然无际,经物而物不觉。二曰承影,将旦昧爽之交,日夕昏明之际,北面…

java学习(20):巩固练习

//用运算符判断2019是不是闰年 /①、普通年能被4整除且不能被100整除的为闰年。 (如2004年就是闰年,1901年不是闰年)地球公转示意图②、世纪年能被400整除的是闰年。 (如2000年是闰年,1900年不是闰年) ③、 对于数值很大的年份能整除3200,但同…

PHP与MySQL案例剖析_PHP与MySQL案例剖析

第1章 简介1.1 从静态到动态站点1.1.1 静态Web站点1.1.2 动态Web站点1.1.3 什么是开放源码1.2 关于PHP1.3 关于MySQL1.3.1 在哪里获得MySQL和文档1.3.2 MySQL特性1.3.3 如何安装MySQL和PHP1.3.4 MySQL和PHP的优点1.4 本章小结1.4.1 应该掌握的内容1.4.2 下一步第…

crud介绍

什么是CRUD? CRUD的操作 CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中DataBase或者持久层的基本操作功能。 数据库CRUD操作 一、删除表 drop table 表名称 二、修改表…

汇编软件的安装与实验一

软件的安装在课程邮箱里有详尽的介绍,但在安装调试的时候还是出了一点小问题,创建虚拟盘符的时候,我将masm文件夹前面套上了一层名为masm文件夹,导致虚拟盘符创建之后无法使用debug。 随后就是实验 实验1.1写入程序段并且执行 a命…

python3.6 websocket异步高并发_在Python3.6上的websocket客户端中侦听传入消息时出现问题...

我正在尝试使用websockets包在Python上构建一个websockets客户端:Websockets 4.0 API我使用这种方式而不是示例代码,因为我想创建一个websocket客户机类对象,并将其用作网关。在我在客户端的侦听器方法(receiveMessage)有问题,这会…

upc 9519 New Game

New Game 时间限制: 1 Sec 内存限制: 128 MB Special Judge提交: 157 解决: 53[提交] [状态] [讨论版] [命题人:admin]题目描述 Eagle Jump公司正在开发一款新的游戏。泷本一二三作为其员工,获得了提前试玩的机会。现在她正在试图通过一个迷宫。这个迷宫有一些特…

java学习(21):移位运算符

//移位运算符 public class test{ public static void main(String[] args){ int num3; //向左移位 System.out.println(“移位之前的二进制为”Integer.toBinaryString(num)); int moveleftnum<<2; System.out.println(“移位之后的值为”moveleft); //向右移位 int num…

Datagridview绘制

#region 绘制private void dataGridView_main_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e){int status_column_index 14;//会诊状态所在列DataGridViewRow row dataGridView_main.Rows[e.RowIndex];//获取行DataGridViewCell cell row.Cells[15];//按钮…

java学习(22):if语句

/任务 1&#xff1a;if语句 编写控制台java程序&#xff0c;使用Scanner 对象相关方法从控制台接收用户输入学生年龄&#xff0c; 如果输入的年龄大于18&#xff0c;则输出“你是一个成年人了&#xff0c;该有担当了&#xff01;/ import java.util.Scanner; public class test…

ansible管理mysql安装初始化_[ansible]-ansible初始化mysql数据库

0.目录结构$ tree mysqlmysql├── files│ └── web.sql├── handlers│ └── main.yml├── tasks│ └── main.yml├── templates│ ├── client.cnf.j2│ ├── my.cnf.j2│ ├── mysql-clients.cnf.j2│ └── server.cnf.j2└── vars1…

利用expect实现自动化操作

管理机上需要安装expect包 yum -y install expect1.定义主机ip[rootlocalhost ~]# cat ip.txt 192.168.1.12 192.168.1.132.定义脚本内容[rootlocalhost ~]# cat script.sh vmstat3、shell嵌套expect脚本[rootlocalhost ~]# cat command.sh #!/bin/bashpasswd12345678 sc$(ca…

java学习(23):if..else

/任务2&#xff1a;if else 语句 编写控制台java程序&#xff0c;模拟银行取款的功能。 使用Scanner对象相关方法从控制台接收用户输入的银行卡账号和密码&#xff0c; 与预先定义好的银行卡账号密码相同则输出用户名密码正确&#xff0c;可以取款&#xff1b;如果账号或者密码…

word导入mysql表格_数据插入Word 表格步骤

数据插入Word 表格步骤数据插入Word 表格步骤(1)单击【数据库】工具栏上的【插入数据库】按钮&#xff0c;出现【数 据库】对话框&#xff0c;如图4-33 所示。(2)单击【获取数据】按钮&#xff0c;弹出【选择数据源】对话框&#xff0c;类 似于打开文档窗口。(3)选定合适的.数据…

android 面试汇总二

AnimationQ&#xff1a;Android中有哪几种类型的动画&#xff1f; 技术点&#xff1a;动画类型参考回答&#xff1a; 常见三类动画 View动画&#xff08;View Animation&#xff09;/补间动画&#xff08;Tween animation&#xff09;&#xff1a;对View进行平移、缩放、旋转和…

java学习(24):if..else...if

/任务3&#xff1a;if… else if…. else if….else语句 编写控制台java程序&#xff0c;模拟根据有多少钱买车的功能。 使用Scanner对象相关方法从控制台接收用户输入有多少钱&#xff0c; 单位为万。如果输入的钱数量大于等于100万&#xff0c;则输出“可以买奔驰” &#xf…

废粉盒在哪里_很想知道打印机废粉盒中的那些废碳粉应该怎么处理?

激光打印机用磁性调色剂(碳粉)的主要成分&#xff1a;F-Fe3O4晶体粉粒(PLGMENT)&#xff1a;占20-30%聚丙烯酸脂-苯乙烯共聚物&#xff1a;占50-60%电荷调节剂CCA&#xff1a;占10-20%流动化剂SiO2等表面改性剂聚乙烯/聚丙烯石蜡二、碳粉的无毒性控制碳粉的各种原材料若是标准化…

java学习(25):三目运算符

/任务4&#xff1a;三目运算符 编写控制台java程序&#xff0c; 使用Scanner对象相关方法从控制台接收两个整数&#xff0c;比较他们的大小/ import java.util.Scanner; public class test04{ public static void main(String[] args){ Scanner in new Scanner(System.in); Sys…