Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Selenium(Firefox/Chrome)中禁用页面加载的打印对话框窗口_Javascript_Selenium_Firefox - Fatal编程技术网

Javascript 在Selenium(Firefox/Chrome)中禁用页面加载的打印对话框窗口

Javascript 在Selenium(Firefox/Chrome)中禁用页面加载的打印对话框窗口,javascript,selenium,firefox,Javascript,Selenium,Firefox,我想禁用或取消使用Selenium加载页面时自动弹出的打印窗口 我所能达到的最好效果就是使用Robot类按escape键。但是,这也不会一直关闭弹出窗口。它在80%的情况下都能工作。目前,在页面加载后等待1秒后,我按了三次escape键 我发现我们可以添加以下两个首选项(firefox): 这不允许显示“打印”对话框,但打印会在静默状态下排队 我还尝试了以下代码,这些代码覆盖了window.print函数 js.executeScript("window.print=function(){};"

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

我所能达到的最好效果就是使用Robot类按escape键。但是,这也不会一直关闭弹出窗口。它在80%的情况下都能工作。目前,在页面加载后等待1秒后,我按了三次escape键

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

这不允许显示“打印”对话框,但打印会在静默状态下排队

我还尝试了以下代码,这些代码覆盖了
window.print
函数

js.executeScript("window.print=function(){};")
这适用于我们可以在单击将打印内容的元素之前禁用打印的页面。在我的例子中,没有打印窗口在页面加载时自动触发的按钮

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

另外,我不知道目标网站的JS代码,也不知道哪个JS触发了页面加载事件。我试着辨认,但没能找到。网站的JS代码也被混淆了


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

            n.iframeNode.on('load', function () {
                n.iframeNode[0].elem.contentWindow.print()
            }),
以下选项也是我尝试过的:

1) 使用
javascript.enabled
标志禁用JS本身。当JS被禁用时,站点甚至不会加载

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

3) 查看了代理概念,您可以在使用此答案加载之前更改JS-(不确定这是正确的方法)


4) 使用
setPageLoadStrategy
参数使其工作,但仍然无效

对于Chrome浏览器,打印预览页面控件隐藏在中,因此我建议使用Selenium单击“取消”按钮。我不建议使用Robot,因为如果/当您将以并行或并行方式运行测试时,您将面临问题,因为您必须确保正确的浏览器窗口现在处于焦点位置/在窗口之间切换焦点,这并不是那么简单

因此,我建议确定“取消”按钮的路径:

然后遍历到它并单击它。示例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
函数,该函数将给定的

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

感谢谷歌Chrome打印窗口的详细信息。我们可以在Firefox打印窗口中识别取消按钮xpath吗?如果我检查元素,那么就不可能识别窗口的xpath。另外,可以有两种类型的打印窗口,一种是系统打印窗口,另一种是Firefox自定义打印窗口。对于Chrome,它很简单,只需使用.back()。对于Firefox,我不确定,但是您可以考虑通过在这里执行JavaScript来删除事件处理程序。找到“iframeNode”并删除onLoad标记(或将事件设置为nothing…)您已经说的一切都是正确的。唯一的问题是,JS代码的控件(删除iframe)在页面完全加载时出现(因为onload事件触发了print命令)。我希望
setPageLoadStrategy
在这种情况下可以工作,因为它不会等待页面加载执行下一个命令。然而,在设置
setPageLoadStrategy
之后,行为是相同的。啊,我没有想到这一点。在就绪状态之前不会添加处理程序,因此您还不能删除。也许可以尝试“急切”策略并删除iframe,或者创建自己的onload处理程序,从中删除所有处理程序。(不知道哪一个会首先触发…)似乎有可能在添加处理程序之前执行。我认为这取决于iframe的src,因为“eager”只是本地DOM。希望在geckodriver的下一版本中“SetUnhandledPromptBehavior”能够解决这个问题。好的,谢谢@pcalkins。将等待geckodriver的下一个版本。
private WebElement expandShadowRoot(WebElement parent, WebDriver driver) {
    return (WebElement) ((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", parent);
}