如何使用Selenium(Python)打开/关闭标签页?快捷键方案失效如何解决
问题根本原因
Selenium的原生键盘输入事件作用域为当前激活的页面DOM节点,而Ctrl+T这类快捷键属于浏览器全局操作,由浏览器窗口本身捕获处理,不会传递给页面内容层。你向页面body发送快捷键、或是在默认页面上下文下执行ActionChains操作时,事件只会被传递到页面DOM中,不会被浏览器识别为窗口级快捷键,因此不会触发新建标签页的行为。操作无响应也不报错是因为输入事件本身执行成功,只是没有对应的上层逻辑处理该事件。
让ActionChains方案生效的配置调整
如果一定要使用ActionChains方式实现,需要满足两个核心前提:
- 浏览器窗口必须处于操作系统前台激活状态,不能后台运行或最小化
- 开启浏览器的系统级输入事件接收配置,不同浏览器配置方式不同:
- Chrome:添加启动参数
--force-renderer-accessibility,同时不能使用无头模式 - Firefox:在FirefoxProfile中设置
dom.send_key_events_to_root_window为true
- Chrome:添加启动参数
可运行的Chrome示例代码
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options # 配置Chrome启动参数 chrome_options = Options() chrome_options.add_argument("--force-renderer-accessibility") # 禁止使用--headless无头参数,必须可视化运行 driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.example.com") # 先加载任意页面保证DOM初始化完成 # 先点击页面空白区域,确保页面处于激活状态 driver.find_element_by_tag_name('body').click() # 执行ActionChains快捷键操作 ActionChains(driver).key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform()
额外说明
这种依赖系统级输入的方案兼容性很差,不同操作系统、不同浏览器版本的表现差异极大,且完全不支持无头运行。生产环境更推荐你已经测试成功的driver.execute_script("window.open('')")方案,稳定性更高,也不依赖窗口激活状态。
内容的提问来源于stack exchange,提问作者Nayan Gautam
相关产品推荐
相关产品推荐

