Selenium2 打印弹窗的解决方法
我现在正在做一个程序,利用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 个回答
你可以试试以前在Selenium支持alert
消息之前的一个解决办法。简单来说,就是想办法让print
这个功能不做任何事情。
所以你可以在测试开始的时候这样做:
driver.execute_script("window.print = function() {}");
(抱歉,如果代码不正确,我不太常用python)。
这样一来,当页面调用window.print()
时,就不会发生任何事情,你的测试就可以继续进行,不会被打断。
我终于找到了一种解决办法:
我把
"print.always_print_silent": "true",
"print.show_print_progress": "false",
粘贴到了Firefox的用户配置文件里。Selenium有自己默认的用户配置文件,你可以对它进行编辑。这个配置文件的名称是firefox_profile.py。
请注意,这样做只是让打印功能可以直接使用,而不会弹出窗口询问用户。这对我来说有效,因为我没有连接打印机。
我在r-kiosk插件的介绍中找到了这两行代码。