是否可以在 selenium.webdriver 和 requests.session 之间“传输”会话

Posted

技术标签:

【中文标题】是否可以在 selenium.webdriver 和 requests.session 之间“传输”会话【英文标题】:Is it possible to "transfer" a session between selenium.webdriver and requests.session 【发布时间】:2015-12-14 20:02:59 【问题描述】:

理论上,如果我将 selenium 的 webdriver 对象中的所有 cookie 复制到 requests.Session 对象,请求是否能够像会话没有中断一样继续进行?

具体来说,我有兴趣编写自动化程序,通过 selenium 到达网页上的特定位置,然后将某个下载链接传递给 requests,该链接将下载并验证文件中的特定字节,有时还有完整的文件。 (下载文件的值会根据我在 selenium 中的交互而改变)

【问题讨论】:

【参考方案1】:

是的,它肯定会起作用。以下代码 sn-p 也应该有所帮助 -

headers = 
"User-Agent":
    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/44.0.2403.157 Safari/537.36"

s = requests.session()
s.headers.update(headers)

for cookie in driver.get_cookies():
    c = cookie['name']: cookie['value']
    s.cookies.update(c)

【讨论】:

更新我的答案。标头仅用于发送任何额外的标头,大多数网站都需要流行浏览器的用户代理字符串。 也许将最后三行替换为:s.cookies.update( c['name']:c['value'] for c in driver.get_cookies() ) 它会反过来工作吗,你能用请求会话启动一个 selenium 浏览器吗? @EndermanAPM,是的。但是 Selenium Webdriver 有一个限制,您只能为当前域添加 cookie。所以你的代码应该有以下流程 - 使用 selenium 打开网页,使用 Webdriver 添加 cookie,再次打开网页,它会工作。 @BurakhanAksoy,请查看我上面的评论。如果这没有帮助,请告诉我。

以上是关于是否可以在 selenium.webdriver 和 requests.session 之间“传输”会话的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过 selenium webdriver 执行 OnClick javascript 函数而无需单击

如何使用selenium Webdriver验证页面中是否存在重复文本

你的回答“用selenium webdriver来判断一个网页加载完毕”,如何用加载超时报异常来确定是否加载完毕?

是否存在无法检测到的 Selenium WebDriver 版本?

通过 Selenium WebDriver C# 获取 HTTP 状态码

我们是否需要同时拥有Selenium服务器和Selenium WebDriver?