簡體   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