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 alert]()
![Second Alert]()
Я не могу понять, что делать сейчас. Проблема в том, что я не получаю это исключение всегда. И когда это происходит, тест терпит неудачу.
Ответы
Ответ 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();
}