Веб-драйвер Selenium Chrome перестал работать

У меня есть скрипт в Google Colab, который использует Selenium для автоматизации некоторых задач Chrome. Странно то, что этот скрипт отлично работал до сегодняшнего дня. Внезапно, когда я запускаю свой скрипт, я получаю эту ошибку, которой раньше не было:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-c1c375032a08> in <cell line: 10>()
     15 
     16     # Specify the path to chromedriver executable
---> 17     driver = webdriver.Chrome("chromedriver", options=options)
     18     driver.get(url)
     19     print(driver.title)

TypeError: WebDriver.__init__() got multiple values for argument 'options'

Мой код следующий:

Получение Chromedriver

%%shell
# Ubuntu no longer distributes chromium-browser outside of snap
#
# Proposed solution: https://askubuntu.com/questions/1204571/how-to-install-chromium-without-snap

# Add debian buster
cat > /etc/apt/sources.list.d/debian.list <<'EOF'
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster.gpg] http://deb.debian.org/debian buster main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster-updates.gpg] http://deb.debian.org/debian buster-updates main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-security-buster.gpg] http://deb.debian.org/debian-security buster/updates main
EOF

# Add keys
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DCC9EFBF77E11517
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 112695A0E562B32A

apt-key export 77E11517 | gpg --dearmour -o /usr/share/keyrings/debian-buster.gpg
apt-key export 22F3D138 | gpg --dearmour -o /usr/share/keyrings/debian-buster-updates.gpg
apt-key export E562B32A | gpg --dearmour -o /usr/share/keyrings/debian-security-buster.gpg

# Prefer debian repo for chromium* packages only
# Note the double-blank lines between entries
cat > /etc/apt/preferences.d/chromium.pref << 'EOF'
Package: *
Pin: release a=eoan
Pin-Priority: 500


Package: *
Pin: origin "deb.debian.org"
Pin-Priority: 300

Установка зависимостей

!apt-get update
!apt-get install chromium chromium-driver
!pip3 install selenium

!pip install selenium
!pip3 install -U selenium
!api-get update
!api-get install -y chromium-browser
!pip3 install webdriver-manager
!apt install chromium-chromdriver

Код, чтобы попытаться запустить веб-драйвер:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import WebDriverException

try:
  url = "http://example.com/"
  options = Options()
  options.add_argument("--headless")
  options.add_argument("--no-sandbox")
  driver = webdriver.Chrome("chromedriver", options=options)
  driver.get(url)
  print(driver.title)
  driver.quit()
except WebDriverException as e:
  print(str(e))

Рефакторинг моего кода для удаления начального параметра "chromedriver" кажется работает, но я не понимаю, почему код работал отлично раньше, а не сейчас.

это решает вашу проблему stackoverflow.com/questions/76428561/…?

Ajeet Verma 08.06.2023 08:12

Привет! Спасибо за комментарий. На самом деле, я уже пробовал это, но все равно получаю ту же ошибку с этим

M0005 08.06.2023 08:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
288
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

То же самое случилось со мной сегодня. По сути, Selenium выпустил версию 4.10, и они полностью удалили кучу устаревшего кода, включая такой способ создания экземпляра веб-драйвера со строковым путем к драйверу.

Здесь вы можете увидеть, как это сделать правильно (и только один из 4.10): https://stackoverflow.com/a/70099102/9453904

В основном вы должны использовать объект службы и автоматический ChromeDriverManager (pip install webdriver-manager), который загрузит для вас правильный веб-драйвер:

from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

opts = Options()
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)

driver.get(url)
Ответ принят как подходящий

Это связано с изменениями в selenium4.10.0: https://github.com/SeleniumHQ/selenium/commit/9f5801c82fb3be3d5850707c46c3f8176e3ccd8e

Changes_in_selenium_4_10_0

Обратите внимание, что первый аргумент больше не executable_path, а options. (Вот почему он жалуется, что вы передаете его дважды.)

Если вы хотите передать executable_path, вам придется использовать service аргумент прямо сейчас.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

service = Service(executable_path = "chromedriver")
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(service=service, options=options)
# ...
driver.quit()

Если кто-то еще найдет здесь свой путь, потому что pyhtml2pdf был затронут этой поломкой, есть пул реквест, основанный на этом ответе, который устраняет проблему: github.com/kumaF/pyhtml2pdf/pull/2

macnewbold 09.06.2023 19:15

Другие вопросы по теме