Org.openqa.selenium.UnhandledAlertException: неожиданное предупреждение открыто - программирование

Org.openqa.selenium.UnhandledAlertException: неожиданное предупреждение открыто

Я использую драйвер 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

Я не могу понять, что делать сейчас. Проблема в том, что я не получаю это исключение всегда. И когда это происходит, тест терпит неудачу.

4b9b3361

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

Вы можете использовать функциональность Wait в Selenium WebDriver, чтобы дождаться оповещения и принять ее, когда она доступна.

В С# -

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 секунд, пока не появится предупреждение, вы можете поймать исключение и справиться с ним, если ожидаемое предупреждение недоступно.

Ответ 3

Является ли ваш коммутатор предупреждением в блоке try/catch? Вы также можете добавить тайм-аут ожидания, чтобы узнать, появляется ли предупреждение после некоторой задержки

try {
    // Add a wait timeout before this statement to make 
    // sure you are not checking for the alert too soon.
    Alert alt = driver.switchTo().alert();
    alt.accept();
} catch(NoAlertPresentException noe) {
    // No alert found on page, proceed with test.
}

Ответ 4

После события click добавьте этот ниже код для обработки

    try{
         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
       }
 catch (org.openqa.selenium.UnhandledAlertException e) {                
         Alert alert = driver.switchTo().alert(); 
         String alertText = alert.getText().trim();
         System.out.println("Alert data: "+ alertText);
         alert.dismiss();}

... делать другие вещи  driver.close();

Ответ 5

DesiredCapabilities firefox = DesiredCapabilities.firefox();
firefox.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);

Вы можете использовать UnexpectedAlertBehaviour.ACCEPT или UnexpectedAlertBehaviour.DISMISS

Ответ 6

Я столкнулся с той же проблемой, и я внес следующие изменения.

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

Это сработало потрясающе.

Ответ 7

Приведенный ниже код поможет обрабатывать неожиданные оповещения в селене

try{
} catch (Exception e) {
if(e.toString().contains("org.openqa.selenium.UnhandledAlertException"))
 {
    Alert alert = getDriver().switchTo().alert();
    alert.accept();
 }
}

Ответ 8

Вы можете попробовать этот фрагмент:

public void acceptAlertIfAvailable(long timeout)
      {
        long waitForAlert= System.currentTimeMillis() + timeout;
        boolean boolFound = false;
        do
        {
          try
          {
            Alert alert = this.driver.switchTo().alert();
            if (alert != null)
            {
              alert.accept();
              boolFound = true;
            }
          }
          catch (NoAlertPresentException ex) {}
        } while ((System.currentTimeMillis() < waitForAlert) && (!boolFound));
      }

Ответ 9

Следующее работает для меня

    private void acceptSecurityAlert() {

    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(10, TimeUnit.SECONDS)          
                                                            .pollingEvery(3, TimeUnit.SECONDS)          
                                                            .ignoring(NoSuchElementException.class);    
    Alert alert = wait.until(new Function<WebDriver, Alert>() {       

        public Alert apply(WebDriver driver) {

            try {

                return driver.switchTo().alert();

            } catch(NoAlertPresentException e) {

                return null;
            }
        }  
    });

    alert.accept();
}