2016-01-25 3 views
4

Я использую python + selenium webdriver для автоматизации проверок. Я застрял на веб-сайтах, которые запрашивают аутентификацию HTTP через всплывающее окно.python + selenium webdriver: используя метод аутентификации

Я пытаюсь использовать «аутентифицировать» метод через следующий код:

#init. 
driver = webdriver.Firefox() 
driver.get(url) 
#get to the auth popup window by clicking relevant link 
elem = driver.find_element_by_id("login_link") 
elem.click() 
#use authenticate alert method 
driver._switch_to.alert.authenticate("login", "password") 

(дефицитным) информация о/документ, связанные с этим методом указывает, что он должен предоставить учетные данные, предоставленные & Validate HTTP авторизацию. Это не так и я получаю следующее сообщение об ошибке:

Файл «/usr/local/lib/python2.7/dist-packages/selenium/webdriver/common/alert.py», линия 105 , в аутентификации self.driver.execute (Command.SET_ALERT_CREDENTIALS, {'username': имя пользователя, 'пароль': пароль}) Файл "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/ remote/webdriver.py ", строка 201, в исполнении self.error_handler.check_response (response) Файл« /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py », line 159, in check_response повысить exception_class (значение) selenium.com mon.exceptions.WebDriverException: Сообщение: Непризнанный команда: POST /сессия/c30d03e1-3835-42f5-ace0-968aef486b36/оповещения/учетные данные

там что-то мне не хватает здесь/есть кто-нибудь прийти через то же самое выпускать и разрешать его?

PS: http://username:[email protected] трюк не работает для меня в моих условиях испытаний.

+0

такой же выпуск здесь – Spaceman

ответ

2

Basic authentication довольно легко работать для автоматического тестирования, без необходимости иметь дело с собственными предупреждениями/диалогами или другими различиями браузера.

Подход, который я очень успешно использовал в мире Java, - это создать прокси-сервер Browsermob в коде и зарегистрировать RequestInterceptor, чтобы перехватить все входящие запросы (соответствующие шаблону хоста/URL-адреса). Когда у вас есть запрос, который в противном случае нуждался бы в Basic auth, add anAuthorization HTTP-заголовок с требуемыми учетными данными («Basic» + кодировка «user: pass» в Base64.Так для «foo: bar» вы установили значение Basic Zm9vOmJhcg==)

Запустите сервер, установите его как прокси-сервер for Selenium traffic, и когда будет выполнен запрос, требующий аутентификации, прокси добавит заголовок, браузер увидит его, проверит учетные данные и не будет всплывать диалог.

Хотя техника может показаться трудоемким, имея заголовок набора автоматически для каждого запроса, вы не должны явно добавить user:[email protected]в любой URL, который может понадобиться, где есть несколько способов в Идент по-эд площадь. Кроме того, в отличие от пользователей user:[email protected], вам не нужно беспокоиться о кешировании браузера (или о переходе к кешу через определенное время) заголовка или о переходе HTTP/HTTPS.

Эта техника работает очень хорошо, но как достичь этого в Python?

Вы можете использовать этот Python wrapper for Browsermob, который предоставляет свой REST API в Python.Это REST позвонить вам необходимо:

POST/прокси/[порт]/заголовки - Установить и переопределить заголовки запроса HTTP. Например, настраивая пользовательский агент. Данные полезной нагрузки должны быть JSon закодированный набор заголовков (не URL-закодирован)

Итак, из предыдущего примера (псевдокод):

POST localhost:8787/proxy/<proxy_port>/headers '{"Authorization": "Basic Zm9vOmJhcg=="}' 

В качестве альтернативы, вы могли бы see this answer для прокси-сервера пользовательских Python используя Twisted.

0

Базовая аутентификация возможна в URL, но вы должны установить предпочтение:

from selenium import webdriver 
profile = webdriver.FirefoxProfile() 
profile.set_preference("network.http.phishy-userpass-length", 255) 
driver = webdriver.Firefox(profile) 
driver.get("http://admin:[email protected]/basic_auth") 

Если он не работает в вашем случае, то это не базовая аутентификация.