我正在使用 selenium webDriver 为 Web 应用程序编写测试,并遇到了一个场景,当我尝试关闭浏览器时,我会收到一个弹出窗口,显示“您确定吗?该页面要求您确认是否要离开 - 输入的数据会迷路。”有 2 个按钮:离开页面和留在页面
如何点击这些按钮?
( ( JavascriptExecutor ) _driver )
.executeScript( "window.onbeforeunload = function(e){};" );
为我解决了问题
IAlert alert = driver.SwitchTo().Alert();
alert.Accept(); //for two buttons, choose the affirmative one
// or
alert.Dismiss(); //to cancel the affirmative decision, i.e., pop up will be dismissed and no action will take place
您可以使用 Alert API 与警报等进行交互。切换到警报并确认它看起来像这样(在 Java 中):
Alert alert = driver.switchTo().alert();
alert.accept();
这也在 Selenium FAQ 中进行了解释。
def close_all_popups(driver):
driver.window_handles
for h in driver.window_handles[1:]:
driver.switch_to_window(h)
driver.close()
driver.switch_to_window(driver.window_handles[0])
您可以尝试使用键盘事件。 一旦窗口弹出:
点击“确定”按钮。
driver.Keyboard.PressKey(Keys.Tab);
您必须尝试看看需要按多少次选项卡。
然后点击空格。
driver.Keyboard.PressKey(Keys.Space);
是的,这有点像黑客,但 WebDriver 仍然相当不成熟。
编辑:这适用于“真正的”弹出窗口,但正如另一位回答者所说,可能不适用于奇怪的页面内内容。 基本上,如果您可以手动切换到关闭按钮,则此方法应该有效。
不确定您使用的弹出窗口的结构是什么。 如果您使用过 as 弹出窗口,那么这里有一些可能对您有用。
如果是警报。你可以尝试:
driver.SwitchTo().Alert()
如果弹出一个窗口,则:
driver.SwitchTo().Window(<windowname>)
对于 iFrame:
driver.SwitchTo().Frame("iFrmLinks")
一旦完成三者中的任何一个,您就可以访问其所有内部元素。
问候 塔希尔
当我有字段形式和“完成编辑”提交按钮时,我遇到了同样的问题,因为当 Selenium IDE 自动单击 javascript 函数时,负责禁用确认窗口(离开页面或仍在页面上),它不接受“mouseup”鼠标事件,这意味着 window.confirm 仍然有效并且自动通过测试失败。在这种情况下,我的解决方案是覆盖 javascript 函数window.onbeforeunload(无需询问我们是否知道在 Selenium IDE 中记录测试时我们会这样做)。您可以在 Selnium IDE 中运行覆盖脚本,然后通过 selenium.runScript 单击“保存”(或类似的内容)按钮 - 它应该简单地禁用确认窗口。
Command: runScript
Target: {window.onbeforeunload=function(e){};}
您需要使用 try catch 块来处理意外警报。将代码放入 try 块并捕获“UnhandledAlertException”
示例:
try{
.....
.....
code here
}catch(UnhandledAlertException e ){
driver.switchto().alert().dismiss();
}
这里禁用所有弹出窗口
Dictionary<string, object> commandParameters = new Dictionary<string, object>
{
["source"] = @"
window.alert = function() {};
window.confirm = function() { return true; };
window.prompt = function(message, defaultValue) { return null; };
window.onbeforeunload = function(){};
window.setInterval(function(){window.onbeforeunload = function(){};},1);
let func_addEventListener = window.addEventListener;
window.addEventListener = function(type,listener,options){ if(type != 'beforeunload') func_addEventListener(type,listener,options);}"
};
chromeDriver.ExecuteCdpCommand("Page.addScriptToEvaluateOnNewDocument", commandParameters);
setInterval
可能会延迟一点,请确保在离开页面之前延迟一点
将其中之一放在点击事件之前:
selenium.chooseCancelOnNextConfirmation()
selenium.chooseOkOnNextConfirmation()