org.openqa.selenium.UnhandledAlertException: unexpected alert open

我正在使用 Chrome 驱动程序并尝试测试网页。

通常它运行良好,但有时我会收到异常:

 org.openqa.selenium.UnhandledAlertException: unexpected alert open
 (Session info: chrome=38.0.2125.111)
 (Driver info: chromedriver=2.9.248315,platform=Windows NT 6.1 x86) (WARNING: The server did not  provide any stacktrace information)
 Command duration or timeout: 16 milliseconds: null
 Build info: version: '2.42.2', revision: '6a6995d', time: '2014-06-03 17:42:30'
 System info: host: 'Casper-PC', ip: '10.0.0.4', os.name: 'Windows 7', os.arch: 'x86', os.version:  '6.1', java.version: '1.8.0_25'
 Driver info: org.openqa.selenium.chrome.ChromeDriver

然后我尝试处理警报:

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

但这次我收到了:

org.openqa.selenium.NoAlertPresentException 

我附上了警报的屏幕截图:First Alert and by using esc or enter i gets the second alertSecond Alert

我现在不知道该怎么办。问题是我并不总是收到这个例外。当它发生时,测试失败。


答案 1

我也有这个问题。这是由于驱动程序在遇到警报时的默认行为。默认行为设置为“ACCEPT”,因此警报自动关闭,而 switchTo().alert() 找不到它。

解决方案是修改驱动程序的默认行为 (“IGNORE”),以便它不会关闭警报:

DesiredCapabilities dc = new DesiredCapabilities();
dc.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);
d = new FirefoxDriver(dc);

然后你可以处理它:

try {
    click(myButton);
} catch (UnhandledAlertException f) {
    try {
        Alert alert = driver.switchTo().alert();
        String alertText = alert.getText();
        System.out.println("Alert data: " + alertText);
        alert.accept();
    } catch (NoAlertPresentException e) {
        e.printStackTrace();
    }
}

答案 2

您可以使用 Selenium WebDriver 中的功能来等待警报,并在警报可用时接受它。Wait

在 C# 中 -

public static void HandleAlert(IWebDriver driver, WebDriverWait wait)
{
    if (wait == null)
    {
        wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
    }

    try
    {
        IAlert alert = wait.Until(drv => {
            try
            {
                return drv.SwitchTo().Alert();
            }
            catch (NoAlertPresentException)
            {
                return null;
            }
        });
        alert.Accept();
    }
    catch (WebDriverTimeoutException) { /* Ignore */ }
}

它在Java中的等效物 -

public static void HandleAlert(WebDriver driver, WebDriverWait wait) {
    if (wait == null) {
        wait = new WebDriverWait(driver, 5);
    }

    try {
        Alert alert = wait.Until(new ExpectedCondition<Alert>{
            return new ExpectedCondition<Alert>() {
              @Override
              public Alert apply(WebDriver driver) {
                try {
                  return driver.switchTo().alert();
                } catch (NoAlertPresentException e) {
                  return null;
                }
              }
            }
        });
        alert.Accept();
    } catch (WebDriverTimeoutException) { /* Ignore */ }
}

它将等待 5 秒钟,直到出现警报,如果预期的警报不可用,您可以捕获异常并进行处理。