Python - Selenium - 如何使用浏览器快捷方式
Posted
技术标签:
【中文标题】Python - Selenium - 如何使用浏览器快捷方式【英文标题】:Python - Selenium - How to use Browser Shortcuts 【发布时间】:2014-03-21 06:52:12 【问题描述】:加载浏览器页面后,我希望使用 Goggle Chrome 中的 CRTL+P 快捷方式进入打印页面,然后只需按回车键即可打印该页面。
import time
from selenium import webdriver
# Initialise the webdriver
chromeOps=webdriver.ChromeOptions()
chromeOps._binary_location = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
chromeOps._arguments = ["--enable-internal-flash"]
browser = webdriver.Chrome("C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe", port=4445, chrome_options=chromeOps)
time.sleep(3)
# Login to Webpage
browser.get('www.webpage.com')
我的问题是如何将密钥发送到浏览器本身而不是元素?
尝试失败:将 html 正文指定为元素并将键发送给该元素-
elem = browser.find_element_by_xpath("/html/body") # href link
elem.send_keys(Keys.CONTROL + "P") # Will open a second tab
time.sleep(3)
elem.send_keys(Keys.RETURN)
【问题讨论】:
“通常”的方法是照你做,将<body>
元素和.send_keys()
定位到该元素。显然,这对您不起作用,但是发生了什么或没有发生什么?如果打开第二个选项卡,您是否尝试过切换到该选项卡然后.send_keys(Keys.RETURN)
?
.send_keys() 到正文不起作用。我没有显示打印预览窗格。
啊你的代码注释让我很困惑,我以为你的意思是它正在打开第二个标签。
如果要启动 CRTL+t 来打开一个新选项卡,那么 CRTL+p(我想要的)将在同一级别上工作。如果可以让 crtl+t 工作,那么相同的代码将支持 crtl+p。
【参考方案1】:
我已经在 Google Chrome 上对此进行了测试,可以使用 ActionChains 类的 .key_down()
和 .send_keys()
方法的组合来解决问题。
ActionChains(driver).key_down(Keys.CONTROL).send_keys('p').key_up(Keys.CONTROL).perform()
ActionChains(driver).send_keys(Keys.ENTER)
【讨论】:
@RaunakThomas:您可以使用上面的代码来模拟几乎所有的键盘快捷键。我已经用ctrl + f
ctrl + p
进行了测试,剪切、复制、粘贴。要记住的重要事项,1. key_down()
方法只能与修饰键(Control、Alt 和 Shift)一起使用。 2. 在.key_down()
方法之后应该总是有一个.key_up()
调用。
我刚刚意识到,当您将此代码放在启动 webdriver 的代码下方时,出于某种奇怪的原因,它可以工作。但是一旦 webdriver 已经打开,如果我尝试只运行这一行代码,它就不起作用了。我猜它与活动窗口有关,但我似乎无法弄清楚
@RaunakThomas 你能详细说明一下吗?
我正在使用 Jupyter 笔记本。如果我在一个单元格中写driver = webdriver.Chrome(chromedriver)
,然后打开一个网站并使用您的快捷方式,它就可以工作。但是,如果我只在一个单元格中运行上面的代码,然后手动 alt
+ tab
回到我的代码,然后在单独的单元格中运行你的代码,它运行没有错误,但你的代码不起作用
你能提出一个新问题并在评论中标记我吗?请在其中包含所有这些信息。【参考方案2】:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser.get('https://www.myglenigan.com/project_search_results.aspx?searchId='+ID)
element=browser.find_element_by_xpath("//body")
element.send_keys(Keys.CONTROL, 'p')
请注意,这将打开 Firefox 打印面板。但是相同的代码在 Goggle Chrome 中不起作用。
【讨论】:
是的,它在谷歌浏览器中不起作用,特别是在 chromedriver_v2.27 中【参考方案3】:from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
ActionChains(browser).send_keys(Keys.CONTROL, "p").perform()
发送打印对话框的键盘快捷键
我还没有找到一种方法在 FF 中执行此操作以进行打印 - ctrl+p 将打开打印对话框,但 FF 有一个焦点错误,不允许为对话框本身执行 Keys.ENTER
希望这在 Chrome 中对你有用,我还没有在那里测试过
如果您找到解决此问题的方法,请更新 - 可能尝试 AutoIt
如果上述方法都不起作用,您可以随时进行
browser.get_screenshot_as_file( path + 'page_image.jpg' )
【讨论】:
感谢您的回复,但此代码似乎不适用于我的 Goggle Chrome。【参考方案4】:如果我正确理解了您的问题,我的建议是您安装并使用 pyautogui 模块来让您的 python 程序按键
例如:
import pyautogui
pyautogui.hotkey('ctrl','p')
请参阅 pyautogui 文档了解更多信息: https://pyautogui.readthedocs.io/en/latest/introduction.html
【讨论】:
你如何确保 Ctrl-p 将转到由 Selenium 启动的浏览器实例,而不是 其他窗口? 我不认为你可以。这只是我想提及的一种选择,因为尚未接受任何答案。虽然我认为这个模块中有图像识别功能可能会有所帮助以上是关于Python - Selenium - 如何使用浏览器快捷方式的主要内容,如果未能解决你的问题,请参考以下文章
Selenium_python自动化跨浏览器执行测试(简单多线程案例)
Python+selenium+firefox模拟登录微博并爬取数据(1
selenium+python自动化92-多线程启动多个不同浏览器