【问题标题】:Python - Selenium : Submit form without opening new tab or new windowPython - Selenium:提交表单而不打开新选项卡或新窗口
【发布时间】:2025-10-18 11:32:09
【问题描述】:

我有:

driver = webdriver.Firefox()

我有一些网址:driver.get(url)

我想提交一份表格:

elt = driver.find_element_by_class_name('special_class')
driver.find_element_by_xpath('//button').click()

这会打开一个新窗口,我希望所有事情都发生在一个窗口中。

我可能要多次提交类似的东西,然后解析输出。

有没有办法留在同一个窗口中?我不想打开很多窗口。

提前致谢。

【问题讨论】:

    标签: python selenium selenium-webdriver web-crawler


    【解决方案1】:

    如果表单提交后按钮打开新窗口,恐怕您无能为力。我唯一想到的就是使用像 PhantomJS 这样的无头浏览器——因为你正在做网络爬虫,你也可以欣赏它的速度。请参阅this Python 教程。

    但我实际上记得有一个解决方法,您可以将 Firefox browser.link.open_newwindow 设置为 1,这应该会导致每个新窗口都在当前窗口中打开。但是我不确定这是否适用于 HTML form

    fp = webdriver.FirefoxProfile()
    fp.set_preference("browser.link.open_newwindow", 1)
    browser = webdriver.Firefox(firefox_profile=fp)
    

    请参阅此功能的参考here

    【讨论】:

    • 感谢您的回答。我想也许有一个参数我可以在开始时初始化以避免打开新窗口。我不知道 PhantomJS 会增加爬取的速度。到目前为止,我只尝试了 Firefox 和 Chrome。
    • 查看我的编辑,我实际上回忆了一种方法。
    • 非常感谢。这就是我一直在寻找的。实际上,由于表单的原因,这并不像您所说的那样起作用,但是我使用了 driver.window_handles 和 driver.switch_to_window 来处理不同的窗口。 (并且不超过两个窗口)
    【解决方案2】:

    这实际上取决于表单的提交方式。如果在 HTML 中代码有 <form...id = someID...target = "_blank",并且表单元素有一些标识符,您可以手动更改此属性。

    这会在下次提交时在新窗口中打开表单:

    Browser.execute_script(
        'document.getElementById("someID").setAttribute("target", "_blank")'
    )
    

    如果如您所愿,您需要在新窗口中打开表单,只需将_blank 更改为_self。 (当然,someID 是实际表单 ID 的占位符)

    Browser 是 Selenium WebDriver,它执行内部的 javaScript 代码,将表单的属性更改为所需的属性。如果表单没有唯一 ID,则它可能具有另一个标识属性。

    希望这有帮助!这是我今天自己发现的。

    【讨论】: