首页 > 解决方案 > 检查混合应用程序时出现问题。找不到所需的选择器

问题描述

我正在使用 Appium 使用真实的移动设备自动化混合应用程序。所以我的代码写如下:

DesiredCapabilities capabilities = new DesiredCapabilities();

//capabilities.setCapability(CapabilityType.BROWSER_NAME,"Chrome");
capabilities.setCapability("deviceName", "77377f50");
capabilities.setCapability("platformVersion", "9");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("automationName", "uiautomator2");
capabilities.setCapability("autoWebview", "true");

capabilities.setCapability("appium:chromeOptions", ImmutableMap.of("w3c", false));
capabilities.setCapability("appPackage", "com.englishbolo.android.alpha");
capabilities.setCapability("appActivity", "com.englishbolo.android.ui.EnglishBoloSplashScreen filter 36b63470");
capabilities.setCapability(MobileCapabilityType.FULL_RESET,false);

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

Set <String> contextNames = driver.getContextHandles();

for (String contextName : contextNames) 
{
    System.out.println("Available Context:"+contextName); 

}

driver.context((String) contextNames.toArray()[1]);

driver.findElement(By.xpath("//android.view.View[contains(@resource-id,'en_US')]")).click();

driver.findElement(By.xpath("//android.widget.Button[contains(@resource-id,'OK')]")).click();

driver.findElement(By.xpath("//android.view.View[@text='SIGNUP FREE']")).click();

driver.findElementByClassName("android.widget.Spinner").click();

driver.findElementByXPath("//android.widget.EditText[contains(@resource-id,'userFullName')]").sendKeys("ebuat");

driver.findElementByXPath("//android.view.View[@text='Sri Lanka+94']").click();

driver.findElementByXPath("//android.widget.EditText[contains(@resource-id,'userPhone')]").sendKeys("744693540");

driver.findElementByXPath("//android.widget.EditText[contains(@resource-id,'userPassword')]").sendKeys("1234");

driver.findElementByXPath("//android.widget.EditText[contains(@resource-id,'userMailId')]").sendKeys("ebuatuser_nov18@sharklasers.com");

driver.hideKeyboard();

driver.findElementByXPath("//android.widget.Button[@text='SUBMIT']").click();

driver.findElementByXPath("//android.widget.Button[@text='START NOW']").click();

在最后一次单击操作之后,我需要单击单选按钮,但在 appium 桌面中检查后,只存在作为定位器的类。

对于所有单选按钮类android.view.View是存在的定位器。

我已经使用 xpath 使用类名,文本 * 资源 ID 存在。如果只存在类名那么我如何形成 xpath 来单击单选按钮?

Set <String> contextNames = driver.getContextHandles();
for (String contextName : contextNames) 
{
    System.out.println("Available Context:"+contextName); 

}
driver.context((String) contextNames.toArray()[1]);

我还编写getContextHandles了将视图设置为 WebView 的方法。

编写此方法后观察到的错误:

INFO: HTTP Status: '400' -> incorrect JSON status mapping for 'unknown error' (500 expected)
Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: Unable to create a new remote session. Please check the server log for more details. Original error: No such context found.
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'englishhelper-MS-7A15', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-52-generic', java.version: '12.0.1'
Driver info: driver.version: AndroidDriver
remote stacktrace: NoSuchContextError: No such context found.
    at AndroidUiautomator2Driver.setContext (/tmp/.mount_AppiumZrt5AD/resources/app/node_modules/appium/node_modules/appium-android-driver/lib/commands/context.js:57:11)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'englishhelper-MS-7A15', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-52-generic', java.version: '12.0.1'
Driver info: driver.version: AndroidDriver
    at io.appium.java_client.remote.AppiumCommandExecutor$1.createSession(AppiumCommandExecutor.java:208)
    at io.appium.java_client.remote.AppiumCommandExecutor.createSession(AppiumCommandExecutor.java:217)
    at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:239)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    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.startSession(RemoteWebDriver.java:213)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)
    at io.appium.java_client.DefaultGenericMobileDriver.<init>(DefaultGenericMobileDriver.java:38)
    at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:84)
    at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:94)
    at io.appium.java_client.android.AndroidDriver.<init>(AndroidDriver.java:95)
    at appium_new.AppiumSignup.main(AppiumSignup.java:62)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at io.appium.java_client.remote.AppiumCommandExecutor$1.createSession(AppiumCommandExecutor.java:186)
    ... 13 more
Caused by: org.openqa.selenium.WebDriverException: No such context found.
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'englishhelper-MS-7A15', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-52-generic', java.version: '12.0.1'
Driver info: driver.version: AndroidDriver
remote stacktrace: NoSuchContextError: No such context found.
    at AndroidUiautomator2Driver.setContext (/tmp/.mount_AppiumZrt5AD/resources/app/node_modules/appium/node_modules/appium-android-driver/lib/commands/context.js:57:11)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at org.openqa.selenium.remote.W3CHandshakeResponse.lambda$errorHandler$0(W3CHandshakeResponse.java:62)
    at org.openqa.selenium.remote.HandshakeResponse.lambda$getResponseFunction$0(HandshakeResponse.java:30)
    at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:126)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
    at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
    at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:128)
    ... 18 more

你能帮我解决你可能知道的解决方案吗?

标签: hybrid-mobile-appappium-desktop

解决方案


推荐阅读