由于弹出窗口,我遇到了Selenium抛出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);
但是,这种方法不具备时间效率。还有更好的办法吗?
答案 0 :(得分:25)
这应该可以解决问题:
driver.switchTo().alert().accept();
答案 1 :(得分:11)
如果您在测试中需要其中一些警报,则可以使用以下方法单独处理每个警报:
driver.switchTo().alert().accept();
要真正节省时间,您可以在测试执行开始时将chrome capabilites设置为 ACCEPT , INGORE 或 DISMISS 警告显示默认。
示例:
capabilities.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT);
机器人r =新机器人();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
driver.quit();
driver = new ChromeDriver();
答案 2 :(得分:3)
试试这个,
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;
}
我希望这会对你有所帮助。
答案 3 :(得分:1)
更常见的是,这个问题很麻烦,因为它出现在被测系统中不可预测的地方。现在,我不认为存在通过webdriver中的配置自动处理所有这些不一致的方法。我的一般建议是将webDriver包装在一个代理中,并使用某种动态代理来包装所有的webdriver方法。通过这种方式,您可以获得对不可预测警报的单点控制,获取记录或评估方法性能,处理随机unreachableBrowser异常,处理随机StaleElementException等。我发现这对于各种情况非常有用,性能损失很小
<td id="{@id}">
<!-- more -->
</td>
答案 4 :(得分:0)
如果你正在使用像TestNG这样的任何框架,你可以使用像ITestListener e.t.c这样的监听器,你必须覆盖一些像BeforeCommand和afterCommand这样的方法。因此在BeforeCommand中,实现警报代码以解除并检查美观。当执行selenium命令时,此beforeCommand方法将自动调用并检查是否存在警报。如果是,它将解除并执行您的命令。我希望它能解决你的问题
答案 5 :(得分:0)
配置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);
答案 6 :(得分:0)
ChromeOptions options = new ChromeOptions();
options.setUnhandledPromptBehaviour(ACCEPT);
WebDriver driver = new ChromeDriver(options);
您可以通过传递而不是ACCEPT
以下枚举常量ACCEPT
,ACCEPT_AND_NOTIFY
,DISMISS
,DISMISS_AND_NOTIFY
,IGNORE
根据您的要求。
答案 7 :(得分:0)
Java 也可以做到这一点。创建 Java 类并实现 InvocationHandler 接口。覆盖 invoke 方法,在此方法中有您的逻辑来处理警报/弹出或您想要处理的任何事件。然后用你的 Webelement 包装这个类实例,所以每当它对每个 webelement 执行任何操作时,它都会调用这个包装方法。
希望这会有所帮助 - 这是实现 https://www.vinsguru.com/selenium-webdriver-how-to-handle-annoying-random-popup-alerts/
的链接