Appium Appium 进行自动化测试用例的时候,出现错误

肖勇 · 2018年09月07日 · 最后由 肖勇 回复于 2018年09月10日 · 3513 次阅读

我刚开始学习安卓自动化测试, 我是按照虫师的文章安装的 java 自动化测试平台。

代码如下:
package com.example.Appdemo1;

//import org.testng.annotations.Test;
//import org.testng.annotations.BeforeClass;
//import org.testng.annotations.AfterClass;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;

import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.MalformedURLException;

public class App {

// private AppiumDriver driver;

//public void setup() throws Exception

public static void main(String[] args) throws MalformedURLException, InterruptedException{

DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(CapabilityType.BROWSER_NAME, "");
cap.setCapability("device", "Android");
cap.setCapability("automationName", "Appium");
cap.setCapability("platformName", "Android"); //指定测试平台
cap.setCapability("deviceName", "8ad9f2f07d93"); //指定测试机的 ID,通过 adb 命令adb devices获取
cap.setCapability("platformVersion", "6.0.1");

//将上面获取到的包名和 Activity 名设置为值
cap.setCapability("appPackage", "com.miui.calculator");
cap.setCapability("appActivity", "com.miui.calculator.cal.CalculatorActivity");

//A new session could not be created 的解决方法
cap.setCapability("appWaitActivity","com.miui.calculator.cal.CalculatorActivity");
//每次启动时覆盖 session,否则第二次后运行会报错不能新建 session
cap.setCapability("sessionOverride", true);

AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), cap);
// AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), cap);

Thread.sleep(5000);

// 获取 1
driver.findElementById("com.miui.calculator:id/btn_1_s").click();
//获取 +
driver.findElementById("com.miui.calculator:id/btn_plus_s").click();
//获取 2
driver.findElementById("com.miui.calculator:id/btn_2_s").click();
//获取=
driver.findElementById("com.miui.calculator:id/btn_equal_s").click();

// driver.findElement(By.id("com.miui.calculator:id/btn_1_s")).click();
// driver.findElement(By.id("com.miui.calculator:id/btn_plus_s")).click();
// driver.findElement(By.id("com.miui.calculator:id/btn_2_s")).click();
// driver.findElement(By.id("com.miui.calculator:id/btn_equal_s")).click();
//

// driver.findElementById("com.miui.calculator:id/btn_1_s").click();
// driver.findElementById("com.miui.calculator:id/btn_plus_s").click();
// driver.findElementById("com.miui.calculator:id/btn_2_s").click();
// driver.findElementById("com.miui.calculator:id/btn_equal_s").click();

// driver.findElement(By.name("1")).click();
// driver.findElement(By.name("5")).click();
// driver.findElement(By.name("9")).click();
// driver.findElement(By.name("delete")).click();
// driver.findElement(By.name("+")).click();
// driver.findElement(By.name("6")).click();
// driver.findElement(By.name("=")).click();
// Thread.sleep(2000);

// driver.findElement(By.name("1")).click();
// driver.findElement(By.name("+")).click();
// driver.findElement(By.name("2")).click();
// driver.findElement(By.name("=")).click();

// driver.findElement("com.miui.calculator:id/btn_1_s").click();
// //获取 +
// driver.findElementById("com.miui.calculator:id/btn_plus_s").click();
// //获取 2
// driver.findElementById("com.miui.calculator:id/btn_2_s").click();
// //获取=
// driver.findElementById("com.miui.calculator:id/btn_equal_s").click();

driver.quit();

}

}

