Я пишу скрипт на Python (3.6.6), который использует Selenium (3.141.0) для открытия URL-адреса в Chrome (ChromeDriver версия 77.0.3865.40), навигации по ряду меню, ввода данных для входа во всплывающее окно иавторизоваться. Вот мой сценарий:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
url = 'https://some.url.com/'
driver = webdriver.Chrome()
action = ActionChains(driver)
driver.get(url)
button_1 = driver.find_element_by_xpath("//*[contains(text(), 'button_1_text')]")
button_1.click()
button_2 = driver.find_element_by_id('button_2_text')
button_2 .click()
link = driver.find_element_by_link_text('link_text')
action.move_to_element(link).perform()
link.click()
alert_obj = driver.switch_to.alert
Если я выполняю эту навигацию вручную, я получаю приглашение с запросом имени пользователя и пароля с двумя кнопками для входа или отмены. Когда Selenium делает это, я вижу, что приглашение вспыхивает, но затем быстро исчезает, поэтому я получаю сообщение об ошибке:
selenium.common.exceptions.NoAlertPresentException: Message: no such alert
Если я обновляю все еще открытый браузер вручную, я могу получить предупреждение, но еслиЯ делаю сценарий обновления, подсказка снова исчезает. Я попытался подождать, пока не появится оповещение, как описано в Проверьте, существует ли какое-либо оповещение с использованием селена с python , но время ожидания просто истекло.
Если я проверюИсходный код страницы, которая остается открытой после исчезновения предупреждения, я вижу так:
<!-- template name: form.autopost.template.html -->
<html>
<head>
<title>Submit Form</title>
</head>
<body onload="javascript:document.forms[0].submit()">
<noscript>
<p>
<strong>Note:</strong> Since your browser does not support JavaScript, you must press the Resume button once to proceed.
</p>
</noscript>
<form method="post" action="another_url.saml2">
<input type="hidden" name="SAMLRequest" value="really_long_token"/>
<input type="hidden" name="RelayState" value="token"/>
<noscript><input type="submit" value="Resume"/></noscript>
</form>
</body>
</html>
Поэтому я попытался явно включить JavaScript с помощью:
options = webdriver.ChromeOptions()
options.add_argument("--enable-javascript")
driver = webdriver.Chrome(chrome_options=options)
Это похоже на Selenium test - оповещение Firefox немедленно исчезает , но похоже, что я не могу воссоздать решение с помощью Chrome. Я попробовал следующее:
options = webdriver.ChromeOptions()
options.add_argument("--disable-popup-blocking")
driver = webdriver.Chrome(chrome_options=options)
Но это тоже не имело значения. Есть ли другой способ предотвратить автоматическое закрытие оповещения Selenium / Chrome?
Вот скриншот всплывающего окна:
Я попытался добавить следующее в конец моего скрипта:
current_url = driver.current_url
parts = current_url.split('//')
login_url = parts[0] + '//{}:{}@'.format(username, password) + parts[1]
driver.get(login_url)
Но это не помогает. URL для входа выглядит следующим образом:
https://username:password@some_site/1S14/idp/G6tue/resume/idp/prp.ping?pfidpadapterid=idp.CG2LlmzHFUrah4EmDQ7jO_XTLGP&rememberChoice=true