繁体   English   中英

如何使用 appium 在 android 中处理警报

[英]how to handle alerts in android using appium

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

以下代码不适用于android:

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

错误信息:

> -modal window does not get closed

在尝试接受警报之前,您需要先获得警报

这是来自一些Appium Java 客户端测试的代码

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

这应该在大部分时间都有效。

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

如果没有找到按钮,请在 try/retry 块中包装findElementBy(Method)代码,然后单击它。

最好的方法是使用 appium 检查器。 单击该元素并从中复制资源 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();

一些警报可能是原生 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
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 坐标这对我来说非常有用

Appium 具有接受、解除警报的默认功能

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

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

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

如果警告显示在 Ui 上,当我们需要等待时需要更多时间来显示..我们可以使用流畅的等待而不是这个..

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

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

否则取消执行此操作:

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

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

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM