如何使用Python将CTRL-P发送到Web浏览器

时间:2019-01-14 15:42:43

标签: python selenium

这样做的目的是打开浏览器窗口,并将站点另存为PDF。

我正在编写Python代码,

1) Opens a web page
2) Does a control-p to bring up the print dialog box
NOTE: I will have pre-configured the browser to save as PDF instead of defaulting as printing to a printer)
3) Does "return"
4) Enters the file name
5) Does "return" again
NOTE: In my full code, I'll be doing these steps hundreds of times

我在使用control-p时遇到了问题。作为测试,我可以将伪文本发送到Google的搜索中,但似乎无法发送Ctrl-P(无错误消息)。我以Google为例,但最终代码将使用其他各种网站。

很明显,我缺少了一些东西,但无法弄清楚是什么。

我尝试了使用javascript代替ActionChains的另一种方法:

driver.execute_script('window.print();')

这有助于获取打印对话框,但我无法在该对话框中添加其他任何内容(例如,文件名和pdf的位置)。

我尝试使用PDFkit,将网页转换为pdf。它可以在某些网站上运行,但经常崩溃(取决于网站返回的内容),页面有时格式不正确,并且某些网站(pinterest)根本没有呈现。因此,我更改了方法,并决定使用硒和Chrome,以便pdf能够像在浏览器中显示的那样呈现。

我曾考虑过使用“ element.send_keys(” some text“)”代替ActionChains,但是由于我要遍历多个不同的网站,因此我不一定知道要查找什么元素。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
DRIVER = 'chromedriver'
driver = webdriver.Chrome(DRIVER)

URL = "http://www.google.com"
driver.get(URL)
actions = ActionChains(driver)
time.sleep(5) #Give the page time to load

actions.key_down(Keys.CONTROL)
actions.send_keys('p')
actions.key_up(Keys.CONTROL)
actions.perform()
time.sleep(5) #Sleep to see if the print dialog came up
driver.quit()

3 个答案:

答案 0 :(得分:3)

您可以使用autoit来满足您的要求。 首先做pip install -U pyautoit

from selenium import webdriver
import autoit
import time
DRIVER = 'chromedriver'
driver = webdriver.Chrome(DRIVER)
driver.get('http://google.com')
driver.maximize_window()
time.sleep(10)
autoit.send("^p")
time.sleep(10) # Pause to allow you to inspect the browser.
driver.quit()

请让我知道它是否有效。

答案 1 :(得分:0)

尝试一下:

webdriver.ActionChains(driver).key_down(Keys.CONTROL).send_keys('P').key_up    
(Keys.CONTROL).perform()

答案 2 :(得分:0)

检查一下:

robot.keyPress(KeyEvent.VK_CONTROL)
robot.keyPress(KeyEvent.VK_P)
// CTRL+P is now pressed
robot.keyRelease(KeyEvent.VK_P)
robot.keyRelease(KeyEvent.VK_CONTROL)