Как перейти к всплывающему окну проверки подлинности окна и ввести учетные данные?

После открытия URL-адреса приложения пользователь перенаправляется на страницу входа, где есть кнопка "Вход".

driver.get("abc.com")

Теперь, когда пользователь нажимает кнопку "Войти", URL-адрес изменяется в том же окне, например, он становится xyz.com и отображает всплывающее окно аутентификации для входа в систему, подобное изображению, показанному ниже.

Чтобы ввести имя пользователя и пароль в окне аутентификации, я попробовал следующий код

shell = win32com.client.Dispatch("WScript.Shell")
shell.Sendkeys("username")
time.sleep(1)
shell.Sendkeys("{TAB}")
time.sleep(1)
shell.Sendkeys("password") 
time.sleep(1)
shell.Sendkeys("{ENTER}")
time.sleep(1)

Это не сработало. Затем я попытался открыть всплывающее окно аутентификации Windows напрямую (скопировав URL после нажатия кнопки "Войти") с помощью приведенного выше кода, это сработало

driver.get("xyz.com")//instead of abc.com my application URL

Я немного смущен. Если я открою URL своего приложения abc.com, нажму на кнопку "Вход" и воспользуюсь autoit, он не введет учетные данные. Но если я напрямую отправляю URL аутентификации окна xyz.com вместо URL приложения abc.com и использую autoit, это сработает.

Кто-нибудь может подсказать, что мне здесь не хватает? Я также попытался переключить окно после нажатия кнопки "Вход", подумав о новом URL, а затем о команде autoit, но все равно это не сработало.

driver.switch_to_window(driver.window_handles[1])

Есть идеи по этому поводу?

Примечание. Я заметил, что при нажатии кнопки "Вход" окна загружаются бесконечно, а курсор активен в текстовом поле имени пользователя окна проверки подлинности Windows. Также, как только появляется окно проверки подлинности Windows, ни одна из команд селен не работает и ни одна команда autoit.

7 ответов

Диалог обрабатывается как предупреждение селеном. В C# код для ввода учетных данных для теста Firefox выглядит следующим образом:

// Inputs id with permissions into the Windows Authentication box
var alert = driver.SwitchTo().Alert();
alert.SendKeys( @"username" + Keys.Tab + 
                @"password" + Keys.Tab);
alert.Accept();

Первая строка говорит водителю проверять наличие открытых предупреждений (диалоговое окно).

Вторая строка отправляет имя пользователя и пароль на предупреждение

Затем третья строка отправляет эти учетные данные и, если они верны, тест будет продолжен.

Предполагая, что вы тестируете с помощью Firefox, нет необходимости использовать дополнительные фреймворки для работы с этим блоком аутентификации.

На данном этапе это не браузер, который вы автоматизируете. Вы автоматизируете клавиатуру.

import keyboard
keyboard.write("username")
time.sleep(5)
keyboard.press_and_release("tab")
time.sleep(5)
keyboard.write("password")
time.sleep(5)
keyboard.press_and_release("enter")

Настройте время сна хитами и промахами.

Примечание. Для этого может потребоваться использование потоков.

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

from selenium.webdriver.firefox.webdriver import WebDriver
import keyboard
import time

selenium = WebDriver()
selenium.get("somelink")

time.sleep(5)
print "write user"
keyboard.press_and_release('tab')
keyboard.press_and_release('shift + tab')
time.sleep(2)
keyboard.write("user", delay=1)
print "done"
time.sleep(5)
keyboard.press_and_release('tab')
print "pressed tab"
time.sleep(5)
print "write password"
keyboard.write("pass", delay=1)
print "done"
time.sleep(2)
keyboard.press_and_release('enter')
print "pressed enter"

Также обратите внимание: если вы находитесь на Ubuntu, keyboard требуется разрешение root, поэтому запустите скрипт следующим образом:

sudo ./venv/bin/python 1.py 

Похоже, вам просто нужно открыть URL с базовыми учетными данными. Вы можете попробовать это сначала?

driver.get('http://username:password@abc.com')

Если вы все еще получаете всплывающее окно, попробуйте это

driver.get('http://username:password@xyz.com') #assuming this is the site that handles authentication
driver.get('abc.com')

Это должно остановить всплывающее окно

Согласитесь с ответом Альдо. Попробуй с https вместо http лайк:

driver.get('https://username:password@abc.com')

Вы можете найти другие способы здесь

Вам нужно переключиться на предупреждение, которое отличается от окна. Как только предупреждение присутствует, вы переключаете ручку предупреждения, а затем используете .authenticate способ дать ему имя пользователя и пароль

alert = driver.switch_to.alert
alert.authenticate(username, password)

Вы можете ждать на EC.alert_is_present ожидаемое условие, чтобы убедиться, что предупреждение присутствует.

Попробуйте это (с page_title, являющимся заголовком всплывающего окна и предполагающим, что вы находитесь на компьютере с Windows):

from win32com.client import Dispatch
autoit = Dispatch("AutoItX3.Control")

def _window_movement_windows(page_title):
        autoit.WinSetOnTop(page_title, "", 1)
        autoit.WinActivate(page_title, "")
        autoit.WinWaitActive(page_title)

Пример того, как настроить AutoIt с помощью Python, можно найти здесь: Вызов функций AutoIt в Python.

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

Требуется внедрить и запустить некоторый код на уровне браузера, чтобы обнаружить попытку аутентификации и установить учетные данные.

Вот рабочий пример:

from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver


def add_credentials_moz(driver, target, username, password):
    driver.execute("SET_CONTEXT", {"context": "chrome"})        
    driver.execute_script("""
        let [target, username, password] = [...arguments];
        let WebRequest = Cu.import('resource://gre/modules/WebRequest.jsm', {});
        WebRequest.onAuthRequired.addListener(function listener(){
          WebRequest.onAuthRequired.removeListener(listener);
          return Promise.resolve({authCredentials: {username: username, password: password}});
        }, {urls: new MatchPatternSet([target])}, ['blocking']);
        """, target, username, password)        
    driver.execute("SET_CONTEXT", {"context": "content"})

WebDriver.add_credentials_moz = add_credentials_moz



driver = webdriver.Firefox()
driver.add_credentials_moz("https://httpbin.org/*", username="user", password="passwd")

driver.get("https://httpbin.org/")

driver.find_element_by_css_selector("[href='/basic-auth/user/passwd']")\
      .click()
Другие вопросы по тегам