首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Selenium中处理Firefox打印对话框

如何在Selenium中处理Firefox打印对话框
EN

Stack Overflow用户
提问于 2021-08-15 04:25:14
回答 2查看 1.3K关注 0票数 4

我有以下代码:

代码语言:javascript
运行
复制
from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys
url = 'https://finance.yahoo.com/'
driver_path = 'geckodriver.exe'

browser = Firefox(executable_path = driver_path)
browser.get(url)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
profile.set_preference("browser.helperApps.neverAsk.openFile", "application/pdf")
search_field_id = 'yfin-usr-qry'

element_search_field = browser.find_element_by_id(search_field_id)
element_search_field.clear()
element_search_field.send_keys('TSLA')
element_search_field.send_keys(Keys.ENTER)
from selenium.webdriver import ActionChains
action_chains = ActionChains(browser)
action_chains.key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform()
xpath_string = '/html/body/div[1]/div/div/div[1]/div/div[2]/div/div/div[6]/div/div/section/div/ul/li[2]/a/span'
element = browser.find_element_by_xpath(xpath_string)
action_chains.move_to_element(element).click().perform()
browser.execute_script('window.print();')

弹出一个用于Firefox的打印对话框。我在想怎么才能接受呢。有没有办法绕过这个对话框直接打印,因为这不是一个系统对话框,而是Firefox的。

编辑:根据@Prophet的输入,我的完整更新代码

代码语言:javascript
运行
复制
from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import Select
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
import time
from fake_useragent import UserAgent
from selenium import webdriver
from selenium.webdriver import DesiredCapabilities
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
ua = UserAgent()
userAgent = ua.random

url = 'https://finance.yahoo.com/'
driver_path = 'geckodriver.exe'

profile = FirefoxProfile('C:\\Users\\\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\tp3cz5dm.default-release')
profile.set_preference("general.useragent.override", userAgent)

browser = Firefox(executable_path = driver_path)
browser.get(url)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
profile.set_preference("browser.helperApps.neverAsk.openFile", "application/pdf")
search_field_id = 'yfin-usr-qry'

element_search_field = browser.find_element_by_id(search_field_id)
element_search_field.clear()
element_search_field.send_keys('TSLA')
element_search_field.send_keys(Keys.ENTER)
from selenium.webdriver import ActionChains
action_chains = ActionChains(browser)
action_chains.key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform()
# xpath_string = '/html/body/div[1]/div/div/div[1]/div/div[2]/div/div/div[6]/div/div/section/div/ul/li[2]/a/span'
# element = browser.find_element_by_xpath(xpath_string)
# action_chains.move_to_element(element).click().perform()
browser.execute_script('window.print();')

browser.switch_to.window(browser.window_handles[-1])
time.sleep(0.5)
actionButton = browser.execute_script(
"return document.querySelector('print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('print-preview-button-strip').shadowRoot.querySelector('.action-button')")
cancelButton.click()
# switch back to main window
browser.switch_to.window(driver.window_handles[0])

当我运行这个程序时,我会得到错误:

JavascriptException: TypeError: document.querySelector(.)为空

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-18 15:03:20

以下两种解决方案都设计为而不是来启动print dialog. --这些解决方案要么将活动的网页打印到本地打印机,要么打印到PDF文件中,而无需处理对话框。

更新员额08-19-2021

我想把输出保存成PDF格式,而不是打印到纸上。我感到震惊的是,使用geckodriverselenium打印成PDF格式是多么困难。使用“色度驱动器”,您可以调用Page.printToPDFgeckodriver没有'execute_cdp_cmd‘。

当我通过Stack Overflow寻找灵感时,我发现了使用geckodriverselenium打印pdf的多个公开问题。在看到这是一个问题后,我仔细研究了selenium中的问题和mozilla的bug报告。同样,这也是其他人遇到的问题。

一些错误报告提到在打印过程中使用的某些开关不再起作用。

代码语言:javascript
运行
复制
profile.set_preference("print.print_to_file", True)
profile.set_preference("print.print_to_filename", "/tmp/file.pdf")

我决定看看mozilla gecko-dev的源代码,寻找一个潜在的解决方案。经过几个小时的研究,我发现上面的开关被替换为新的开关,另一个打印机变量也被替换了。经过一些测试,我能够让你的网页保存为PDF格式。

