18

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

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

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


第一种方法是重新打开一个新会话

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

第二种方法是使用机器人类

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

然而,这种方法不是时间有效的。有没有更好的办法?

4

8 回答 8

35

这应该可以解决问题:

driver.switchTo().alert().accept();
于 2013-10-04T04:35:45.727 回答
19

在 Selenium 中处理警报的方法

  1. 单独决定每个

如果您需要单独对测试中的每个警报采取措施,驱动程序会为您提供切换到警报的选项并决定接受或关闭它。

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

  1. 默认设置处理

当您希望以相同的方式处理所有警报时,您可以在测试执行开始时将全局功能设置为默认情况下的ACCEPTINGOREDISMISS警报出现时。

capabilities.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT);

  1. 使用机器人类

或者,您可以使用 Robot 类发送一个 Enter 键事件,该事件将接受警报。

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

于 2015-12-08T01:22:33.367 回答
4

尝试这个,

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

我希望这对你有帮助。

于 2013-10-04T05:15:36.763 回答
2

更常见的是,这个问题很麻烦,因为它出现在被测系统中不可预测的地方。现在,我认为没有办法通过 webdriver 中的配置来自动处理所有这些 un​​cretainities。我的一般建议是将 webDriver 包装在 Proxy 中,并使用某种动态代理来包装所有 webdriver 方法。通过这种方式,您可以对不可预测的警报进行单点控制,进行日志记录或评估方法性能,处理随机无法访问的浏览器异常,处理随机 StaleElementException 等。我发现这对于各种情况都非常有用,但性能损失很小.

        Class WebDriverProxy implements InvocationHandler{
       WebDriverWrapperImpl impl = new WebDriverWrapperImpl();

        public String clickByXPath(String xpath)  {
            return (String)handleInvocation(impl,"clickByXPath", new Object[]{xpath});
            //  return impl.clickByXPath( xpath) ;
        }


    /**All fail fast strategies could be centralized here., no need of any assertion errors in libraries,
         * However it makes sense to wrap webdriver exceptions as either recoverable or nonrecoverable
         * recoverable ones are like unexpected hangs on the browser, which could be handled at the test runner level, wherein the 
         * whole test can be retried.
         * irrecoverable ones are also mostly handled at the test runner level, but capable of being caught at the test script level *  
         **/
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {
            Object o = null;
            Throwable target = null;
            try{
                o = method.invoke(proxy, args);
            }       
            catch(InvocationTargetException ee){            
                target = ee.getTargetException();
                throw target;
            }
            return o;
        }

        public Object handleInvocation(Object proxy, String method, Object[] args){     

            Object toReturn = null;
            Method m = null;
            Class[] classes = new Class[args.length];
            for(int i = 0;i<args.length;i++){
                classes[i]=String.class;
            }
            for(Object x:args){
            logBuffer.append(x.toString()+","); 
            }
            log.trace("WebDriverProxy. "+method+"("+logBuffer.toString()+")");
            logBuffer = new StringBuffer();
            try{
                 m = proxy.getClass().getMethod(method,classes);

                toReturn = invoke(proxy,m, args);

            }catch(NoSuchMethodException e){    
                e.printStackTrace();

            }catch( StaleElementReferenceException e){
                log.debug("Exception was of tye "+e.getClass().getCanonicalName());






            }
            catch(UnreachableBrowserException | NoSuchElementException e){
                log.debug("Exception was of tye "+e.getClass().getCanonicalName());
                //If the NoSuchelement is due to suspect Alerts being present, switchToAlert() and alert.accept() here.
            }



            return toReturn;
        }



        }


class WebDriverWrapperImpl {
 WebDriver driver = new ChromeDriver();
  public String clickByXPath(String xpath)  throws Exception{
            driver.findElement(By.Xpath(xpath)).click();
            return driver.getTitle();
        }

}
于 2017-03-01T12:28:24.577 回答
1

配置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);
于 2019-03-30T00:31:09.607 回答
1
ChromeOptions options = new ChromeOptions();
options.setUnhandledPromptBehaviour(ACCEPT);
WebDriver driver = new ChromeDriver(options);

而不是您可以 根据您的要求传递ACCEPT以下枚举常量ACCEPT, ACCEPT_AND_NOTIFY, DISMISS, 。DISMISS_AND_NOTIFYIGNORE

于 2019-09-27T18:46:21.820 回答
0

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

于 2014-10-05T04:15:20.270 回答
0

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

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

于 2021-07-16T05:21:18.040 回答