python - 将 requests.Session() cookie 传输到 Python 中的 selenium 网络驱动程序

标签 python session selenium cookies python-requests

在研究和修改之后,我似乎对我可以尝试的东西感到困惑。我基本上是想在这里解决这个问题:Is it possible to "transfer" a session between selenium.webdriver and requests.session

我想“点击”网页上的一个 JavaScript 按钮,我已经通过 session 中的一系列 GET/POST 请求“到达”(重要的是,自从我的 GET/POST 以来,cookie 得到维护并无缝传输请求位于需要登录用户的页面上)。

然而,经过一番谷歌搜索后,我发现 requests 似乎并没有提供类似的东西。我发现了 selenium,此后一直在尝试正确传输 cookie(未成功)。

import requests, requests.utils, lxml.html
from lxml.cssselect import CSSSelector
from selenium import webdriver

# urls which requests will be made to
login_url = 'login-url-here'
logged_in_data_url = 'logged-in-data-here'

# create my Session to contain my cookies
with requests.Session() as s:
    login_html = s.get(login_url)
    tree = lxml.html.fromstring(login_html.text)
    important_key1 = list(set(tree.xpath('//*[@id="fm1"]/div/div[3]/input[1]/@value')))[0]
    important_key2 = list(set(tree.xpath('//*[@id="fm1"]/div/div[3]/input[2]/@value')))[0]
    form_value = "submit"

    login_payload = {
        'post-field-1': 'post-data-1',
        'post-field-2': 'post-data-2',
        'important_key1': 'important_value1',
        'important_key2': 'important_value2',
        'important_key3': 'important_value3'
    }

    login_result = s.post(login_url,
                    data=login_payload,
                    headers = dict(referer=login_url))

    logged_in_data_html = s.get(logged_in_data_url)
    tree = lxml.html.fromstring(logged_in_data_html.text)
    print(logged_in_data_html.text)

    # Attempt at transferring cookies, currently fails
    cookie_dict = requests.utils.dict_from_cookiejar(s.cookies)
    driver = webdriver.Firefox()
    for cookie in cookie_dict:
        driver.add_cookie(cookie)

    driver.get(logged_in_data_url)

    # prints same contents as login_html.text,
    # meaning cookie transfer failed and the session was thrown out
    print(driver.page_source) 

关于从这里做什么的任何建议或指示?

编辑:我对 selenium-requests 的尝试:

import seleniumrequests
import lxml.html
from lxml.cssselect import CSSSelector

# urls which requests will be made to
login_url = 'login-url-here'
logged_in_data_url = 'logged-in-data-here'

driver = seleniumrequests.Firefox()

login_html = driver.request('GET', login_url)
tree = lxml.html.fromstring(login_html.text)
important_key1 = list(set(tree.xpath('//*[@id="fm1"]/div/div[3]/input[1]/@value')))[0]
important_key2 = list(set(tree.xpath('//*[@id="fm1"]/div/div[3]/input[2]/@value')))[0]
form_value = "submit"

# following print statements print value1, value2 respec
print ("important_key1 = " + important_key1)
print("important_key2 = " + important_key2)

login_payload = {
    'post-field-1': 'post-data-1',
    'post-field-2': 'post-data-2',
    'important_key1': 'important_value1',
    'important_key2': 'important_value2',
    'important_key3': 'important_value3'
}

login_result = driver.request('POST', login_url,
                              data=login_payload,
                              headers = dict(referer=login_url))

# this should print out the landing page after being logged in
# source code contains important_key1, 2, and 3 with different values
# the GET and POST requests seem to be in different sessions
# how do I fix that?
print(login_result.text)

最佳答案

我认为不可能在本地执行此操作。然而,有一个名为 selenium-requests 的 Selenium 扩展。你应该能够使用。

编辑:

尝试将以下内容添加到您的代码中。阅读源代码后,这应该可以工作(并使用 requests SessionPOST 请求期间自动初始化。

response = driver.request('GET', logged_in_data_url)

关于python - 将 requests.Session() cookie 传输到 Python 中的 selenium 网络驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36561372/

相关文章:

python - 管理 __all__ 的导出装饰器

python - Django TypeError 'User' 对象不可迭代

python - 在不指定 maxsize 参数的情况下使用 functools 的 @lru_cache

security - 向用户公开自己的 session ID 是否不安全?

xpath - 在selenium.get.Text和selenium.click中使用xpath

Python 列表 append 问题

ruby-on-rails - 如何在 Rails 集成测试中设置 session 变量

php - 在 SQL WHERE 语句中使用 session 变量

javascript - 使用 selenium 进行 headless javascript 下载

node.js - NightWatch - 无法在具有值的输入上找到带有 xpath 定位器的元素