下面的代码将打印一个带有所有链接的PDF网页。我建议在代码中添加一些错误处理。我需要对文件名部分进行改进的代码的一部分。您应该能够添加一个函数来重命名该文件,这将允许您在单个会话中打印任意数量的文件。

代码语言:javascript
运行
复制
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.options import FirefoxProfile

firefox_options = Options()
firefox_options.add_argument("--disable-infobars")
firefox_options.add_argument("--disable-extensions")
firefox_options.add_argument("--disable-popup-blocking")

profile_options = FirefoxProfile()
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11.5; rv:90.0) Gecko/20100101 Firefox/90.0'
profile_options.set_preference('profile_options = FirefoxProfile()', user_agent)
profile_options.set_preference("print_printer", "Mozilla Save to PDF")
profile_options.set_preference("print.always_print_silent", True)
profile_options.set_preference("print.show_print_progress", False)
profile_options.set_preference('print.save_as_pdf.links.enabled', True)
profile_options.set_preference("print.printer_Mozilla_Save_to_PDF.print_to_file", True)

# set your own file path
profile_options.set_preference('print.printer_Mozilla_Save_to_PDF.print_to_filename',
                               "tmp/testprint.pdf")


driver = webdriver.Firefox(executable_path='/usr/local/bin/geckodriver', options=firefox_options,
                           firefox_profile=profile_options)


URL = 'https://finance.yahoo.com/'


driver.get(URL)

sleep(10)

search_field_id = 'yfin-usr-qry'

element_search_field = driver.find_element_by_id(search_field_id)
element_search_field.clear()
element_search_field.send_keys('TSLA')
element_search_field.send_keys(Keys.ENTER)

sleep(10)

driver.execute_script("window.print()")

sleep(20)

driver.quit()

原职位08-18-2021

我决定看看您的问题,因为我对selenium功能感兴趣。

我查看了geckodriver的源代码,找到了printUtils.js,它提供了打印过程中使用的开关的详细信息,如下所示:

代码语言:javascript
运行
复制
firefox_options.set_preference("print.always_print_silent", True)
firefox_options.set_preference("print.show_print_progress", False)

在删除了一些代码并添加了一些代码之后,我可以使用下面的代码在HP打印机上打印,而无需处理“打印”对话框:

代码语言:javascript
运行
复制
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.options import FirefoxProfile

firefox_options = Options()
firefox_options.add_argument("--disable-infobars")
firefox_options.add_argument("--disable-extensions")
firefox_options.add_argument("--disable-popup-blocking")

profile_options = FirefoxProfile()
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11.5; rv:90.0) Gecko/20100101 Firefox/90.0'
firefox_options.set_preference('profile_options = FirefoxProfile()', user_agent)
firefox_options.set_preference("print.always_print_silent", True)
firefox_options.set_preference("print.show_print_progress", False)
firefox_options.set_preference("pdfjs.disabled", True)

driver = webdriver.Firefox(executable_path='/usr/local/bin/geckodriver', options=firefox_options)

URL = 'https://finance.yahoo.com/'

driver.get(URL)

sleep(10)

search_field_id = 'yfin-usr-qry'

element_search_field = driver.find_element_by_id(search_field_id)
element_search_field.clear()
element_search_field.send_keys('TSLA')
element_search_field.send_keys(Keys.ENTER)

sleep(10)
driver.execute_script("window.print()")
代码语言:javascript
运行
复制
----------------------------------------
My system information
----------------------------------------
Platform:    Apple
OS:          10.15.7
Python:      3.9
Selenium:    3.141
Firefox:     90.0.2
Geckodriver: 0.29.0

----------------------------------------
票数 4
EN

Stack Overflow用户

发布于 2021-08-15 07:25:36

添加这些配置文件首选项应该避免出现这种弹出:

代码语言:javascript
运行
复制
profile.set_preference("print.always_print_silent", True)
profile.set_preference("print.show_print_progress", False)

UPD

包含打印对话框后,请尝试通过以下代码接受它:

代码语言:javascript
运行
复制
# switch to print preview window
driver.switch_to.window(driver.window_handles[-1])
time.sleep(0.5)
actionButton = driver.execute_script(
"return document.querySelector('print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('print-preview-button-strip').shadowRoot.querySelector('.action-button')")
cancelButton.click()
# switch back to main window
driver.switch_to.window(driver.window_handles[0])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68788695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档