首页 > 解决方案 > 在 Selenium (Firefox/Chrome) 中禁用页面加载时的打印对话框窗口

问题描述

我想禁用或取消使用 Selenium 加载页面时自动弹出的打印窗口。

我所达到的最好的方法是使用 Robot 类按 Escape 键。但是,这也不会一直关闭弹出窗口。它的工作率为 80%。目前,我在页面加载后等待 1 秒后按了三次退出键。

我发现我们可以添加以下两个首选项(firefox):

options.addPreference("print.always_print_silent", true)
options.addPreference("print.show_print_progress", false)

这不允许显示打印对话框,但打印会排队,因为它是静默工作的。

我还尝试了以下覆盖window.print函数的代码。

js.executeScript("window.print=function(){};")

这适用于我们可以在单击将打印某些内容的元素之前禁用打印的页面。就我而言,没有这样的按钮,因为打印窗口会在页面加载时自动触发。

需要一些关于如何禁用打印窗口的指导。我需要 Firefox 和 Selenium 方面的帮助。(谷歌浏览器是可选的)

另外,我不知道目标网站的JS代码,也不知道是哪个JS触发了on page load事件。我试图识别但无法得到它。网站的 JS 代码也被混淆了。


我找到了在页面加载时弹出打印窗口的原因。这是因为以下 JS 代码库:

            n.iframeNode.on('load', function () {
                n.iframeNode[0].elem.contentWindow.print()
            }),

以下选项也是我尝试过的:

javascript.enabled1)使用标志禁用JS本身。当 JS 被禁用时,该网站甚至不会加载。

2)试图禁用 JS 事件,以便打印窗口事件不会触发使用dom.window.event.enabled. 这也不起作用(不知道这是否是正确的属性)。

3)查看代理概念,您可以在加载之前使用此答案更改 JS - https://stackoverflow.com/a/33854307/819866(不确定这是要走的路)

4)使用setPageLoadStrategy参数使其工作,但仍然徒劳。https://stackoverflow.com/a/56789926/819866

标签: javascriptseleniumfirefox

解决方案


对于 Chrome 浏览器,打印预览页面控件隐藏在ShadowDOM中,因此我建议通过 Selenium 单击“取消”按钮。我不建议使用机器人,因为如果/何时您将在Selenium Grid或并行运行测试 - 您将面临问题,因为您必须确保正确的浏览器窗口现在处于焦点/在窗口之间切换焦点不是那么微不足道

所以我建议确定“取消”按钮的路径:

在此处输入图像描述

并遍历它并单击它。示例 Java 代码:

new WebDriverWait(driver, 10).until(ExpectedConditions.numberOfWindowsToBe(2));
driver.switchTo().window(driver.getWindowHandles().stream().skip(1).findFirst().get());
WebElement printPreviewApp = driver.findElement(By.tagName("print-preview-app"));
WebElement printPreviewAppConten = expandShadowRoot(printPreviewApp, driver);
WebElement printPreviewSidebar = printPreviewAppConten.findElement(By.tagName("print-preview-sidebar"));
WebElement printPreviewSidebarContent = expandShadowRoot(printPreviewSidebar, driver);
WebElement printPreviewHeader = printPreviewSidebarContent.findElement(By.tagName("print-preview-header"));
WebElement printPreviewHeaderContent = expandShadowRoot(printPreviewHeader, driver);
printPreviewHeaderContent.findElements(By.tagName("paper-button")).get(1).click();

expandShadowRoot将给定的ShadowRoot转换为 Selenium 的WebElement的函数如下所示:

private WebElement expandShadowRoot(WebElement parent, WebDriver driver) {
    return (WebElement) ((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", parent);
}

推荐阅读