我正在尝试使用 selenium WebDriver 处理对话框(确定取消类型)。所以我的目标是单击“确定”按钮。
场景是:
单击按钮以调用对话框
button.click()
;尝试接受
webDriver.switchTo().alert().accept()
;
但我总是收到 NoAlertPresentException 并看到该对话框几乎立即关闭。在我看来,Selenium 会自动关闭对话框,当我想接受时,没有什么可以接受的。
我很抱歉我的英语不好。
我正在尝试使用 selenium WebDriver 处理对话框(确定取消类型)。所以我的目标是单击“确定”按钮。
场景是:
单击按钮以调用对话框
button.click()
;
尝试接受
webDriver.switchTo().alert().accept()
;
但我总是收到 NoAlertPresentException 并看到该对话框几乎立即关闭。在我看来,Selenium 会自动关闭对话框,当我想接受时,没有什么可以接受的。
我很抱歉我的英语不好。
此问题的通常原因是 Selenium 太快并尝试接受尚未被浏览器打开的警报。这可以通过显式等待来简单地解决:
button.click();
WebDriverWait wait = new WebDriverWait(driver, 5);
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
alert.accept();
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();
}
通常发生这种情况是因为 Selenium 命令运行得太快,并且它试图在警报打开之前关闭它。因此,在点击事件后添加延迟应该可以解决问题。此外,如果您使用 Safari 浏览器进行测试,SafariDriver 在处理警报方面存在一些问题。SafariDriver 无法处理警报应该为您提供更多详细信息。
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;
}
}
使用显式等待检查警报,然后执行操作。这可能会帮助你。:)
一些额外的信息。对于该线程的未来读者:
如果在解决等待方面后此异常仍然存在,请检查以下步骤序列在测试脚本中是否有效:
出于某种目的查询/解析底层 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) 可以解决问题。