Как обрабатывать "неожиданное предупреждение открыто"?

У меня возникла проблема с Selenium throw timeout exception из-за всплывающего окна

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

У предупреждения есть кнопки OK и CANCEL. Я знаю два способа справиться с этим


Первый способ - открыть новый сеанс

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

Второй способ - использовать класс Robot

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

Однако эти методы неэффективны по времени. Есть ли лучший способ?

Ответ 1

Это должно сделать трюк:

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

Ответ 2

Методы обработки оповещений в Selenium

  1. Определитесь с каждым индивидуально

Если вам нужны некоторые из этих предупреждений в ваших тестах, у вас есть возможность обрабатывать каждое предупреждение индивидуально, используя:

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

  1. Обрабатывать настройки по умолчанию

Чтобы сэкономить время, вы можете установить для Chrome capabilites в начале выполнения теста значение ПРИНЯТЬ, INGORE или DISMISS с помощью по умолчанию, когда они появляются.

Пример:

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

  1. Использование класса роботов

Robot r = new Robot();

r.keyPress(KeyEvent.VK_ENTER);

r.keyRelease(KeyEvent.VK_ENTER);


  1. Открыть новую сессию

driver.quit();

driver = new ChromeDriver();


Ответ 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;
}

Надеюсь, это поможет вам.

Ответ 4

Чаще всего эта проблема беспокоит то, что она появляется в непредсказуемых местах в тестируемой системе. Прямо сейчас, я не думаю, что существует способ полностью обрабатывать ВСЕ эти непокрытия автоматически путем настройки в webdriver. Моим общим советом было бы обернуть webDriver в прокси и использовать какой-то динамический прокси, чтобы обернуть все методы 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();
        }

}

Ответ 5

Если вы используете какие-либо фреймворки, такие как TestNG, вы можете использовать Listeners, например ITestListener e.t.c, где вам необходимо переопределить некоторые из методов, таких как BeforeCommand и afterCommand. Поэтому в BeforeCommand реализуйте код для предупреждения, чтобы уволить и проверить красоту. Когда когда-либо выполняется команда selenium, этот метод beforeCommand вызывается автоматически и проверяет наличие оповещения или нет. Если да, то это отклонит и выполнит вашу команду. Я надеюсь, что он решит проблему u/

Ответ 6

Настройте 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);

Ответ 7

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

Вместо ACCEPT вы можете передать следующие константы перечисления ACCEPT, ACCEPT_AND_NOTIFY, DISMISS, DISMISS_AND_NOTIFY, IGNORE согласно вашему требованию