Selenium: Превышен максимум повторных попыток при использовании url
Полное отслеживание:
Traceback (most recent call last):
File "/home/webadmin/dev.taracares.com/src/app_payroll_reports/tests.py", line 134, in test_mstnla_sums_incentives_tennessee_sum
int(quince_amount_cell.text.replace(',', '')) +
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 77, in text
return self._execute(Command.GET_ELEMENT_TEXT)['value']
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 710, in _execute
return self._parent.execute(command, params)
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 423, in execute
response = self.command_executor.execute(driver_command, params)
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/selenium/webdriver/remote/remote_connection.py", line 333, in execute
return self._request(command_info[0], url, body=data)
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/selenium/webdriver/remote/remote_connection.py", line 355, in _request
resp = self._conn.request(method, url, body=body, headers=headers)
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/urllib3/request.py", line 74, in request
return self.request_encode_url(
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/urllib3/request.py", line 96, in request_encode_url
return self.urlopen(method, url, **extra_kw)
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/urllib3/poolmanager.py", line 375, in urlopen
response = conn.urlopen(method, u.request_uri, **kw)
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/urllib3/connectionpool.py", line 783, in urlopen
return self.urlopen(
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/urllib3/connectionpool.py", line 783, in urlopen
return self.urlopen(
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/urllib3/connectionpool.py", line 783, in urlopen
return self.urlopen(
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/urllib3/connectionpool.py", line 755, in urlopen
retries = retries.increment(
File "/home/webadmin/dev.taracares.com/dev/lib/python3.8/site-packages/urllib3/util/retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=58331): Max retries exceeded with url: /session/0f8192d1-c39f-49d1-9a99-7f91dfe95481/element/a5dd2645-6c15-44dc-b000-04bf6b7ea6cb/text (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fd9dcde24f0>: Failed to establish a new connection: [Errno 111] Connection refused'))
Этот код выполняется в тестах для приложения django. Раньше тесты выполнялись нормально, теперь последние 4 теста (которые используют selenium) содержат ошибки, которые начались после того, как я добавил driver.quit()
после каждого теста.
Однако это странно. Вот соответствующий код, который выполняется в каждом (из последних четырех) тестов:
options = webdriver.FirefoxOptions()
options.add_argument("--headless")
driver = webdriver.Firefox(options=options)
driver.get('https://dev.taracares.com/pr-run-ppe?group=MS%2FTN%2FLA&check_date=05%2F01%2F2022')
# some selenium code
driver.quit()
Что происходит?
Убедитесь, что quit действительно находится в нижней части вашего кода. Команда, в которой возникает ошибка, предназначена для получения текста элемента. Похоже, что вы вышли из драйвера, а затем пытаетесь выполнить вызов для получения текста элемента, связанного с сессией этого драйвера.
Строка типа driver.quit()
должна быть сохранена для метода tearDown()
и т.д. Таким образом, она все равно будет вызвана, если тест закончится/провалится раньше времени, и не будет вызвана слишком рано, когда вам еще может понадобиться драйвер, например, при вызове .text()
, который требует, чтобы драйвер все еще был открыт.
Многие существующие фреймворки для Python уже имеют раздел tearDown()
, куда можно поместить driver.quit()
(например, классы, наследующие unittest.TestCase
), или это может быть частью pytest
фикстуры, (например, pytest_runtest_teardown
). Некоторые фреймворки, объединяющие Python/Selenium, автоматически закрывают драйвер в конце теста (например, SeleniumBase), избавляя вас от этого шага. Полное раскрытие информации: я являюсь автором/содержателем SeleniumBase.