Selenium WebDriver 如何关闭浏览器弹出窗口

问题描述 投票:0回答:10

我正在使用 selenium webDriver 为 Web 应用程序编写测试,并遇到了一个场景,当我尝试关闭浏览器时,我会收到一个弹出窗口,显示“您确定吗?该页面要求您确认是否要离开 - 输入的数据会迷路。”有 2 个按钮:离开页面和留在页面

如何点击这些按钮?

selenium webdriver
10个回答
26
投票
 ( ( JavascriptExecutor ) _driver )
            .executeScript( "window.onbeforeunload = function(e){};" );

为我解决了问题


19
投票
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

13
投票

您可以使用 Alert API 与警报等进行交互。切换到警报并确认它看起来像这样(在 Java 中):

Alert alert = driver.switchTo().alert();
alert.accept();

这也在 Selenium FAQ 中进行了解释。


6
投票
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])

1
投票

您可以尝试使用键盘事件。 一旦窗口弹出:

点击“确定”按钮。

driver.Keyboard.PressKey(Keys.Tab);

您必须尝试看看需要按多少次选项卡。

然后点击空格。

driver.Keyboard.PressKey(Keys.Space);

是的,这有点像黑客,但 WebDriver 仍然相当不成熟。

编辑:这适用于“真正的”弹出窗口,但正如另一位回答者所说,可能不适用于奇怪的页面内内容。 基本上,如果您可以手动切换到关闭按钮,则此方法应该有效。


1
投票

不确定您使用的弹出窗口的结构是什么。 如果您使用过 as 弹出窗口,那么这里有一些可能对您有用。

如果是警报。你可以尝试:

driver.SwitchTo().Alert()

如果弹出一个窗口,则:

driver.SwitchTo().Window(<windowname>)

对于 iFrame:

driver.SwitchTo().Frame("iFrmLinks")

一旦完成三者中的任何一个,您就可以访问其所有内部元素。

问候 塔希尔


0
投票

当我有字段形式和“完成编辑”提交按钮时,我遇到了同样的问题,因为当 Selenium IDE 自动单击 javascript 函数时,负责禁用确认窗口(离开页面或仍在页面上),它不接受“mouseup”鼠标事件,这意味着 window.confirm 仍然有效并且自动通过测试失败。在这种情况下,我的解决方案是覆盖 javascript 函数window.onbeforeunload(无需询问我们是否知道在 Selenium IDE 中记录测试时我们会这样做)。您可以在 Selnium IDE 中运行覆盖脚本,然后通过 selenium.runScript 单击“保存”(或类似的内容)按钮 - 它应该简单地禁用确认窗口。

    Command: runScript
    Target: {window.onbeforeunload=function(e){};}

0
投票

您需要使用 try catch 块来处理意外警报。将代码放入 try 块并捕获“UnhandledAlertException”

示例:

try{
     .....
     .....
     code here
}catch(UnhandledAlertException e ){
    driver.switchto().alert().dismiss();
}

0
投票

这里禁用所有弹出窗口

    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
可能会延迟一点,请确保在离开页面之前延迟一点


-2
投票

将其中之一放在点击事件之前:

selenium.chooseCancelOnNextConfirmation()

selenium.chooseOkOnNextConfirmation()
© www.soinside.com 2019 - 2024. All rights reserved.