Как предварительно загрузить файлы cookie перед первым запросом с помощью Python3, Selenium Chrome WebDriver? - PullRequest
0 голосов
/ 02 августа 2020

Можно ли добавить файлы cookie, используя add_cookie() для домена, например stackoverflow.com в Selenium Chrome WebDriver, прежде чем выполнять фактический запрос с использованием get() на страницу в домене stackoverflow.com ?

При попытке:

driver.webdriver.add_cookie({'name' : 'testcookie', 'value' : 'testvalue', 'domain' : 'stackoverflow.com'})
driver.webdriver.get('https://stackoverflow.com/')

я получаю « Вы можете установить файлы cookie только для текущего домена ».

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

1 Ответ

0 голосов
/ 02 августа 2020

Начиная с Chrome 64, теперь у нас есть доступ к Chrome DevTools Protocol v1.3, который позволяет устанавливать файлы cookie для любого домена с помощью метода Network.setCook ie, что устраняет необходимость в дополнительном вызове get для настройки домен заранее.

например, Python3

import os.path
import pickle
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def save_cookies():
    print("Saving cookies in " + selenium_cookie_file)
    pickle.dump(driver.get_cookies() , open(selenium_cookie_file,"wb"))

def load_cookies():
    if os.path.exists(selenium_cookie_file) and os.path.isfile(selenium_cookie_file):
        print("Loading cookies from " + selenium_cookie_file)
        cookies = pickle.load(open(selenium_cookie_file, "rb"))

        # Enables network tracking so we may use Network.setCookie method
        driver.execute_cdp_cmd('Network.enable', {})

        # Iterate through pickle dict and add all the cookies
        for cookie in cookies:
            # Fix issue Chrome exports 'expiry' key but expects 'expire' on import
            if 'expiry' in cookie:
                cookie['expires'] = cookie['expiry']
                del cookie['expiry']

            # Replace domain 'apple.com' with 'microsoft.com' cookies
            cookie['domain'] = cookie['domain'].replace('apple.com', 'microsoft.com')

            # Set the actual cookie
            driver.execute_cdp_cmd('Network.setCookie', cookie)

        # Disable network tracking
        driver.execute_cdp_cmd('Network.disable', {})
        return 1

    print("Cookie file " + selenium_cookie_file + " does not exist.")
    return 0

def pretty_print(pdict):
    for p in pdict:
        print(str(p))
    print('',end = "\n\n")


# Minimal settings
selenium_cookie_file = '/home/selenium/test.txt'

browser_options = Options()
browser_options.add_argument("--headless")

# Open a driver, get a page, save cookies
driver = webdriver.Chrome(chrome_options=browser_options)
driver.get('https://apple.com/')
save_cookies()
pretty_print(driver.get_cookies())


# Rewrite driver with a new one, load and set cookies before any requests
driver = webdriver.Chrome(chrome_options=browser_options)
load_cookies()
driver.get('https://microsoft.com')
pretty_print(driver.get_cookies())

Вы увидите выше, что мы получаем файлы cookie из домена 'apple.com' с одним запросом и загружаем их и устанавливаем для второго запрос к домену 'microsoft.com' перед фактическим отправкой запроса 'microsoft.com'.

Код протестирован и работает, пока вы устанавливаете переменную selenium_cookie_file на допустимый путь к файлу с возможностью записи.

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