簡體   English   中英

無法解析功能:來自無效參數的 goog:chromeOptions:無法識別的 chrome 選項:prefs

[英]cannot parse capability: goog:chromeOptions from invalid argument: unrecognized chrome option: prefs

我正在嘗試使用 Selenium WebDriver 和 ChromeDriver 連接到現有的 session設置下載文件夾。 由於某種原因,它總是失敗並拋出以下錯誤:

>>> 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)
>>>

我已經擴展了每個 output 的“功能”,它們對我來說似乎很好:

{
    '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.* 存在同樣的問題。

免責聲明:這是一種適合我需要的解決方法。 這可能對每個人都沒有幫助。

我想將來自受 SSO 保護的網站的數據捕獲為 pdf,事實證明,弄清楚如何進行身份驗證以查看所需頁面非常麻煩且耗時。

所以使用 debuggerAddress 登錄到我已經登錄到 SSO 的正在運行的 chrome 實例。

但是面臨與 OP 相同的問題,當嘗試調用add_experimental_option兩次時,一次用於設置 debuggerAddress,另一次用於在“prefs”中設置打印首選項。

解決方案

  1. 僅調用一次add_experimental_option設置首選項並刪除設置debuggerAddress的調用。
  2. 添加 sleep time.sleep(60)至少一分鍾
  3. 此時,在腳本啟動的 chrome 實例中登錄 SSO。
  4. 睡眠完成后,您的 selenium 腳本可以使用driver.get(url)導航到所需的安全網站

也許您不能同時設置 debbugerAddress 和 download.default_directory,因為不允許您在正在運行的 chrome 實例上的下載目錄中進行更改。

# 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()

有點晚了,但這可能對其他人有用。 實際上你可以同時設置調試器地址和下載目錄,但不能在同一個選項中。 您可以使用兩種類型的選項來啟動驅動程序。

我安裝了 selenium 4.2.0,這適用於 Windows。

from selenium.webdriver import Chrome, ChromeOptions

chrome_driver_path = "Path to your chrome driver"
download_folder = "Download folder path"
preferences = {"download.default_directory" : download_folder}

options = ChromeOptions()
chrome_options = ChromeOptions()

options.add_experimental_option("prefs", preferences)
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = Chrome(chrome_driver_path, options=options, chrome_options=chrome_options)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM