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,但同…

汇编软件的安装与实验一

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

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…

java学习(23):if..else

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

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…

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…

java学习(26):switch

/扩展练习&#xff1a; 任务5&#xff1a;switch语句 编写控制台Java程序&#xff0c;使用Scanner对象相关方法接收用户输入的年份和月份&#xff0c; 输出这个月有多少天。(提示:闰年计算方法为&#xff1a;能被4整除单不能被100整除&#xff1b;或者能被400整除就是闰年。)/ …

java学习(27):巩固练习

/1 使用Eclipse编写控制台应用程, 使用while循环在控制台打印10行10列的如下图形 □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ …

java学习(28):switch

/2使用Eclipse编写控制台应用程, 使用while循环输入如下图形 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 6…

java学习(29):大神指导(巩固练习)

/3使用Eclipse编写控制台应用程&#xff0c;使用do while循环处理从控制台接收不定数量的学生英语成绩&#xff0c; 统计不及格(小于60分)的成绩个数&#xff0c;大于等于90分的优秀成绩数量&#xff0c; 计算所有成绩的总分、平均分并输出相关统计结果到控制台/ import java.u…

java学习(30):巩固练习

/4使用Eclipse编写控制台应用程&#xff0c;利用for循环打印一个等腰三角图形/ public class test04 { public static void main(String[] args){ int x; int y; int z; for(x1;x<4;x)//外循环控制行数&#xff0c;总共四行 { for (y1;y<4-x ;y ) {//打印小星星前面的空格…

java学习(31):for循环

/5使用Eclipse编写控制台应用程&#xff0c;利用for循环计算输入的两个整数的最大公约数和最小公倍数。/ import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner innew Scanner(System.in); System.out.println(“输入两个整数”);…

java学习(32):巩固练习

/6使用Eclipse编写控制台应用程&#xff0c;利用循环模仿一个用户的注册&#xff0c; 输入用户名和密码&#xff0c;判断用户输入的用户名是否长度位于4到16个字符之间&#xff0c; 如果不满足要求则应能够让用户重写输入&#xff0c;判断密码长度是否在6到16个字符之间 &#…