Компания, в которой я работаю, требует / впечатляет, чтобы весь наш тестовый трафик селена проходил через 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?
Итак, я обнаружил, что между селеном 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 для удаленных вызовов селена.