Как перейти к всплывающему окну проверки подлинности окна и ввести учетные данные?
После открытия 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()