2016-04-12 262 views
3

經過研究和修補之後,我似乎被困在了我可以嘗試的地方。我基本上想在這裏做這個問題的相反:Is it possible to "transfer" a session between selenium.webdriver and requests.session將requests.Session()cookie傳遞給Python中的selenium web驅動程序

我想「點擊」一個網頁上的JavaScript按鈕,我通過一系列的GET/POST請求會話(由於我的GET/POST請求位於需要登錄用戶的頁面上,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) 

回答

1

我不相信這是可以做到的原生地。然而,Selenium的擴展名爲selenium-requests,您應該可以使用它。

編輯:

嘗試添加以下內容到您的代碼。在閱讀的來源,這應該工作(並使用requestsSession自動初始化POST請求期間。

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

我曾嘗試用硒的要求,但我遇到了一個單獨的問題,我將履行以下:1)通過seleniumrequests.Firefox()創建一個webdriver; 2)在login_url上發出GET請求; 3)執行xpath報廢以獲得即將到來的POST的必要數據; 4)嘗試使用數據進行POST; 5)從驅動中讀取page_source(並且它仍然會讀取與login_url頁面相同的源代碼,這意味着它尚未登錄。我想我可以再次嘗試它... –

+1

如果您將代碼作爲* *更新**到你原來的帖子,我可能會有幫助 – 2Cubed

+0

我很抱歉等了很長時間 - 我已經將我的嘗試/代碼添加到了原帖(並且更具體地描述了(希望)我的問題是硒-requests)! –

相關問題