python - 如何在谷歌浏览器上自动打开新标签?硒蟒
问题描述
自动化任务需要移动到打开的选项卡,执行命令(单击按钮),然后移动到下一个选项卡。对接下来的 4-5 个选项卡重复此过程。
我已经有一个自动化这个过程的代码。我有一个 for 循环,它遍历打开的选项卡的每个窗口句柄并自动单击按钮。但问题是,在每个选项卡上,驱动程序会等待执行按钮单击处理并加载新页面,然后再转到下一个选项卡。理想情况下,我希望驱动程序单击按钮并立即移至下一个选项卡,而无需等待新页面加载。
有什么方法可以实现这一目标吗?除了使用 Selenium 进行这种自动化之外,还有其他选择吗?
我当前的代码看起来像这样:
handles = driver.window_handles
for i in range(4):
driver.switch_to_window(handles[i])
driver.find_element_by_id('submit').click()
for i in range(3):
driver.switch_to_window(driver.window_handles[i+1])
chain = ActionChains(driver)
element = driver.find_element_by_name('submit')
chain.move_to_element_with_offset(element, 0, 0)
chain.click(element)
chain.release(element)
chain.perform()
我使用 aboce 代码使用 ActionChains 来单击按钮。但我得到了一个 StateElementReferenceException。rrror 在 chain.perform() 触发
StaleElementReferenceException:消息:过时的元素引用:元素未附加到页面文档
解决方案
使用动作链执行点击动作将允许 Selenium 继续,而无需等待点击动作的结果。在linux、python3.4、chromedriver2.38上测试:
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import *
chain = ActionChains(super().driver)
try:
element = driver.find_element_by_id('submit')
chain.move_to_element_with_offset(element, 0, 0)
chain.click(element)
chain.release(element)
# Perform the chained actions including the left-click.
chain.perform()
except:
print("Failed to click element")
raise
推荐阅读
- xaml - 为什么框架的边缘会被切断?带有 CornerRadius 的 CollectionView 内的框架
- mysql - 为什么“EXISTS”子查询不限于两个 WHERE 条件?
- c# - 使用 Json.NET 禁用特定类型的类型注释
- reactjs - redux store 更改时如何停止组件重新渲染
- vue.js - Vue 在自定义抛出时显示丑陋的控制台错误
- mysql - 即使列值为空也加入多个表
- python - openCV 中可用的所有 8 种对象跟踪算法都需要初始 ROI 吗?
- java - 我如何通过 selenium 中的 webelement 找到 webdriver?
- python-3.x - 使用不包含按钮的动态标签制作 tkinter 窗口
- botframework - AdaptiveCard 未在 Bot Framework Emulator / Web Chat 中呈现