Удаленная селеновая сетка по https не работает

Компания, в которой я работаю, требует / впечатляет, чтобы весь наш тестовый трафик селена проходил через https при использовании удаленного сервера сетки селена, который мы разместили в AWS внутри экземпляра докера.

До сих пор, похоже, это работало, но с самой последней версией selenium 3.14. Сейчас я получаю сотни сообщений InsecureRequestWarnings даже по самому простому тесту. Я диагностировал, что это вызвано https-соединением с сеткой селена, а не тестовым целевым URL-адресом, потому что, если я запускаю те же тесты с локального сервера селена и веб-драйвера, у меня не возникает тех же проблем.

Я использую следующее: python 3.6.4, pytest 3.7.2, pytest-selenium 1.13, селен 3.14 (как локально, так и на удаленной сетке селена), chromedriver 2.41 (как локально, так и удаленно), certifi 2018.8.13, urllib3 1.23

запускать из различных окон (сервер 2008, Windows 10 и т. д.)

после запуска приведенного ниже кода (в основном это комбинация моего файла conftest.py и простого тестового сценария входа в систему) я получаю следующие предупреждения (62 из них повторяются).

D:\Work\PyTestFramework\VirtEnv3_6\lib\site-packages\urllib3\connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
    InsecureRequestWarning)

Мой пример кода:

import pytest
import webdriverwrapper
import webdriverwrapper.wrapper
from webdriverwrapper import DesiredCapabilities

# testtools are just my reusable helper libraries
from testtools import credentials_helper, login_helper, appointment_helper



def pytest_addoption(parser):
    parser.addoption('--url', action='store', default='https://bookingportal.mycompany.com.au/OBP',
                     help='target machine url')


@pytest.fixture(scope='session')
def url(request):
    return request.config.getoption('url')


@pytest.fixture(scope='function')
def browser(request):
    desired_cap = DesiredCapabilities.CHROME
    desired_cap['chromeOptions'] = {}
    desired_cap['chromeOptions']['args'] = ['--disable-plugins', '--disable-extensions']
    desired_cap['browserName'] = 'chrome'
    desired_cap['javascriptEnabled'] = True
    hostname = "https://selenium.mygriddocker.com.au/wd/hub"
    executor = webdriverwrapper.wrapper.remote.remote_connection.RemoteConnection(hostname, resolve_ip=False)
    b = webdriverwrapper.Remote(executor, desired_cap)
    request.addfinalizer(lambda *args: b.quit())
    return b


@pytest.fixture(scope='function')
def driver(browser, url):
    driver = browser
    driver.set_window_size(1260, 1080)
    driver.get(url)
    return driver


# ------------ put test script here



@pytest.mark.usefixtures("driver")
def test_OBP_Login(driver):
    testId = 'LogIn01'
    credentials_list = credentials_helper.get_csv_data('OBP_LoginDetails.csv', testId)

    assert driver.title == 'Booking Portal'
    rslt1 = login_helper.login_user(driver, credentials_list)
    assert rslt1

    rslt2 = appointment_helper.logout_OBP(driver)
    assert rslt2

как вы можете видеть, адрес сервера сетки селена, которому я звоню, https://selenium.mygriddocker.com.au/wd/hub (не настоящий реальный адрес)

и я подтвердил, что у него действительно есть действующий сертификат, выданный государственным органом (Comodo). Примечание. У меня не возникает этой проблемы, если я откатываюсь к urllib3 и certifi, но я не уверен, в какой момент он перестает работать.

Многие люди просто подавляют предупреждения, но я действительно хочу, чтобы сертификат работал.

Очевидное решение - перейти по ссылкам и добавить проверку сертификата, как они предлагают, но проблема в том, как отправить параметры диспетчера пула соединений через класс Selenium RemoteConnection?

Предлагаемое исправление от https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl:

 import certifi
 import urllib3
 http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())

Когда я покопался в библиотеке селена, я обнаружил, что использование urllib3.PoolManager было расположено в модуле remote_connection, но у него не было никаких параметров, доступных для отправки дополнительной информации для PoolManager при его вызове. В моем примере кода вы можете видеть, что объект-исполнитель - это то место, где я вызываю remote_connection (с помощью webdriverwrapper, в обычном селене путь - selenium / webdriver / remote / remote_connection)

Класс RemoteConnection не имеет возможности установить PoolManager, который я мог видеть.

Я попытался просто отредактировать remote_connection в надежде жестко закодировать информацию о сертификации в файл в надежде выяснить, как ее обернуть позже. Поэтому я добавил строки cert_reqs='CERT_REQUIRED', ca_certs=certifi.where() везде, где когда-либо видел urllib3.PoolManager () (я также импортировал certifi в этот модуль). По какой-то удивительной глупой удаче это действительно сработало. Теперь не могу понять, как его завернуть.

Есть ли у кого-нибудь другие идеи о том, как заставить удаленный селен работать через https?

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

Ответы 1

Итак, я обнаружил, что между селеном 3.13 и 3.14 они изменили библиотеку HTTP-запросов с httplib на urllib3 и, похоже, не обрабатывали сертификаты должным образом.

Итак, я обнаружил, что у меня есть следующие варианты: 1) использовать клиентскую сторону selenium 3.13 2) использовать клиентскую сторону selenium 3.14 и отключить InsecureRequestWarnings import urllib3 urllib3.disable_warnings (urllib3.exceptions.InsecureRequestWarning)

3) используйте клиентскую часть selenium 3.14 и взломайте файл remote_connections.py, заменив все экземпляры urllib3.PoolManager () на urllib3.PoolManager (cert_reqs = 'CERT_REQUIRED', ca_certs = certifi.where ())

другая вещь, на которую следует обратить внимание, это то, что я думаю, что Pycharm кеширует библиотеки, поэтому, если я делаю обновление pip и не очищаю кеш, я получаю смешанные результаты

4) Каким-то образом оберните remote_connection.py в мою собственную библиотеку и импортируйте класс, добавив в параметры PoolManager - это выше моих возможностей.

Это больше не вопрос, но информация, которую я могу помочь некоторым другим людям, которые получают предупреждения о небезопасности urllib3 при использовании https для удаленных вызовов селена.

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