【发布时间】:2023-03-08 23:46:01
【问题描述】:
我有一个测试已经运行好几个月了。它所做的一件事是引发警报,然后验证警报文本。这是使用 Selenium、Java 和 Chrome 驱动程序 76.0.3809.68 运行的。
最近它一直给我错误:
“没有这样的警报”。
发生的情况是它单击一个按钮并等待警报(如果有):
try {
button.click();
} catch (UnhandledAlertException ex) {
// nothing
}
// then here goes code to accept the alert and get the text
在单步执行时,我看到了警报。当我运行它时,我看到了警报,但它消失了。我确实在(Chrome 驱动程序)发行说明中阅读了一些关于意外警报的内容,但有点含糊。
我们有一个为 Chrome 设置选项的全局页面,但每个人都在使用它,我不想为其他人搞砸。我在本地做了(没有 git push),当我在创建驱动程序之前设置选项时它工作了。
然后我尝试这样做,这似乎不起作用。是否应该,或者一旦检索到网页,您可以不更改选项吗?
// Somewhere after web page retrieved this gets called:
public void setIgnoreAlert() {
ChromeDriver cd = (ChromeDriver) driver;
ChromeOptions cap = new ChromeOptions();
cap.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);
Capabilities other = cap;
cd.getCapabilities().merge(other);
}
我真的希望这能奏效,但没有。您是否必须在 Chrome 实例出现之前设置行为?也就是不能像我上面那样设置吗?关于 Chrome 实例启动后如何设置它的任何其他建议?
--- 稍后添加以回答问题
这是在带有 button.click() 的 try-catch 块之后立即完成的:
configPage.getAndHandleAlertPopUp() 方法执行以下操作:
public String getAndHandleAlertPopUp() {
Alert alert = driver.switchTo().alert();
String alertPopup = alert.getText();
alert.accept();
return alertPopup;
}
【问题讨论】:
-
在初始化驱动之前在选项中设置。 options.setUnhandledPromptBehaviour(UnexpectedAlertBehaviour.IGNORE) 如果警报仍然存在,这将在执行某些后续操作时引发期望。如果你自己处理警报,你应该会很好。
-
顺便说一句,默认似乎是 DISMISS_AND_NOTIFY 现在...关闭提示,但仍然抛出异常(我猜这是“通知”部分)。 ACCEPT 和 DISMISS 将关闭所有提示而不抛出异常。
-
顺便说一句,如果您可以保留选项,但请注意,您必须在提示出现时立即处理。您用于检查文本的代码可能会抛出异常,具体取决于它的作用。这显示了新 Chrome 驱动程序遵循的 W3C 算法:w3.org/TR/webdriver1/#navigation 每当您看到“处理任何用户提示”......这就是意外警报行为发挥作用的地方。
标签: selenium google-chrome selenium-chromedriver alert webdriverwait