Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Не проходит базовая авторизация. Selenium + WD

selenium
python
webdriver
Теги: #<Tag:0x00007f7b6486a010> #<Tag:0x00007f7b64869ea8> #<Tag:0x00007f7b64869d68>

(Максим Неверный) #1

Всем привет! В данный момент столкнулся с такой проблемой: есть сайт при переходе на который всплывает окно запрашивающее логин и пароль пользователя. Пробовал решить этот вопрос путем внедрения в код (пишу на python) части кода на AutoIt, не помогло, т.к. не видит окно ввода пароля/логина. https://github.com/AhonVashibaka/PyAutoItPy
Так же видел реализации на browsermobproxy, но с ним тоже не получилось. Есть у кого-то хотя бы приблизительный пример реализации?
p.s. Вариант с http://login:password@site.com тоже не прокатил.
p.p.s. Вариант:


    def setUp(self):
        self.base_url = "http://login:password@site.com"

не прошел.


(Roma Marinsky) #2

ТЫ моешь или куки особые подложить с авторизацией при открытии страницы или же switchTo().alert()…(не знаю как на пайтон) - И ввести данные авторизации


(Максим Неверный) #3

Не помогло, или я просто не понял, как использовать.
если взять, например, куки, то такая конструкция не работает:

import unittest
import pickle

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://site.com")
cookies = pickle.load(open("cookies.sqlite", "rb"))

по идее - в строке cookies = pickle.load(open("cookies.sqlite", "rb")) должно происходить чтение куки из файла.


(Roma Marinsky) #4

driver.manage().addCookie - как-то так


(vmaximv) #5

(Максим Неверный) #6

Попробовал разобраться по шагам.

driver = webdriver.Firefox()
print('1')
driver.get('https://site.com')
print('2')
chek = driver.switch_to.alert
print('3')
chek.authenticate('name', 'pass')
print('4')

После запуска видим:
1

Следовательно, тест лишь открывает браузер. переход на сайт не происходит, т.к. этому мешает окно базовой авторизации. Может “мешает” HTTPS?


(Maxim Zaitsev) #7

И никаких ошибок? Получается зависает скрипт ?


(Максим Неверный) #8

Именно. Ведь пока окно ввода логина/пароля не будет корректно заполнено значениями, даже в адресной строке не появятся адрес сайте.
Сейчас, кстати, решил по другому подойти к ситуации: создал другой профиль, прошел авторизацию (куки соответственно сохранились) и запустить тест по другим профилем.


(Максим Неверный) #9

Прошу ещё раз помочь.

driver = webdriver.Firefox(firefox_profile='Selenium')
driver.get('https://site.com')

Профиль Selenium был создан. Первый заход под ним осуществлен, в списке виден, но тест при запуске выдаёт ошибку:

No tests found

=================================== ERRORS ====================================
_______________________ ERROR collecting test002_OWA.py _______________________
test002_OWA.py:6: in <module>
    driver = webdriver.Firefox(firefox_profile='Selenium')
..\..\AppData\Local\Programs\Python\Python35\lib\site-packages\selenium\webdriver\firefox\webdriver.py:58: in __init__
    self.NATIVE_EVENTS_ALLOWED and self.profile.native_events_enabled)
E   AttributeError: 'str' object has no attribute 'native_events_enabled'

=========================== 1 error in 0.11 seconds ===========================


(Максим Неверный) #10

Последний вопрос снимается, т.к. даже под новым профилем выскакивает окно авторизации, надо думать в сторону browsermobproxy.


(Maxim Zaitsev) #11

А есть ли возможность посмотреть на этот сервис в живую? (адрес в личку). Логин и пароль не нужны.


(Sergiy Serpychenko) #12

Обход базовой аутентификации зависит от браузера.
Насколько помню, только в хроме по дефолту можно через адресную строку передать лог/пас.
В ФФ нужно запускать браузер с спец флагом для активации автоматического логина.
В ИЕ нужно править реестр…

Если у кого-то возникнет еще желание разобраться с этим вопросом (@MaximZaitsev ), то можно экпериментировать на https://foo:bar@httpbin.org/basic-auth/foo/bar


(Максим Неверный) #14

Есть библиотека Requests http://docs.python-requests.org/en/master/ . Она помогла не много вникнуть в суть проблемы, но не решить её. Так предположительно такой код должен проходить базовую авторизацию:

response = requests.get(url, verify=False, auth=HTTPBasicAuth(login, password))

Но не тут то было. Всё равно выдаёт 401 статус.


(Yury) #15

А какая вообще система аутентификации на сайте? Вы ее тестируете?


(Сержан Есенбек) #16

можете на сайт ссылку кинуть
попробуем самими написать


(Maxim Zaitsev) #17

Вот ссылка (с другого сайт) https://httpbin.org/basic-auth/user/passwd
Логин: user
Пароль: passwd

Это вариант проходит.[quote=“AnthraxMind, post:6, topic:12173”]
driver = webdriver.Firefox()
print(‘1’)
driver.get(‘https://site.com’)
print(‘2’)
chek = driver.switch_to.alert
print(‘3’)
chek.authenticate(‘name’, ‘pass’)
print(‘4’)
[/quote]

Такой тоже глухо виснет.

Остальные пока не пробывал.


(Максим Неверный) #18

Дело в том, что с этим сайтом вышеупомянутый мной код хорошо работает: [quote=“AnthraxMind, post:14, topic:12173”]
response = requests.get(url, verify=False, auth=HTTPBasicAuth(login, password))
[/quote]

При верных реквизитах ответ 200, при не верных 401 .
Ещё вопрос, если сертификат сайта просрочен, то с этим уже нет возможности что-то сделать, в плане пройти базовую авторизацию?


(kateyoukos) #19

http://login:password@site.com
Так уже запрещено браузером:

We should block requests for subresources that contain embedded credentials (e.g. “http://ima_user:hunter2@example.com/yay.tiff”). Such resources would be handled as network errors.
Specification

No public standards discussion


(Maxim Andryushchenkov) #20

Причем тут селениум? Это окно проще проехать с помощью xdotool под любой Linux дистр, а лучше найди либу для управления клавой. У тебя по факту надо ввести логин, табнуть, пароль, табнуть дважды и нажать Enter.