Как сохранить состояние входа в селен - PullRequest
2 голосов
/ 30 октября 2019

Я использую селен и bs4 для разбора веб-страницы. И веб-страница использует скан qrcode и код подтверждения для входа в систему.

Я использую WebDriverWait, чтобы дождаться, когда пользователь войдет в систему с помощью

wait = ui.WebDriverWait(driver, 60)         # timeout after 60 seconds, just leave time for user to login

wait.until(lambda driver: driver.execute_script('return isLogin();'))

, и после того, как я войду в систему, затем начните анализ.

Это работает хорошо, за исключением того, что каждый раз, когда я запускаю скрипт, он открывает новое окно broswr, и мне нужно войти в систему.

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

Ответы [ 3 ]

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

Вы можете использовать профиль браузера по умолчанию

options = webdriver.ChromeOptions() 
options.add_argument("user-data-dir=C:\\Path") #Path to your chrome profile
w = webdriver.Chrome(executable_path="C:\\Users\\chromedriver.exe", chrome_options=options)

Путь к профилю можно найти, указав chrome://version/ в URL браузера.

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

Чтобы избежать входа в систему каждый раз, когда вы можете использовать куки. Например:

import pickle

from selenium import webdriver 


browser = webdriver.Chrome()
browser.get("http://www.google.com")
pickle.dump(browser.get_cookies(), open("cookies.pkl","wb"))

и загрузить файлы cookie позже:

import pickle

from selenium import webdriver


browser = webdriver.Chrome()
browser.get("http://www.google.com")
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    browser.add_cookie(cookie)
0 голосов
/ 30 октября 2019

Ниже я нашел два решения.

1. использовать более широкий профиль ( Это не относится к запросу на вход в систему при открытии нового окна )

Я использую Firefox, поэтому я настраиваю профиль таким образом.

profile = webdriver.FirefoxProfile('C:/Users/lf/AppData/Roaming/Mozilla/Firefox/Profiles/5fvhqsc9.selenium')
driver = webdriver.Firefox(firefox_profile=profile)

Если вы хотите установить отдельный профиль для своего кода, используйте firefox.exe -p в строке cmd. См. firefox-profile-selenium-webdriver
Примечание , просто используйте профиль в своем коде, не меняйте профиль выбора по умолчанию.

2. использовать cookie ( Это относится к сайту, запрашивающему логин при открытии нового окна )

from selenium import webdriver
from selenium.webdriver.support import ui
import pickle

driver = webdriver.Firefox()
"""
    Cookie can be only add to the request with same domain.
    When webdriver init, it's request url is `data:` so you cannot add cookie to it.
    So first make a request to your url then add cookie, then request you url again.
"""
browser = driver.get('url')

cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)

browser = driver.get('url')

if driver.execute_script('return !isLogin();'):       #[How to access javascript result in selenium](https://stackoverflow.com/q/58620192/6521116)
    driver.execute_script('openLoginUI();')    
    # [How can I make Selenium/Python wait for the user to login before continuing to run?](https://stackoverflow.com/a/16927552/6521116)
    wait = ui.WebDriverWait(driver, 60)         # timeout after 60 seconds, just leave time for user to login
    wait.until(driver.execute_script('return isLogin()'))

pickle.dump(driver.get_cookies(), open("cookies.pkl", "wb"))

Ссылка:
Как получить доступ к результатам javascript в селене
Как заставить Selenium / Python подождать, пока пользователь войдет в систему, прежде чем продолжить работу?
org.openqa.selenium.InvalidCookieDomainException: документ не использует файлы cookie с использованием Selenium и WebDriver

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