使用Appium with Java for Android移动设备无法在混合应用中找到元素

时间:2018-05-23 12:15:31

标签: java android appium

我是appium的新手并尝试自动化应用。我在Java中的脚本无法识别文本框字段。

 MobileElement code =  driver.findElement(By.id("some-id"));

 WebDriverWait wait2 = new WebDriverWait(driver, 5);
 wait2.until(ExpectedConditions.elementToBeClickable(code));

 code.click();

  code.sendKeys("abc"); 

我在控制台中收到以下错误。

2018年5月23日下午5:34:39 org.openqa.selenium.remote.ProtocolHandshake createSession 信息:检测到的方言:OSS 线程“main”中的异常org.openqa.selenium.NoSuchElementException:使用给定的搜索参数无法在页面上找到元素。 (警告:服务器未提供任何堆栈跟踪信息) 命令持续时间或超时:0毫秒 有关此错误的文档,请访问:http://seleniumhq.org/exceptions/no_such_element.html 构建信息:版本:'3.12.0',修订版:'7c6e0b3',时间:'2018-05-08T14:04:26.12Z' 系统信息:主机:'N0PCINF651RBHT',ip:'100.118.94.148',os.name:'Windows 7',os.arch:'amd64',os.version:'6.1',java.version:'1.8.0_71 “ 驱动程序信息:io.appium.java_client.android.AndroidDriver 功能{appActivity:nz.co.mcom.phone.login.Spla ...,appPackage:com.fiserv.touchbanking,databaseEnabled:false,desired:{appActivity:nz.co.mcom.phone.login.Spla ... ,appPackage:com.fiserv.touchbanking,deviceName:Samsung,platformName:android,platformVersion:7.0},deviceManufacturer:samsung,deviceModel:SM-G950F,deviceName:ce03171399d964fa0c,deviceScreenSize:1440x2960,deviceUDID:ce03171399d964fa0c,javascriptEnabled:true,locationContextEnabled: false,networkConnectionEnabled:true,platform:LINUX,platformName:LINUX,platformVersion:7.0,takesScreenshot:true,warnings:{},webStorageEnabled:false} 会议ID:58013355-1b58-4c8d-895f-7a57144e0595 ***元素信息:{Using = id,value = com.fiserv.touchbanking:id / AppCodeTextBox}     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)     在org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)     在org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)     在org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)     在org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)     在org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)     在org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)     在io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:129)     在org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:543)     at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42)     at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)     在io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)     在org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:317)     at io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:62)     at io.appium.java_client.AppiumDriver.findElement(AppiumDriver.java:1)     在io.appium.java_client.android.AndroidDriver.findElement(AndroidDriver.java:1)     在org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:363)     at io.appium.java_client.DefaultGenericMobileDriver.findElementById(DefaultGenericMobileDriver.java:70)     at io.appium.java_client.AppiumDriver.findElementById(AppiumDriver.java:1)     at io.appium.java_client.android.AndroidDriver.findElementById(AndroidDriver.java:1)     在org.openqa.selenium.By $ ById.findElement(By.java:188)     在org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:309)     at io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:58)     at io.appium.java_client.AppiumDriver.findElement(AppiumDriver.java:1)     在io.appium.java_client.android.AndroidDriver.findElement(AndroidDriver.java:1)     在mytests.LaunchTouchbankingApp.main(LaunchTouchbankingApp.java:50)

Appium服务器中的Bootstrap日志如下: -

[AndroidBootstrap] [BOOTSTRAP LOG] [debug]得到ACTION类型的命令 [AndroidBootstrap] [BOOTSTRAP LOG] [debug]得到命令动作:find [AndroidBootstrap] [BOOTSTRAP LOG] [debug]使用带有contextId的'ID'查找'com.fiserv.touchbanking:id / AppCodeTextBox':''multiple:false

你的帮助非常明显。感谢。

1 个答案:

答案 0 :(得分:0)

返回的异常似乎只是因为在您搜索时未在UI中找到该元素。

请注意,在您发布的代码段中,由id' some-id'标识的元素将在第一行执行后搜索,而不是在您尝试单击元素时搜索。您是否在driver.findElement(By.id("some-id"));上执行任何类型的隐式等待?如果没有,当您第一次尝试在UI中找到它时,您确定该元素可用吗?

要确保该元素实际可用,您可以在执行findBy之前检查它是否出现在页面源中。在Java中,你可以这样做:

System.out.println(driver.getPageSource());