如何处理“意外警报打开”?

时间:2013-10-04 04:22:37

标签: java selenium

由于弹出窗口,我遇到了Selenium抛出timeout exception的问题

  unexpected alert open
  not provide any stacktrace information)
  Command duration or timeout: 5 milliseconds

警报包含OKCANCEL按钮。我知道有两种方法来处理这个


第一种方法是重新开启新会话

driver.quit();
driver = new ChromeDriver();

第二种方法是使用Robot类

Robot r = new Robot();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);

但是,这种方法不具备时间效率。还有更好的办法吗?

8 个答案:

答案 0 :(得分:25)

这应该可以解决问题:

driver.switchTo().alert().accept();

答案 1 :(得分:11)

在Selenium中处理警报的方法

  1. 单独决定
  2. 如果您在测试中需要其中一些警报,则可以使用以下方法单独处理每个警报:

    driver.switchTo().alert().accept();
    
    1. 默认处理设置
    2. 要真正节省时间,您可以在测试执行开始时将chrome capabilites设置为 ACCEPT INGORE DISMISS 警告显示默认

      示例:

      capabilities.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT);
      
      1. 使用机器人类
      2.   

        机器人r =新机器人();

             

        r.keyPress(KeyEvent.VK_ENTER);

             

        r.keyRelease(KeyEvent.VK_ENTER);

        1. 重新开启新会话
        2.   

          driver.quit();

               

          driver = new ChromeDriver();

答案 2 :(得分:3)

试试这个,

public boolean isAlertPresent() {

    boolean presentFlag = false;

    try {

        // Check the presence of alert
        Alert alert = driver.switchTo().alert();
        // Alert present; set the flag
        presentFlag = true;
        // if present consume the alert
        alert.accept();
        //( Now, click on ok or cancel button )

    } catch (NoAlertPresentException ex) {
        // Alert not present
        ex.printStackTrace();
    }

    return presentFlag;
}

我希望这会对你有所帮助。

答案 3 :(得分:1)

更常见的是,这个问题很麻烦,因为它出现在被测系统中不可预测的地方。现在,我不认为存在通过webdriver中的配置自动处理所有这些不一致的方法。我的一般建议是将webDriver包装在一个代理中,并使用某种动态代理来包装所有的webdriver方法。通过这种方式,您可以获得对不可预测警报的单点控制,获取记录或评估方法性能,处理随机unreachableBrowser异常,处理随机StaleElementException等。我发现这对于各种情况非常有用,性能损失很小

<td id="{@id}">
    <!-- more -->
</td>

答案 4 :(得分:0)

如果你正在使用像TestNG这样的任何框架,你可以使用像ITestListener e.t.c这样的监听器,你必须覆盖一些像BeforeCommand和afterCommand这样的方法。因此在BeforeCommand中,实现警报代码以解除并检查美观。当执行selenium命令时,此beforeCommand方法将自动调用并检查是否存在警报。如果是,它将解除并执行您的命令。我希望它能解决你的问题

答案 5 :(得分:0)

配置DesiredCapabilities接受意外的更改行为。

final DesiredCapabilities chromeCapabilities = DesiredCapabilities.chrome();
chromeCapabilities.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT);
final ChromeOptions chromeOptions = new ChromeOptions();
/*
 * Other options...
 */
chromeCapabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
ChromDrvier driver = new ChromeDriver(chromeCapabilities);

答案 6 :(得分:0)

ChromeOptions options = new ChromeOptions();
options.setUnhandledPromptBehaviour(ACCEPT);
WebDriver driver = new ChromeDriver(options);

您可以通过传递而不是ACCEPT 以下枚举常量ACCEPTACCEPT_AND_NOTIFYDISMISSDISMISS_AND_NOTIFYIGNORE 根据您的要求。

答案 7 :(得分:0)

Java 也可以做到这一点。创建 Java 类并实现 InvocationHandler 接口。覆盖 invoke 方法,在此方法中有您的逻辑来处理警报/弹出或您想要处理的任何事件。然后用你的 Webelement 包装这个类实例,所以每当它对每个 webelement 执行任何操作时,它都会调用这个包装方法。

希望这会有所帮助 - 这是实现 https://www.vinsguru.com/selenium-webdriver-how-to-handle-annoying-random-popup-alerts/

的链接