Selenium2 打印弹窗的解决方法

3 投票
2 回答
2547 浏览
提问于 2025-04-17 07:21

我现在正在做一个程序,利用selenium的webdriver和火狐浏览器,自动浏览网站,抓取所有可见的文本。这段程序是用python写的。

当selenium打开包含javascript的页面时,比如使用了window.print(),程序就会停下来,等我手动点击弹出的窗口上的“关闭”按钮。

我尝试过使用driver.select_pop_up()这个功能,想在延迟一段时间后选择这个窗口,然后关闭它。但是我没能成功选择到这个窗口。

我查了一些资料,从这个selenium的常见问题页面上,我基本得出结论,遇到这个问题时我需要找个变通办法,因为上面提到:

要解决这个问题,你可以尝试一些变通方法(如果有的话);否则你可能需要把这个测试从自动化测试中排除。

我唯一想到的解决办法就是不打开包含“print”这个词的链接描述的网页,但我觉得这样不好看,所以想听听有没有人有更好的主意。

下面是一个展示我问题的代码示例:

from selenium               import webdriver  
import time

skrivutsiden = 'www.alfkvam.no/index.php?id=4849944&cat=159037&printable=1'
vanligside = 'http://www.google.no'

driver = webdriver.Firefox()

driver.get(vanligside)
driver.get(skrivutsiden)

编辑:

使用prestomanifesto提议的代码,我实际上在一个空的火狐窗口中成功触发了一个“打印弹出窗口”。当代码产生我想避免的事件时,我在想是不是一开始代码就写错了?这是个错误的结论吗?

下面的代码产生了弹出窗口:

from selenium               import webdriver  
import time

driver = webdriver.Firefox()
driver.execute_script("window.print() = function() {}")

再次编辑:

上面的代码之所以会触发弹出窗口,是因为我写错了javascript - 我写成了:

"window.print() = function() {}"

而正确的写法应该是:

"window.print = function() {}"

这并没有解决最初的问题,但解释了第一次编辑中提到的意外弹出窗口。

对不起,prestomanifesto。

再次编辑:

更新尝试的解决方案。我找到这个网站,上面提到了一段代码:

((JavascriptExecutor)m_driver).executeScript("window.confirm = function(msg){return
false;};");

基于这个,我尝试了以下代码,但没有成功:

driver.execute_script("window.print = function(msg) {return false;};")

2 个回答

2

你可以试试以前在Selenium支持alert消息之前的一个解决办法。简单来说,就是想办法让print这个功能不做任何事情。

所以你可以在测试开始的时候这样做:

driver.execute_script("window.print = function() {}");

(抱歉,如果代码不正确,我不太常用python)。

这样一来,当页面调用window.print()时,就不会发生任何事情,你的测试就可以继续进行,不会被打断。

5

我终于找到了一种解决办法:

我把

    "print.always_print_silent": "true",
    "print.show_print_progress": "false",

粘贴到了Firefox的用户配置文件里。Selenium有自己默认的用户配置文件,你可以对它进行编辑。这个配置文件的名称是firefox_profile.py。

请注意,这样做只是让打印功能可以直接使用,而不会弹出窗口询问用户。这对我来说有效,因为我没有连接打印机。

我在r-kiosk插件的介绍中找到了这两行代码。

撰写回答