org.openqa.selenium.NoAlertPresentException: 没有打开警报

org.openqa.selenium.NoAlertPresentException: no alert open

我的测试检查我是否可以向邮件发送消息。 当我点击发送按钮时应该检查警报。

我的警报代码是:

        Alert alert = driver.switchTo().alert();
        System.out.println(alert.getText());
        alert.accept();
        Assert.assertTrue(alert.getText().contains("Thanks."));

我的错误是:

Starting ChromeDriver 2.25.426923 (0390b88869384d6eb0d5d09729679f934aab9eed) on port 13707
Only local connections are allowed.

org.openqa.selenium.NoAlertPresentException: no alert open
  (Session info: chrome=55.0.2883.87)
  (Driver info: chromedriver=2.25.426923 (0390b88869384d6eb0d5d09729679f934aab9eed),platform=Windows NT 6.3.9600 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 76 milliseconds
Build info: version: 'unknown', revision: '31c43c8', time: '2016-08-02 21:57:56 -0700'
System info: host: 'Gaga', ip: '192.168.1.6', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_101'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.25.426923 (0390b88869384d6eb0d5d09729679f934aab9eed), userDataDir=C:\Users\Dragana\AppData\Local\Temp\scoped_dir6652_7181}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=55.0.2883.87, platform=WIN8_1, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: b7131fce27b2ef40f1daff3c82188e7c

代码必须等待警报。下面是示例代码

try {
    WebDriverWait wait = new WebDriverWait(driver, 2);
    wait.until(ExpectedConditions.alertIsPresent());
    Alert alert = driver.switchTo().alert();
    System.out.println(alert.getText());
    alert.accept();
    Assert.assertTrue(alert.getText().contains("Thanks."));
} catch (Exception e) {
    //exception handling
}

这是一种非常糟糕的使用方法 try-catch,尤其是在基于 selenium 的测试用例中,应该限制它们的使用:

让我们了解这个问题的真正解决方案以及为什么给定的解决方案不正确,因为:

  1. 如果我们尝试在 alert.accept(); 之后调用 alert.getText(),很明显它会抛出错误,因为我们已经关闭了警报。

  2. 它工作正常,因为通过使用 try-catch,它将处理异常。

  3. 问题是这里从未检查断言。

代码:下面的代码每次都会在检查断言之前终止。

alert.accept();    
Assert.assertTrue(alert.getText().contains("Thanks."));

更正代码: alert.accept(); 应在获取文本后调用。

    WebDriverWait wait = new WebDriverWait(driver, 2);
    wait.until(ExpectedConditions.alertIsPresent());
    Alert alert = driver.switchTo().alert();
    Assert.assertTrue(alert.getText().contains("Thanks."));
    alert.accept();