如何使用Selenium(Python)连接到现有的Firefox实例

4

有没有办法打开Firefox浏览器,然后使用Selenium连接它?我知道在Chrome上可以通过在命令行中启动并使用--remote-debugging-port参数来实现:

import subprocess
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


subprocess.Popen('"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --remote-debugging-port=9222', shell=True)
        
options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(executable_path=PATH, options=options)

这能在Firefox中完成吗?我已经搜索和检查了一段时间与此相关的问题,但没有运气。
我找到的唯一线索是geckodriver有一个--connect-existing参数,但我不确定如何使用它。如何将参数传递给geckodriver并在selenium中使用它?
任何帮助都将不胜感激。如果无法完成,请告诉我。谢谢
编辑:好的,我取得了一些进展,我知道如何将geckodriver args传递给selenium:
driver = webdriver.Firefox(service=Service(PATH, service_args=['--marionette-port', '9394', '--connect-existing']))

现在的问题是,即使我像这样使用调试器服务器启动Firefox:
firefox.exe -marionette -start-debugger-server <PORT>
当我运行代码时,它要么会引发以下错误消息:

Traceback (most recent call last):
  File "c:\Users\maxis\Desktop\Python\Freelance\Application for Opening Web Browsers\browsers\firefox.py", line 107, in <module>
    driver = webdriver.Firefox(service=Service(PATH, service_args=['--marionette-port', '9394', '--connect-existing']))
  File "C:\Users\maxis\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\firefox\webdriver.py", line 180, in __init__
    RemoteWebDriver.__init__(
  File "C:\Users\maxis\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 275, in __init__
    self.start_session(capabilities, browser_profile)
  File "C:\Users\maxis\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 365, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "C:\Users\maxis\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 430, in execute
    self.error_handler.check_response(response)
  File "C:\Users\maxis\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: No connection could be made because the target machine actively refused it. (os error 
10061)

我会收到多个弹窗,告诉我有一个请求正在进入Firefox。即使我点击确定,似乎也没有任何反应。

3个回答

4

CMD:

C:\Program Files\Mozilla Firefox\

firefox.exe -marionette -start-debugger-server 2828 //only use 2828

Python脚本:

from selenium import webdriver

driver = webdriver.Firefox(executable_path = "YOUR GECKODRIVER PATH", service_args = ['--marionette-port', '2828', '--connect-existing'] )

pageSource = driver.page_source
print(pageSource)

真的只有端口2828才能工作吗?这似乎不对,因为你可以设置该端口,在Chrome中你可以运行在任何你想要的端口上,这允许同时自动化不同端口上的多个浏览器进程,非常有用。 - undefined
在新的Selenium版本中,service_args必须由Service构造函数提供。 - undefined

2

第一步:

打开CMD并执行:firefox.exe --marionette

这个命令将会打开一个拥有默认的marionette-port=2828的Firefox实例

(在Firefox实例的URL栏中输入about:config,回车后搜索:marionette.port)


接下来:

from selenium import webdriver
from selenium.webdriver.firefox.service import Service

firefox_services = Service(executable_path='firefoxdriver', port=3000, service_args=['--marionette-port', '2828', '--connect-existing'])
driver = webdriver.Firefox(service=firefox_services)
driver.get('https://youtube.com')
driver.execute_script('alert(\'your favorite music is here\')')

executable_path='firefoxdriver'
我的geckodriver.exe在firefoxdriver文件夹中

查看我的VSCode截图

port=3000
我想通过端口3000发送我的“geckodriver命令”

service_args=['--marionette-port', '2828', '--connect-existing']
我想控制一个已经打开的Firefox实例,它的marionette-port为2828


建议:
在您知道如何连接到已打开的Firefox实例之前,请删除在%temp%中创建的所有Firefox配置文件文件夹

删除%temp%中的这些文件夹


无论我如何启动Firefox,都无法设置Marionette端口。它总是显示为一些随机数字。 - undefined

1

我遇到了同样的错误,但当我使用默认的Marionette端口2828时,问题得到了解决。在Firefox中进入about:config,查找marionette.port,确保它与您的Web驱动程序的service_args中的端口相同。然后,仅使用-marionette选项启动一个Firefox实例,而不使用-start-debugger-server选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接