Ajax - Запросы не работают в Selenium Firefox с Python во время кастомного CA - PullRequest
0 голосов
/ 13 июля 2020

Я хочу протестировать веб-приложения, размещенные в нашей компании, которые используют сертификаты tls из нашего внутреннего центра сертификации. Обычно я бы добавил CA в хранилище сертификатов браузеров, но, похоже, это невозможно напрямую в Selenium без использования существующего профиля. Этого следует избегать, чтобы в каждом тесте была чистая среда.

Поэтому я попытался найти обходные пути, принимающие ненадежные сертификаты. Есть несколько способов сделать это в драйвере Firefox, например capabilities['acceptInsecureCerts'] = True. Хотя это работает для страниц, загружаемых на селен с использованием driver.get(), похоже, что это вызывает проблемы с Ajax запросами.

Примером является HCL Connections 6.5. Панель управления сообщества в Selenium выглядит следующим образом:

enter image description here

You can see that there is an error message and all widgets loaded by ajax (Forums, Bookmarks, ..) are empty. This must be caused by the TLS trust problem: I imported our root CA in the Selenium instance cert store as root CA. After reloading all widgets are present and the error message went away.

How can I fix this, so that ajax requests using a custom CA works in Selenium?

My main code is:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from os.path import expanduser

options = Options()
profile = webdriver.FirefoxProfile()

capabilities = webdriver.DesiredCapabilities().FIREFOX.copy()
capabilities['acceptInsecureCerts'] = capabilities['acceptSslCerts'] = True

geckodriver = f"{expanduser('~')}/Downloads/geckodriver"
driver = webdriver.Firefox(
    options=options, executable_path=geckodriver, firefox_profile=profile, firefox_options=options, capabilities=capabilities)
driver.get("https://cnx65-test.internal/communities/service/html/communitystart?communityUuid=0e00eeab-a38f-4404-9ba4-2414be8d8c7f")

Instead of acceptInsecureCerts and acceptSslCerts I also tried

  • profile.accept_untrusted_certs = True
  • Настройка только capabilities['acceptSslCerts'] = True (без acceptInsecureCerts): «Невозможно отобразить ошибка виджетов исчезла, но все виджеты по-прежнему пусты
  • profile.accept_untrusted_certs = True то же самое

К сожалению, все они не исправляют проблему ajax виджетов. Я использую Python 3.7.

Обходной путь: Использование Chromium

Я пробовал Chromium со следующим кодом:

options = webdriver.ChromeOptions()
options.add_argument('ignore-certificate-errors')

chromedriver = "/snap/bin/chromium.chromedriver"
driver = webdriver.Chrome(chromedriver, chrome_options=options)
driver.get("https://cnx65-test.internal/communities/service/html/communitystart?communityUuid=0e00eeab-a38f-4404-9ba4-2414be8d8c7f")

В Chromium он работает с ignore-certificate-errors аргумент, который является временным решением. Но это не решение, так как я бы предпочел использовать Firefox.

...