Вопрос-Ответ

Unable to use Selenium Webdriver. Getting two exceptions

Не удается использовать Selenium Webdriver. Получаем два исключения

Я получаю следующую ошибку при попытке создать объект с помощью Selenium Webdriver.

"\selenium\webdriver\common\driver_finder.py", line 42, in get_path
path = SeleniumManager().driver_location(options) if path is None else path

"\selenium\webdriver\common\selenium_manager.py", line 74, in driver_location
browser = options.capabilities["browserName"]

AttributeError: 'str' object has no attribute 'capabilities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
"\selenium_webdriver_webscraping.py", line 4, in <module>
driver = webdriver.Chrome(chrome_driver_path)
"\selenium\webdriver\chrome\webdriver.py", line 47, in __init__
self.service.path = DriverFinder.get_path(self.service, self.options)
"\selenium\webdriver\common\driver_finder.py", line 44, in get_path
raise NoSuchDriverException(f"Unable to obtain {service.path} using Selenium Manager; {err}")
selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain chromedriver using Selenium Manager; 'str' object has no attribute 'capabilities'; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location

Это код, который я использовал:

from selenium import webdriver

chrome_driver_path = <chrome drive .exe path>
driver = webdriver.Chrome(chrome_driver_path)
Переведено автоматически
Ответ 1

Если используемая вами версия Selenium - v4.6.0 или выше (что, я думаю, так, как я вижу SeleniumManger в трассировке ошибок), то вам действительно не нужно задавать driver.exe путь. Selenium может обрабатывать браузер и драйверы самостоятельно.

Итак, ваш код можно упростить, как показано ниже:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.google.com/")
driver.quit()

Несколько ссылок:

Ответ 2

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

Changes_in_selenium_4_10_0

Обратите внимание, что первого аргумента больше нет executable_path, и он desired_capabilities был удален, но теперь есть другой способ его передачи. Смотрите Обновление до Selenium 4 для получения документации о том, как передать желаемые возможности при использовании Selenium 4.10.0 (или новее).

Кроме того, если вы хотите установить executable_path, его можно передать через service, но в этом больше нет необходимости, поскольку selenium manager включен.

Вот фрагмент кода со всем необходимым:

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

service = Service()
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)
# ...
driver.quit()
Ответ 3

Я получил ту же ошибку, что и ниже:


AttributeError: объект 'str' не имеет атрибута 'capabilities'


Потому что я установил путь chromedriver.exe к webdriver.Chrome(), как показано ниже:

from selenium import webdriver

driver = webdriver.Chrome('./chromedriver.exe')

Итак, я удалил путь из webdriver.Chrome(), как показано ниже, после чего ошибка была устранена. * Это рекомендуется, и вы можете увидеть ответы на мой вопрос о том, какая версия драйвера Chrome webdriver.Chrome() получает:

from selenium import webdriver

driver = webdriver.Chrome()

Или, я установил путь к Service() и установил его в webdriver.Chrome(), как показано ниже, тогда ошибка была устранена:

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

service = Service(executable_path='./chromedriver.exe')
driver = webdriver.Chrome(service=service)

И я получил ту же ошибку ниже, потому что я не загружал и не устанавливал chromedriver.exe в django-project:


selenium.common.exceptions.Исключение NoSuchDriverException: Сообщение: Не удается найти или получить драйвер для Chrome; Документацию по этой ошибке можно найти на сайте: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location


Это мой код:

# "tests/test_1.py"

from django.test import LiveServerTestCase
from selenium.webdriver.chrome.service import Service
from selenium import webdriver

class TestBrowser1(LiveServerTestCase):
def test_example(self):
service = Service(executable_path='./chromedriver')
driver = webdriver.Chrome(service=service)
driver.get(("%s%s" % (self.live_server_url, "/admin/")))
assert "Log in | Django site admin" in driver.title

Итак, я скачал chromedriver.exe и установил его в корневой каталог в django-project, как показано ниже, после чего ошибка была устранена:

django-project
|-core
| |-settings.py
| └-urls.py
|-my_app1
|-my_app2
|-tests
| |-__init__.py
| └-test_1.py
└-chromedriver.exe # Here
Ответ 4

Версия Selenium, которую вы используете, - v4.6 или выше. Я запускаю правильный код на своем ноутбуке, но когда я запускаю тот же код на другом ноутбуке, появляется ошибка. Я понял, что был установлен selenium версии 4.16 . Я устанавливаю selenium версии 3.141.0, и это работает отлично.

pip install selenium==3.141.0

Installing collected packages: selenium
Attempting uninstall: selenium
Found existing installation: selenium 4.16.0
Uninstalling selenium-4.16.0:
Successfully uninstalled selenium-4.16.0
Successfully installed selenium-3.141.0
python selenium-webdriver