【问题标题】:Variety of issues testing Android Webview using Appium使用 Appium 测试 Android Webview 的各种问题
【发布时间】:2017-01-27 21:06:52
【问题描述】:

我有一个混合应用程序,主要只是一个 web 视图。这是基本测试的代码:

  @BeforeClass
  public static void setupAppium() throws MalformedURLException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("appium-version", "1.5.3");
    capabilities.setCapability("platformName", "Android");
    capabilities.setCapability("platformVersion", "6.0");
    capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "AppiumTesterDevice");
    capabilities.setCapability("app", "/work/builds/unify/app/build/outputs/apk/app-debug.apk");
    capabilities.setCapability("appPackage", "com.company.unify");
    capabilities.setCapability("appActivity", "AdministerActivity");
    driver = new AndroidDriver<>(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);
  }

  @Test
  public void CompanyUrlTest() {
    driver.findElement(By.xpath("//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.EditText[1]")).clear();
    driver.findElement(By.xpath("//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.EditText[1]")).sendKeys(companyserverUrl);
    driver.findElement(By.xpath("//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[3]/android.widget.Button[2]")).click();
  }

  @Test
  public void SimpleTest() {
    driver.context("WEBVIEW_com.company.unify");
    WebDriverWait wait = new WebDriverWait(driver,20);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".localPickerList")));
    driver.findElementByCssSelector(".localePickerList").click();
    driver.findElementByCssSelector(".SPANISH_PR").click();
  }

第一个测试工作正常,因为它只是在普通的 android 应用程序上运行,没有 webview。因此,它只是更改文本字段中的 URL,然后按一个按钮将我们带到 web 视图中的那个 URL。

第二个测试是哪里有问题,问题会根据android版本和chromedriver版本变化。我已经进行了大量的谷歌搜索,只能得出结论,appium/selendroid/chromedriver 存在一系列无穷无尽的错误。

我从https://sites.google.com/a/chromium.org/chromedriver/downloads 下载了最新的Chromedriver。在我的 appium 设置中,我已将 chromedriver 路径设置为指向此。在我的 Android 6.0 中,此版本的 ChromeDriver 出现此错误:

org.openqa.selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: Can't stop process; it's not currently running (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 224 milliseconds
Build info: version: 'unknown', revision: '1969d75', time: '2016-10-18 09:43:45 -0700'
System info: host: 'company-me-m', ip: '192.168.1.154', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.11.4', java.version: '1.8.0_45'
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities [{app=/work/builds/unify/app/build/outputs/apk/app-debug.apk, appPackage=com.company.unify, networkConnectionEnabled=true, warnings={}, databaseEnabled=false, deviceName=emulator-5554, platform=LINUX, deviceUDID=emulator-5554, appActivity=AdministerActivity, desired={app=/work/builds/unify/app/build/outputs/apk/app-debug.apk, appPackage=com.comany.unify, appActivity=AdministerActivity, appium-version=1.5.3, platformVersion=6.0, automationName=Appium, platformName=Android, deviceName=AppiumTesterDevice}, appium-version=1.5.3, platformVersion=6.0, webStorageEnabled=false, locationContextEnabled=false, automationName=Appium, takesScreenshot=true, javascriptEnabled=true, platformName=Android}]
Session ID: bc7100bd-2498-47d2-b0f2-3b29602c8e0d

    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:216)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:168)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:635)
    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 io.appium.java_client.AppiumDriver.context(AppiumDriver.java:557)
    at com.comapny.UnifyAppiumJunit.BasicTest.SimpleTest(BasicTest.java:57)

如果没有在 appium 选项中设置这个版本的 Chromedriver,我会得到一个不同的错误(但是,我不知道当我没有指定它时它使用什么 chromedriver 可执行文件)。这是那个错误:

Jan 27, 2017 3:02:39 PM org.openqa.selenium.support.ui.ExpectedConditions findElement
WARNING: WebDriverException thrown by findElement(By.cssSelector: .localPickerList)
org.openqa.selenium.NoSuchSessionException: no such session

似乎在这两种情况下都没有让我的 webview 加载。当应用程序加载 webview 时,代码仍然运行,这似乎很糟糕。为什么 Wait 似乎没有做任何事情?这还重要吗?

最后,如果我使用我的 Android 5.1.1 模拟器,我会收到以下错误:

WebDriverException thrown by findElement org.openqa.selenium.WebDriverException: unknown error: Maximum call stack size exceeded

有什么想法吗?为此,我整天都在与谷歌打交道。

【问题讨论】:

    标签: java junit android-webview appium selendroid


    【解决方案1】:

    使用新的 UIautomator,您无需将驱动程序切换到 webview。它具有识别 webView 内元素的内置功能。

    请更新您的 Android SDK 一次。

    WebView 中的元素将在 Android 6.0+ 版本的 UIAutomator 中可见。但是,一旦您为 Android 6.0+ 设备自动执行脚本,您就可以为低于 6.0 的 Android 版本使用相同的脚本。

    您还可以使用 UIAutomator 在 Android 6.0+ 设备上查看 webView 中的元素。

    更多信息请参考link

    【讨论】:

    • 非常感谢。在我所有的谷歌搜索中,我都没有发现任何迹象表明 Android 6.0 Webviews 可以使用 Appium 自动化。我不能以另一种方式做到这一点仍然很奇怪,但是哦,好吧。我使用这种方法进行了测试。
    • 后续问题:除了 xpath 或 content-desc 之外,有没有一种很好的方法来获取 Web 元素?如果我使用 webview 上下文,我可以使用 css 选择器(如果它不是超级错误的话),这很好,因为我可以为测试用例设置特殊的选择器并将它们命名为我想要的任何名称。我可以用你的方法做这样的事情吗?
    • @Slims 您始终可以使用 xpath 来查找元素。 Xpath 是最好的方法。我总是用它。是的!您可以使用 resource-id,id,name,text,content-desc 或 index 来构建 xpath。
    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 2015-09-16
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多