7

有谁知道如何禁用它?或者如何从已自动接受的警报中获取文本?

这段代码需要工作,

driver.findElement(By.xpath("//button[text() = \"Edit\"]")).click();//causes page to alert() something
Alert alert = driver.switchTo().alert();
alert.accept();
return alert.getText();

而是给出了这个错误

No alert is present (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 2.14 seconds

我正在使用带有 Selenium 2.32 的 FF 20

4

5 回答 5

11

就在前几天,我回答了类似的问题,所以它仍然很新鲜。您的代码失败的原因是,如果在处理代码时未显示警报,它将主要失败。

幸运的是,来自 Selenium WebDriver 的人已经为它实现了等待。因为您的代码就像这样做一样简单:

String alertText = "";
WebDriverWait wait = new WebDriverWait(driver, 5);
// This will wait for a maximum of 5 seconds, everytime wait is used

driver.findElement(By.xpath("//button[text() = \"Edit\"]")).click();//causes page to alert() something

wait.until(ExpectedConditions.alertIsPresent());
// Before you try to switch to the so given alert, he needs to be present.

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

return alertText;

ExpectedConditions 你可以从这里找到所有的 API ,如果你想要这个方法背后的代码在这里

这段代码也解决了这个问题,因为你不能在关闭警报后返回 alert.getText(),所以我为你存储了一个变量。

于 2013-05-09T12:15:55.430 回答
2

在您接受()警报之前,您需要获取文本。您现在正在做的是接受(单击“确定”)警报,然后在它离开屏幕后尝试获取警报文本,即不存在警报。

尝试以下操作,我刚刚添加了一个字符串来检索警报文本,然后返回该字符串。

driver.findElement(By.xpath("//button[text() = \"Edit\"]")).click();//causes page to
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
alert.accept();
return alertText;
于 2013-05-08T19:02:11.053 回答
1

Selenium webdriver 不wait用于警报。所以它会尝试切换到一个不存在的警报,这就是它失败的原因。

为了快速而不是那么好修复,放入sleep.

更好的解决方案是在尝试切换到警报之前实施您自己的等待警报方法。

更新

像这样,从这里复制粘贴

waitForAlert(WebDriver driver)
{
    int i=0;
   while(i++<5)
   {
        try
        {
            Alert alert3 = driver.switchTo().alert();
            break;
        }
        catch(NoAlertPresentException e)
        {
          Thread.sleep(1000)
          continue;
        }
   }
}
于 2013-05-08T19:31:29.150 回答
1

以下带有同步选项的方法将增加更多稳定性

protected Alert getAlert(long wait) throws InterruptedException
{
    WebDriverWait waitTime = new WebDriverWait(driver, wait);

    try
    {
        synchronized(waitTime)
        {
            Alert alert = driver.switchTo().alert();
            // if present consume the alert
            alert.accept();

            return alert;
        }

    }
    catch (NoAlertPresentException ex)
    {
        // Alert not present
        return null;
    }

}
于 2013-08-28T05:55:05.687 回答
0

这是JavaScript的答案。该文档包含所有语言的示例。 https://www.selenium.dev/documentation/en/webdriver/js_alerts_prompts_and_confirmations/

await driver.wait(until.alertIsPresent());    
el = driver.switchTo().alert();
await el.accept();
于 2020-04-30T21:40:04.457 回答