Selenium自动接受警报

时间:2013-05-08 18:57:19

标签: java selenium webdriver alert

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

此代码需要工作,

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

我正在使用FF 20和Selenium 2.32

5 个答案:

答案 0 :(得分:6)

就在前几天,我已经回答了类似的事情,所以它仍然很新鲜。您的代码失败的原因是,如果在处理代码时未显示警报,它将大部分失败。

谢天谢地,来自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 here中的所有API,如果您想要此方法背后的代码here

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

答案 1 :(得分:1)

在接受()之前,您需要获取文本提醒。您现在正在做的是接受(点击“确定”)警报然后尝试在屏幕退出屏幕后获取警报文本,即没有警报。

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

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

答案 2 :(得分:1)

Selenium webdriver没有wait警报。 因此它会尝试切换到不存在的警报,这就是它失败的原因。

对于快速而不太好的修复,请输入sleep

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

<强>更新

像这样的东西,从here

粘贴的副本
waitForAlert(WebDriver driver)
{
    int i=0;
   while(i++<5)
   {
        try
        {
            Alert alert3 = driver.switchTo().alert();
            break;
        }
        catch(NoAlertPresentException e)
        {
          Thread.sleep(1000)
          continue;
        }
   }
}

答案 3 :(得分:1)

使用synchronized选项的以下方法将增加更多稳定性

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;
    }

}

答案 4 :(得分: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();