我正在尝试使用selenium WebDriver处理对话框(Ok Cancel type)。所以我的目标是点击“确定”按钮。
情景是:
点击按钮以调用对话框
button.click()
;
尝试接受
webDriver.switchTo().alert().accept()
;
但我总是得到NoAlertPresentException并且看到该对话框几乎立即关闭。 在我看来,Selenium自动关闭对话框,当我想接受时,没有什么可以接受的。
我很抱歉我的英语不好。
答案 0 :(得分:6)
此问题的常见原因是Selenium太快并且尝试接受浏览器尚未打开的警报。这可以通过明确的等待来简单地解决:
button.click();
WebDriverWait wait = new WebDriverWait(driver, 5);
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
alert.accept();
答案 1 :(得分:1)
Step 1:
public boolean isAlertPresent(){
boolean foundAlert = false;
WebDriverWait wait = new WebDriverWait(driver, 0 /*timeout in seconds*/);
try {
wait.until(ExpectedConditions.alertIsPresent());
foundAlert = true;
System.out.println("isAlertPresent : " +foundAlert);
} catch (TimeoutException eTO) {
foundAlert = false;
System.out.println("isAlertPresent : " +foundAlert);
}
return foundAlert;
}
Step 2:
public boolean tocheck_POP_Dialog()
{ Alert alert;
try
{
alert=driver.switchTo().alert();
}
catch(NoSuchElementException elementException)
{
return false;
}
alert.accept(); //Close Alert popup
return true;
}
Step 3 :
if(dummyPage.isAlertPresent())
{
dummyPage.tocheck_POP_Dialog();
}
答案 2 :(得分:0)
public boolean isAlertPresent(){
try{
Alert a = new WebDriverWait(driver, 10).until(ExpectedConditions.alertIsPresent());
if(a!=null){
System.out.println("Alert is present");
driver.switchTo().alert().accept();
return true;
}else{
throw new Throwable();
}
}
catch (Throwable e) {
System.err.println("Alert isn't present!!");
return false;
}
}
使用显式等待检查警报,然后执行操作。这可能对你有帮助。 :)
答案 3 :(得分:0)
通常会发生这种情况,因为Selenium命令运行得太快,它会在打开之前尝试关闭警报。因此,在点击事件后添加延迟应该可以解决问题。此外,如果您使用Safari浏览器进行测试,SafariDriver在处理警报时会遇到一些问题。 SafariDriver cannot handle alerts应该为您提供更多详细信息。
答案 4 :(得分:0)
一些其他信息。对于该线程的未来读者:
如果即使在解决了等待方面之后该异常仍然存在,请检查以下步骤序列在测试脚本中是否有效:
出于某些目的(例如查找表单错误)查询/解析了基本HTML页面的DOM
(在driver.switch_to.alert被尝试之前)
在“ HTML”页面上显示警报时,如果忽略了该警报,并且首先查询了“ HTML”页面下面的DOM,则Webdriver似乎会松动警报并导致异常。
使用以下工具观察到该问题:geckodriver 0.21.0,Firefox 66.0b10(64位); python 3.6.1 Selenium驱动程序3.14(适用于Python)。
在发现(1)之前执行(2)即可解决问题。