【问题标题】:cannot parse capability: goog:chromeOptions from invalid argument: unrecognized chrome option: prefs无法解析功能:来自无效参数的 goog:chromeOptions:无法识别的 chrome 选项:首选项
【发布时间】:2020-11-15 09:33:22
【问题描述】:

我正在尝试使用 Selenium WebDriver 和 ChromeDriver 连接到现有会话设置下载文件夹。由于某种原因,它总是失败并抛出以下错误:

>>> from selenium import webdriver
>>>
>>> chromeOptions = webdriver.ChromeOptions()
>>>
>>> download_folder = "D:\\Test"
>>> preferences = {
... "download.default_directory" : download_folder
... }
>>> chromeOptions.add_experimental_option("prefs", preferences)
>>> chromeOptions.add_experimental_option("debuggerAddress", "127.0.0.1:1111")
>>>
>>> chromeOptions.to_capabilities()
{'browserName': 'chrome', 'version': '', 'platform': 'ANY', 'goog:chromeOptions': {'prefs': {'download.default_directory': 'D:\\Test'}, 'debuggerAddress': '127.0.0.1:1111', 'extensions': [], 'args': []}}
>>>
>>> driver_Chrome = "D:\\chromedriver.exe"
>>> driver_Web = webdriver.Chrome(executable_path=driver_Chrome, chrome_options=chromeOptions)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 76, in __init__
    RemoteWebDriver.__init__(
  File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: cannot parse capability: goog:chromeOptions
from invalid argument: unrecognized chrome option: prefs

 

但是,如果我删除任一 chromeOptions.add_experimental_option 行,那么它可以正常工作,这对我来说没有意义:

>>> from selenium import webdriver
>>>
>>> chromeOptions = webdriver.ChromeOptions()
>>>
>>> download_folder = "D:\\Test"
>>> preferences = {
... "download.default_directory" : download_folder
... }
>>> chromeOptions.add_experimental_option("prefs", preferences)
>>> # chromeOptions.add_experimental_option("debuggerAddress", "127.0.0.1:1111")
>>>
>>> chromeOptions.to_capabilities()
{'browserName': 'chrome', 'version': '', 'platform': 'ANY', 'goog:chromeOptions': {'prefs': {'download.default_directory': 'D:\\Test'}, 'extensions': [], 'args': []}}
>>>
>>> driver_Chrome = "D:\\chromedriver.exe"
>>> driver_Web = webdriver.Chrome(executable_path=driver_Chrome, chrome_options=chromeOptions)
<stdin>:1: DeprecationWarning: use options instead of chrome_options

DevTools listening on ws://127.0.0.1:4523/devtools/browser/e34332d4-50f0-4419-b9fb-37ede5f5602e
>>>

>>> from selenium import webdriver
>>>
>>> chromeOptions = webdriver.ChromeOptions()
>>>
>>> download_folder = "D:\\Test"
>>> preferences = {
... "download.default_directory" : download_folder
... }
>>> # chromeOptions.add_experimental_option("prefs", preferences)
>>> chromeOptions.add_experimental_option("debuggerAddress", "127.0.0.1:1111")
>>>
>>> chromeOptions.to_capabilities()
{'browserName': 'chrome', 'version': '', 'platform': 'ANY', 'goog:chromeOptions': {'debuggerAddress': '127.0.0.1:1111', 'extensions': [], 'args': []}}
>>>
>>> driver_Chrome = "D:\\chromedriver.exe"
>>> driver_Web = webdriver.Chrome(executable_path=driver_Chrome, options=chromeOptions)
>>>

 

我已经扩展了每个输出的“功能”,它们对我来说似乎很好:

{
    'browserName': 'chrome',
    'version': '',
    'platform': 'ANY',
    'goog:chromeOptions': {
        'prefs': {
            'download.default_directory': 'D:\\Test'
        },
        'debuggerAddress': '127.0.0.1:1111',
        'extensions': [],
        'args': []
    }
}

{
    'browserName': 'chrome',
    'version': '',
    'platform': 'ANY',
    'goog:chromeOptions': {
        'prefs': {
            'download.default_directory': 'D:\\Test'
        },
        'extensions': [],
        'args': []
    }
}

 

我的环境如下:

  • Windows 10 版本 2004
  • Python 64 位版本 3.8.4(最新)
  • Selenium 版本 3.141.0(最新)
  • Google Chrome 64 位版本 84.0.4147.89(最新),使用参数 --remote-debugging-port=1111 打开
  • ChromeDriver 版本 84.0.4147.30

我在网上找到的任何东西都没有帮助或涉及到这种特殊情况。

 

2020/09/07 23:26 更新: 版本 85.0.4183.* 存在相同问题。

【问题讨论】:

  • 您能否在执行webdriver.Chrome 时拦截对webdriver 的最终请求并显示请求正文?
  • @GennadyZyablitsev 我可以告诉我怎么做?

标签: python python-3.x selenium-webdriver webdriver selenium-chromedriver


【解决方案1】:

免责声明:这是一种适合我需要的解决方法。这可能对每个人都没有帮助。

我想从受 SSO 保护的网站中以 pdf 格式捕获数据,事实证明,弄清楚如何进行身份验证以查看所需页面非常麻烦且耗时。

所以使用 debuggerAddress 登录到我已经登录 SSO 的正在运行的 chrome 实例。

但面临与 OP 相同的问题,当尝试调用 add_experimental_option 两次时,一次用于设置 debuggerAddress,另一次用于在“首选项”中设置打印首选项。

解决方案

  1. 仅调用一次add_experimental_option设置首选项删除调用 以设置debuggerAddress
  2. 添加睡眠 time.sleep(60) 至少一分钟
  3. 此时,在脚本启动的 chrome 实例中登录 SSO。
  4. 睡眠完成后,您的 selenium 脚本可以使用 driver.get(url) 导航到所需的安全网站

【讨论】:

    【解决方案2】:

    也许您不能同时设置 debbugerAddress 和 download.default_directory,因为不允许您在运行的 chrome 实例上更改下载目录。

    【讨论】:

    • 请在必要时提供明确的答案和正确的代码。如果您不确定,那么您可以尝试对问题发表评论
    【解决方案3】:
    # Make Sure you have folder in C drive with name download_file
    # Please do make the changes according to your need, Thanks
    
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from webdriver_manager.chrome import ChromeDriverManager
    import time
    
    # If you want to change the default download location to somewhere else
    chromeOptions = Options()
    chromeOptions.add_experimental_option("prefs", {"download.default_directory": "C:\\download_file"})
    
    # Google Chrome
    driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=chromeOptions)
    
    # If you want to download the file in default location
    # driver = webdriver.Chrome(ChromeDriverManager().install())
    
    driver.get("http://demo.automationtesting.in/FileDownload.html")
    
    driver.maximize_window()
    
    # Download text file
    driver.find_element_by_id("textbox").send_keys("testing download text file")
    driver.find_element_by_id("createTxt").click() # Generate file Button
    driver.find_element_by_id("link-to-download").click() # Download file
    
    # Download pdf file
    driver.find_element_by_id("pdfbox").send_keys("testing download pdf file")
    driver.find_element_by_id("createPdf").click() # Generate file Button 
    driver.find_element_by_id("pdf-link-to-download").click() # Download file
    
    time.sleep(5)
    
    # Close the Browser
    driver.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2014-08-21
      • 2020-07-02
      • 2018-02-06
      • 2021-11-08
      相关资源
      最近更新 更多