当运行的时候,出现下面的错误:
九月 07, 2018 9:11:22 上午 org.openqa.selenium.remote.ProtocolHandshake createSession
信息: Detected dialect: OSS
Exception in thread "main" org.openqa.selenium.NoSuchElementException: An element could not be located on the page using the given search parameters. (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.8.1', revision: '6e95a6684b', time: '2017-12-01T19:05:32.194Z'
System info: host: '6921Y1O05X5QTK6', ip: '172.31.252.191', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_181'
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities {appActivity: com.miui.calculator.cal.Cal..., appPackage: com.miui.calculator, appWaitActivity: com.miui.calculator.cal.Cal..., automationName: Appium, browserName: , databaseEnabled: false, desired: {appActivity: com.miui.calculator.cal.Cal..., appPackage: com.miui.calculator, appWaitActivity: com.miui.calculator.cal.Cal..., automationName: Appium, browserName: , deviceName: 8ad9f2f07d93, platformName: Android, platformVersion: 6.0.1, sessionOverride: true}, deviceName: 8ad9f2f07d93, javascriptEnabled: true, locationContextEnabled: false, networkConnectionEnabled: true, platform: LINUX, platformName: LINUX, platformVersion: 6.0.1, sessionOverride: true, takesScreenshot: true, warnings: {}, webStorageEnabled: false}
Session ID: 2a74d568-53ed-493a-8fb4-b4420b783a82
*** Element info: {Using=name, value=delete}
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
at org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)
at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:164)
at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:89)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:601)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42)
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:371)
at io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:62)
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:449)
at io.appium.java_client.DefaultGenericMobileDriver.findElementByName(DefaultGenericMobileDriver.java:110)
at io.appium.java_client.AppiumDriver.findElementByName(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.findElementByName(AndroidDriver.java:1)
at org.openqa.selenium.By$ByName.findElement(By.java:303)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:363)
at io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:58)
at io.appium.java_client.AppiumDriver.findElement(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.findElement(AndroidDriver.java:1)
at com.example.Appdemo1.App.main(App.java:70)

好像这里的点击定位操作不对,请大家多多指教.

共收到 29 条回复 时间 点赞

当前页面元素不可见,有一个元素没找到

肖勇 #28 · 2018年09月07日 Author
domains90 回复

为什么当前页面元素不可见,有一个元素没找到,我是用的 UI Automator viewer 在我的红米手机上找到的 ID,我这里的代码
有问题吗?请再指教一下,应该怎样改才能正常跑通这个自动化测试用例。

= =定位器方法还是封装下吧 了解一下显示等待。
代码要面向对象啊。。

肖勇 #26 · 2018年09月07日 Author
陈子昂 回复

我现在基本的用例都跑不过啊,只有把用例跑过了,才好优化代码啊,要不然现在优化代码有什么意义啊,请指教一下现在的代码有什么问题?显示等待不就是代码中的 Thread.sleep(5000) 这句吗?

肖勇 回复

当前页面没有显示出这个元素,你去操作这个元素肯定就报错了啊,因素很多可能页面没加载出来,也有可能你的元素就没有

肖勇 #24 · 2018年09月07日 Author
domains90 回复

我的问题就是这个啊,我的自动化测试用例是要自动操作我的红米手机上面的计算器,模拟 1+2=这样的操作,我用本机上面的 C:\Program Files (x86)\Android\android-sdk\tools 下面的 uiautomatorviewer.bat 工具查到 1+2=的 resource id,然后编码的,我不
知道为什么找不到,请再指教。

肖勇 回复

前端的元素看一下

肖勇 回复

还有你是不是操作 delete 这个东西的时候报错了

domains90 回复

比如 1,看图所示:

肖勇 #20 · 2018年09月07日 Author
肖勇 回复

就是取得这里的 resource-id,其它的元素是同样做的。

肖勇 #19 · 2018年09月07日 Author
domains90 回复

我没有操作 delete 这个操作,我要操作的是红米手机上面自带的计算器程序的 1+2=这样的算式。请指教.

肖勇 回复

换个定位方式试试

domains90 回复

也可以试试先找父层级在找子层级

肖勇 #14 · 2018年09月07日 Author
domains90 回复

name,id,class 都试过,都不行。

肖勇 #15 · 2018年09月07日 Author
domains90 回复

这倒是一个很好的思路,但是不知道该怎样找。

每次跑都出错吗?但是看日志好像也没有具体的错误,是哪一句出错了?

肖勇 回复

driver.findElement(By.id("父级")).findElement(By.id("子级")).click(); 这样的

肖勇 回复

实在不行就用 text 试试

肖勇 #19 · 2018年09月07日 Author
雨夜狂奔 回复

是的,每次跑都会出错。

肖勇 回复

你代码什么的没用 markdown 语法包起来太难看清楚了。。 cap.setCapability(CapabilityType.BROWSER_NAME, "");,测试 android 不需要这个参数吧

肖勇 #21 · 2018年09月07日 Author
domains90 回复


这个 button 1 上面有无数的父级别的元素,我不知道需要取那个元素进行测试,因此就都试了一下,还是不能跑成功.

肖勇 回复


这个试试

肖勇 #23 · 2018年09月07日 Author
domains90 回复

这个没有试,是因为这个元素没有 resource-id 属性,就是说它的 resource-id 属性是空的,我也不知道是怎么回事.

肖勇 #24 · 2018年09月07日 Author
雨夜狂奔 回复

这个确实是多余的,但是好像也不影响最后的测试结果.

肖勇 回复

有的时候,在 Eclipse 中报告如下的信息:
九月 07, 2018 4:02:31 下午 org.openqa.selenium.remote.ProtocolHandshake createSession
信息: Detected dialect: OSS

还有谁能够指教一下吗?

奇怪的很,什么都没有改,现在用例又跑成功了,真的很奇怪。

用 webdriverwait ,等待元素出现之后 再进行操作。优先用 id 来定位,不行的话试试 xpath

战 神 回复

谢谢,今天过来直接就跑成功了,也没有修改什么,很奇怪的说。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册