Оповещение исчезает, прежде чем скрипт сможет переключиться на него с помощью Selenium + Python + Chrome - PullRequest
2 голосов
/ 15 октября 2019

Я пишу скрипт на 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?

Вот скриншот всплывающего окна:

enter image description here

Я попытался добавить следующее в конец моего скрипта:

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

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Я выполнил аналогичный проект для своей фирмы, вам нужно будет перейти по этому URL с помощью UI Automation (Lib: pyautogui), а затем ввести имя пользователя и пароль. После этого вы можете делать что-либо, используя Selenium.

Ваш код не будет выходить за пределы «driver.get (url)», он будет навсегда застрять там.

0 голосов
/ 15 октября 2019

Если вы получаете запрос на вход в браузер, то вы можете попытаться установить имя пользователя и пароль следующим образом:

driver.get("https://username:password@somewebsite.com/")

, как описано в этом сообщенииВеб-сайт HTTPS

Но это НЕ ПРЕДУПРЕЖДЕНИЕ, и поэтому вы не можете справиться с driver.switch_to.alert, и вы получите исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...