it-roy-ru.com

org.openqa.Selenium.UnhandledAlertException: неожиданное открытие оповещения

Я использую Chrome Driver и пытаюсь протестировать веб-страницу. 

Обычно он работает нормально, но иногда я получаю исключения ...

 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

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

12
Shantanu Nandan

У меня тоже была эта пробема. Это произошло из-за поведения драйвера по умолчанию, когда он сталкивается с предупреждением. Поведение по умолчанию было установлено на «ПРИНЯТЬ», таким образом, предупреждение было закрыто автоматически, и 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();
    }
}
21
RotS

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

В C # - 

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

2
Sudara

Ваш переключатель для оповещения находится в пределах блока 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.
}
1
shri046

После события клика добавьте следующий код для обработки

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

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

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

0
user5495209

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

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

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

0
Sobhit Sharma