Ответ 1
Это должно сделать трюк:
driver.switchTo().alert().accept();
У меня возникла проблема с 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);
Однако эти методы неэффективны по времени. Есть ли лучший способ?
Это должно сделать трюк:
driver.switchTo().alert().accept();
Если вам нужны некоторые из этих предупреждений в ваших тестах, у вас есть возможность обрабатывать каждое предупреждение индивидуально, используя:
driver.switchTo().alert().accept();
Чтобы сэкономить время, вы можете установить для Chrome capabilites в начале выполнения теста значение ПРИНЯТЬ, INGORE или DISMISS с помощью по умолчанию, когда они появляются.
Пример:
capabilities.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT);
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
driver.quit();
driver = new ChromeDriver();
Попробуйте это,
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;
}
Надеюсь, это поможет вам.
Чаще всего эта проблема беспокоит то, что она появляется в непредсказуемых местах в тестируемой системе. Прямо сейчас, я не думаю, что существует способ полностью обрабатывать ВСЕ эти непокрытия автоматически путем настройки в 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();
}
}
Если вы используете какие-либо фреймворки, такие как TestNG, вы можете использовать Listeners, например ITestListener e.t.c, где вам необходимо переопределить некоторые из методов, таких как BeforeCommand и afterCommand. Поэтому в BeforeCommand реализуйте код для предупреждения, чтобы уволить и проверить красоту. Когда когда-либо выполняется команда selenium, этот метод beforeCommand вызывается автоматически и проверяет наличие оповещения или нет. Если да, то это отклонит и выполнит вашу команду. Я надеюсь, что он решит проблему u/
Настройте 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);
ChromeOptions options = new ChromeOptions();
options.setUnhandledPromptBehaviour(ACCEPT);
WebDriver driver = new ChromeDriver(options);
Вместо ACCEPT
вы можете передать
следующие константы перечисления ACCEPT
, ACCEPT_AND_NOTIFY
, DISMISS
, DISMISS_AND_NOTIFY
, IGNORE
согласно вашему требованию