首页 > 解决方案 > 如何在谷歌浏览器上自动打开新标签?硒蟒

问题描述

自动化任务需要移动到打开的选项卡,执行命令(单击按钮),然后移动到下一个选项卡。对接下来的 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:消息:过时的元素引用:元素未附加到页面文档

标签: pythonselenium-webdriver

解决方案


使用动作链执行点击动作将允许 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

推荐阅读