appium新版本不支持findElementByName,切换到findElementByAndroidUIAutomator
appium 1.7.6 不支持findElementByName(locator) 不知道为什么? 脚本中许多这样的语句,麻烦事情多了
org.openqa.selenium.InvalidSelectorException: Locator Strategy 'name' is not supported for this session (WARNING: The server did not provide any stacktrace information)
*** Element info: {Using=name, value=取件}
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:40)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:353)
at io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:56)
at io.appium.java_client.AppiumDriver.findElement(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.findElement(AndroidDriver.java:1)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByName(RemoteWebDriver.java:451)
at io.appium.java_client.DefaultGenericMobileDriver.findElementByName(DefaultGenericMobileDriver.java:104)
at io.appium.java_client.AppiumDriver.findElementByName(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.findElementByName(AndroidDriver.java:1)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:100)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:646)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:811)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1137)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:753)
at org.testng.TestRunner.run(TestRunner.java:607)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:368)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:363)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:321)
at org.testng.SuiteRunner.run(SuiteRunner.java:270)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1284)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1209)
at org.testng.TestNG.runSuites(TestNG.java:1124)
at org.testng.TestNG.run(TestNG.java:1096)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:137)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:58)
处理方法:把以前脚本 driver.findElementByName("中文") 修改为driver.findElementByAndroidUIAutomator("text(\"中文\")")
写一个测试类,循环读写每行代码,如果含有driver.findElementByName 就进行替换处理
package auto.auto.test; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class EditFile { public static void main(String[] args) { File file = new File("D:\\AutoTest\\autotest\\src");
ArrayList<String> strArray = getChildFileName(file); //获取子文件或文件夹
for (int i = 0;i <strArray.size();i++){
String filePath = strArray.get(i);
if(filePath.contains(".java")){ //如果是java文件就处理
EditFile ef = new EditFile();
ef.write(filePath, ef.read(filePath)); // 先读取并修改文件
System.out.println("edit file:"+strArray.get(i));
}
}
} /**
* 读取文件内容
*
* @param filePath
* @return
*/
public String read(String filePath) {
BufferedReader br = null;
String line = null;
StringBuffer buf = new StringBuffer(); try {
br = new BufferedReader(new FileReader(filePath)); while ((line = br.readLine()) != null) {
// 此处根据实际需要修改某些行的内容
if (line.contains("driver.findElementByName")) {
line = line.replace("\")", "\\\")\")");
line = line.replace("driver.findElementByName(\"", "driver.findElementByAndroidUIAutomator(\"text(\\\""); }
buf.append(line + "\r\n"); }
} catch (Exception e) {
e.printStackTrace();
} finally { if (br != null) {
try {
br.close();
} catch (IOException e) {
br = null;
}
}
} return buf.toString();
} /**
* 将内容回写到文件中
*
* @param filePath
* @param content
*/
public void write(String filePath, String content) {
BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(filePath)); bw.write(content);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭流
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
bw = null;
}
}
}
} /**
* 递归获取子文件或文件夹名称
* @param f
* @return
*/
public static ArrayList<String> getChildFileName(File f) {
ArrayList<String> strArray = new ArrayList<String> ();
ArrayList<String> tmp = new ArrayList<String> ();
File file[] = f.listFiles();
for (int i = 0; i < file.length; i++) {
System.out.println("nnnnnn"+ file[i].getAbsolutePath());
strArray.add(file[i].getAbsolutePath()); if (file[i].isDirectory()) {
//strArray = strArray + listFile(file[i]);
tmp = getChildFileName(file[i]);
strArray.addAll(tmp);
}
}
return strArray;
}
}
替换后发现部分带有变量的语句替我不完整,如driver.findElementByAndroidUIAutomator(viceBox).click(); 应该替换成driver.findElementByAndroidUIAutomator("text(\"+viceBox+\")").click();,实际没有被替换
需要使用正则表达式继续替换。正则表达式:findElementByAndroidUIAutomator\((\s*[^" ]) \s*表示0个或者任意个空格 [^" ] 表示不以 “ 或空格开头。
完整的代码如下:
package auto.auto.test; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class EditFile {
static int count = 0; public static void main(String[] args) { File file = new File("D:\\AutoTest\\autotest\\src");
//File file = new File("D:\\test");
ArrayList<String> strArray = getChildFileName(file); // 获取子文件或文件夹
for (int i = 0; i < strArray.size(); i++) {
String filePath = strArray.get(i);
if (filePath.contains(".java")) { // 如果是java文件就处理
EditFile ef = new EditFile();
ef.write(filePath, ef.read(filePath)); // 先读取并修改文件
System.out.println("edit file:" + strArray.get(i));
}
}
System.out.println("修改次数:" + count);
} /**
* 读取文件内容
*
* @param filePath
* @return
*/
public String read(String filePath) {
BufferedReader br = null;
String line = null;
StringBuffer buf = new StringBuffer();
String findStr ="findElementByAndroidUIAutomator\\((\\s*[^\" ])";
Pattern pattern = Pattern.compile(findStr); try {
br = new BufferedReader(new FileReader(filePath)); while ((line = br.readLine()) != null) {
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
line = line.replace(").click", "+\"\\\")\").click");
line = line.replace("findElementByAndroidUIAutomator(",
"findElementByAndroidUIAutomator(\"text(\\\"\"+");
count = count + 1; } buf.append(line + "\r\n"); }
} catch (Exception e) {
e.printStackTrace();
} finally { if (br != null) {
try {
br.close();
} catch (IOException e) {
br = null;
}
}
} return buf.toString();
} /**
* 将内容回写到文件中
*
* @param filePath
* @param content
*/
public void write(String filePath, String content) {
BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(filePath)); bw.write(content);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭流
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
bw = null;
}
}
}
} /**
* 递归获取子文件或文件夹名称
*
* @param f
* @return
*/
public static ArrayList<String> getChildFileName(File f) {
ArrayList<String> strArray = new ArrayList<String>();
ArrayList<String> tmp = new ArrayList<String>();
File file[] = f.listFiles();
for (int i = 0; i < file.length; i++) {
System.out.println("nnnnnn" + file[i].getAbsolutePath());
strArray.add(file[i].getAbsolutePath()); if (file[i].isDirectory()) {
// strArray = strArray + listFile(file[i]);
tmp = getChildFileName(file[i]);
strArray.addAll(tmp);
}
}
return strArray;
}
}
appium新版本不支持findElementByName,切换到findElementByAndroidUIAutomator的更多相关文章
- Appium新版本不再支持ByName定位了怎么办
appium版本在1.5以后就不再支持ByName的定位,本文章仅介绍在appium1.6.3/1.6.4/1.6.5版本下如何支持ByName定位,适用于安卓.在使用appium1.5之后的版本时, ...
- TensorFlow 1.2.0新版本完美支持Python3.6,windows在cmd中输入pip install tensorflow就能下载应用最新tensorflow
TensorFlow 1.2.0新版本完美支持Python3.6,windows在cmd中输入pip install tensorflow就能下载应用最新tensorflow 只需在cmd中输入pip ...
- [RN] React Native 下实现底部标签(支持滑动切换)
上一篇文章 [RN] React Native 下实现底部标签(不支持滑动切换) 总结了不支持滑动切换的方法,此篇文章总结出 支持滑动 的方法 准备工作之类的,跟上文类似,大家可点击上文查看相关内容. ...
- [RN] React Native 下实现底部标签(不支持滑动切换)
底部标签是现在App的基本菜单实现 下面分别用 createBottomTabNavigator 和 createMaterialBottomTabNavigator 两种方法分别实现底部菜单 但此两 ...
- 使用appium做自动化时如何切换activity
在使用appium过程中遇到了执行一个用例时有多个不同的acitivity的情况,以下为app内部切换acitivity的方法: 如果仅需要切换一次activity,可以通过设置desired_cap ...
- Appium新版本遇到的问题,不能通过 name 去定位元素抛 Message: Locator Strategy 'name' is not supported for this session
环境: 1.Appium: 1.15.1 2.Python: 3.7.0 3.Selenium: 3.141.0 4.IDE: Pycharm 5.PC:Windows 10 问题:在 Pycharm ...
- django的中英文支持及切换
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 1.http://mlocati.github.io/articles/gettext-iconv-w ...
- WPF 界面实现多语言支持 中英文切换 动态加载资源字典
1.使用资源字典,首先新建两个字典文件en-us.xaml.zh-cn.xaml.定义中英文的字符串在这里面[注意:添加xmlns:s="clr-namespace:System;assem ...
- jQuery实现页面导航内容定位效果,并支持内容切换
需求 页面向下滚动时,需要将顶部的搜索栏信息和导航菜单吸顶,并且,搜索栏信息和导航菜单之间可以切换. 效果 https://www.iguopin.com/index.php?m=&c=ind ...
随机推荐
- android的task任务栈
转自http://blog.csdn.net/liuhe688/article/details/6761337 古人學問無遺力,少壯工夫老始成.紙上得來終覺淺,絕知此事要躬行.南宋.陸遊<冬夜讀 ...
- 【转】app瘦身
iPhone经过这几年的发展,已经发生了很大的变化,例如屏幕变得更加多样,尺寸更多,内存变得更大,CPU的架构也在变化.伴随着iPhone的变化,iOS也在变化,例如AutoLayout.size c ...
- 12 个 CSS 高级技巧汇总
下面这些CSS高级技巧,一般人我可不告诉他哦. 使用 :not() 在菜单上应用/取消应用边框 给body添加行高 所有一切都垂直居中 逗号分隔的列表 使用负的 nth-child 选择项目 对图标使 ...
- IIS7.5 提示未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序
在WIN7 X64平台IIS7.5,使用Asp.net连接access数据库时候,提示:未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序. 说明: 执行当前 Web 请求 ...
- WPF Mahapps.Metro 设置主题样式
/// <summary> /// 设置App样式 /// </summary> /// <param name="accentName">窗口 ...
- windows下安装apache笔记
之前一直是用别人配置好的apache环境来开放,今天想自己安装配置下windows下的apache(nginx+fastcgi).mysql.php等. 虽然大部分时间是在搞前端开发,偶尔也要搞服务端 ...
- 使用shiro标签遇到的部分问题的解决思路
最近几天,在shiro进行系统权限控制.在处理JSP页面的时候,遇到几个问题,纠结好几天,终于成功解决这些问题. 1.使用<shiro:principal>的时候,如何得到整个类的信息? ...
- JS实现定时器(类似工行网银支付限时操作)
js脚本内容: //5秒倒计时 var num = 0 ; var max = 5 ; var id = null ; id = setInterval(box , 1000) ; //1秒钟调用 ...
- canvas 绘制矩形
XXX(x,y,width,height) x矩形左上角x坐标 y矩形左上角y坐标 ...
- js插件zClip实现复制到剪贴板功能
相信这个功能大家平时上网经常能碰到,以前也没怎么留意怎么实现的,直到项目中需要. 网上一搜一大堆,单纯使用js方法也不是没有,但是由于各浏览器的安全机制不同,不是跨浏览器的.去看了几个常用的网站,都是 ...