Python Selenium, как сохранить сеанс входа в систему для очистки сайта за аутентификацией

#python-3.x #selenium

Вопрос:

У меня возникли проблемы с сохранением сеанса входа в систему с помощью Selenium, чтобы очистить сайт после аутентификации. Я пытаюсь использовать файлы cookie, потому что я читал, что почти все сайты используют файлы cookie. Вот что я сделал:

 driver = Firefox()


def logon(drvr):
    drvr.get('https://www.site/to/scrape/logon')
    wait = WebDriverWait(drvr, 10)
    elem = wait.until(EC.presence_of_element_located((By.NAME, 'memberId')))
    elem.send_keys('xxxx', Keys.RETURN)
    elem = wait.until(EC.presence_of_element_located((By.NAME, 'password')))
    elem.send_keys('xxxx', Keys.RETURN)
    elem = wait.until(EC.presence_of_element_located((By.XPATH, '//a[@class='
        '"sub-label font-narrow"]')))
    ver = elem.get_attribute('aria-label')
    if ' '.join(ver.split()) == 'phone number ending in 1 3 6 1':
        elem.click()
    value = input('Enter security code: ')
    elem = wait.until(EC.presence_of_element_located((By.NAME, 'inputValue')))
    elem.send_keys(value, Keys.RETURN)


def main(drvr):
    cookies = drvr.get_cookies()
    print(cookies)
    for cookie in cookies:
        drvr.add_cookie(cookie)
    drvr.get('https://www.site/behind/logon')


logon(driver)
main(driver)
 

Я могу успешно войти в систему, но приведенный выше код возвращает меня на страницу входа в систему. Селен не хранит сеанс. Я сделал что-то не так? Если сайт использует другой метод хранения сеанса, как я могу это узнать? Я читал, что большинство сайтов используют файлы cookie.

Комментарии:

1. вам не нужно получать файлы cookie, а затем устанавливать их снова… как только вы войдете в систему, файлы cookie будут установлены. (Однако вам действительно нужна небольшая пауза, потому что сервер отправит заголовок «установить файл cookie»… затем браузер сохранит файл cookie… это займет небольшое количество времени, но вы использовали другой .get() там, не дожидаясь.)

2. Спасибо @pcalkins. Я читал подобное в другом потоке справки, так что мой код будет работать, но является ли он избыточным? Итак, мне нужно подождать, пока файлы cookie будут сохранены. О том, как долго я должен говорить сценарию, чтобы он спал? Или есть лучший способ?

3. Лучший способ-использовать webdriverwait для ожидания ожидаемого условия, которое будет возникать только в содержимом, которое появляется после входа в систему. Обычно сервер отвечает «setcookie»… затем перенаправление (или, в случае одностраничного приложения, некоторое возвращаемое значение, указывающее javascript на обновление DOM…), например, кнопка типа «учетная запись» или «вход/выход». Получение файлов cookie в вашем коде не требуется.

4. Отлично, @pcalkins. Я посмотрю, что смогу придумать, как только напишу этот другой сценарий, над которым работаю. О том, сколько времени требуется браузеру для установки файлов cookie?

5. Что ж, мне удалось сделать то, что я хотел. Оказывается, мне не нужно извлекать каждую веб-страницу за логином get() . Селен может работать с каждой страницей по мере ее загрузки. Итак, вы просто загружаете страницу и работаете с элементами оттуда.