【问题标题】:how to handle alerts in android using appium如何使用appium处理android中的警报
【发布时间】:2014-08-29 09:31:53
【问题描述】:

如何使用 Appium 服务器 (1.0.1) 和 Android SDK 处理 Android Web 应用程序中的警报?

以下代码不适用于android:

driver.switchTo().accept().alert();

错误信息:

> -modal window does not get closed

【问题讨论】:

  • 你能发布更多的错误细节吗?
  • SwitchTo() 不适用于 Appium。

标签: android alert appium


【解决方案1】:

您需要先获得警报,然后再尝试接受它

这是来自Appium Java Client Tests的一些代码:

wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();

这应该在大多数情况下都有效。

如果accept() 不起作用,请将driver.switchTo().alert();alert.accept(); 替换为找到按钮并单击它的代码。

如果在尝试/重试块中没有找到按钮包裹findElementBy(Method) 代码,然后然后点击它。

【讨论】:

  • 此代码只会让驱动程序切换到警报但它不会接受它
  • 用您可以尝试的更多解决方法/解决方案更新了我的答案。如果这些都不起作用,请粘贴您的 Appium 服务器日志
【解决方案2】:

最好的方法是使用 appium 检查器。单击元素并从中复制 resource-id。在 findElement(By.id()) 方法中使用此资源 id。

对我来说资源 ID:android:id/button1

((AndroidDriver) driver).findElement(By.id("android:id/button1")).click();

这适用于安卓系统。对于常规使用,您可以使用

driver.findElement(By.id("android:id/button1")).click();

【讨论】:

  • Appium 似乎无法像普通元素一样识别系统警报。你的代码有效吗?
【解决方案3】:

某些警报可能是原生 Android 的警报,不是由浏览器生成的。在这种情况下,以下代码:

Alert alert = driver.switchTo().alert(); alert.accept();

可能会抛出: WebDriverException: unknown error: unhandled inspector error: {"code":-32603,"message":"No JavaScript dialog to handle"}

要处理此类警报,只需切换到本机应用程序上下文,执行所需操作,然后切换回浏览器即可:

AppiumDriver<WebElement> appiumDriver = (AppiumDriver<WebElement>) webDriver;
String currentContext = appiumDriver.getContext();
appiumDriver.context("NATIVE_APP");

// actions within the alert
appiumDriver.findElements(By.xpath(OK_BUTTON_LOCATOR)).click(); // put locator instead of OK_BUTTON_LOCATOR
appiumDriver.context(currentContext);

// continue working

【讨论】:

    【解决方案4】:
    WebElement btn = driver.findElement(By.xpath("//android.widget.Button[@content-desc='OK']"));
    TouchAction act = new TouchAction(driver);
    act.tap(241,320).perform();
    

    (241,320) 这些是警报的 X 和 Y c 坐标 这对我来说非常适合

    【讨论】:

      【解决方案5】:

      Appium 具有接受、关闭警报的默认功能

      capabilities.SetCapability("autoAcceptAlerts", true);
      capabilities.SetCapability("autoDismissAlerts", true);
      

      【讨论】:

      • 你能告诉我在 ruby​​ 中设置为 true 的语法吗?
      • 请注意 - 使用这些功能将导致 Appium 自动接受或关闭警报。
      【解决方案6】:

      请使用下面的代码,在点击确定按钮之前添加一些等待。 之后通过你确定按钮的xpath。

      synchronized (driver)
      {
      driver.wait(2000);
      }
      driver.context(NATIVE_APP);
      driver.findElementByXPath{("//android.widget.Button[@resourceid=
      ‘android:id/button1’]").click();
      

      【讨论】:

      • 为什么wait()此处在这里?不要只是发布代码,添加一个解释为什么它的工作原理。 span>
      【解决方案7】:

      如果警报显示在 Ui 上,当我们需要等待时会花费更多时间来显示..我们可以使用 fluent wait 来代替这个..

      【讨论】:

        【解决方案8】:

        因此,对此的更新答案是:AlertDialog 是系统级元素,因此您应该使用单击接受按钮:

        androidDriver.findElementById("android:id/button1").click()
        

        如果取消,请执行以下操作:

        androidDriver.findElementById("android:id/button2").click()
        

        【讨论】:

          【解决方案9】:

          //首先检查警报是否存在

          public boolean isAlertPresent() {
              try {
                  mobDriver.switchTo().alert();
                  log.info("ALERT IS PRESENT !! ");
                  return true;
              } catch (Exception e) {
                  log.info("ALERT IS NOT PRESENT !! ");
                  return false;
              }
          }
          
          public void mobileAlertHandle() {
              if (isAlertPresent()) {
                  Alert alert = mobDriver.switchTo().alert();
                  alert.accept();
             }
          }
          

          如果这不起作用,请检查您的元素并尝试使用 id 或 name

          例如:mobDriver.findElementById("android:id/button2").click()

          【讨论】:

            猜你喜欢
            • 2017-01-16
            • 2016-05-21
            • 2015-03-23
            • 1970-01-01
            • 2017-02-26
            • 1970-01-01
            • 1970-01-01
            • 2020-01-17
            • 1970-01-01
            相关资源
            最近更新 更多