2016-09-29 9 views
12

में सेलेनियम वेब स्टोर से कुकीज़ पास करने में विफल रहा मैं साइट पर लॉगिन करने के लिए सेलेनियम का उपयोग करना चाहता हूं और फिर कुकी को httpclient पर निर्यात करना चाहता हूं।सेलेनियम वेबड्राइवर से क्लोजर

(defn convert-selemium-cookie-to-httpclient-cookie [x] 
    (let [sf (SimpleDateFormat. "yyyy-MM-dd") 
     fake-date (.parse sf "2018-08-06")] 
    (doto 
     (BasicClientCookie. (:name x) (:value x)) 
     (.setDomain (:domain x)) 
     (.setPath (:path x)) 
     (.setExpiryDate (if (:expiry x) (:expiry x) fake-date)) 
     (.setSecure (:secure? x))))) 

(defn add-selenium-cookies-to-httpclient-cookie-store [x] 
    (let [cs (clj-http.cookies/cookie-store) 
     http-cookies (map convert-selemium-cookie-to-httpclient-cookie x)] 
    (mapv (fn[x] (.addCookie cs x)) http-cookies) 
    cs)) 

(def driver (new-driver {:browser :firefox})) 
(def a (login driver ...)) ;; login 
(def c (cookies driver)) ;; get the cookies 
(def cs (add-selenium-cookies-to-httpclient-cookie-store c)) 
(println (client/get "some web site" 
        {:cookie-store cs 
         :client-params {"http.useragent" 
             "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20"}})) 

हालांकि मैं webdriver में सफलतापूर्वक प्रवेश और उस साइट सत्रों में कुकीज़ बनी रहती कुकीज़ दुकान करने के लिए कुकीज़ कॉपी करने के बाद,, client/get अभी भी वापसी पेज लॉगिन नहीं है। मैं अजगर में एक ऐसी ही बात की कोशिश की है, और यह कर सकता है वेबड्राइवर से अनुरोधों (पायथन के लिए http क्लाइंट) से कुकीज सफलतापूर्वक स्थानांतरित करें। सुनिश्चित नहीं है कि जावा/क्लोजर के लिए समस्या कहां है।

उत्तर

4

आपने अपनी निर्भरताओं के संस्करण निर्दिष्ट नहीं किए हैं। मैं निम्नलिखित के साथ अपने कोड का परीक्षण किया है:

मेरा उत्तर के अंत में
[org.clojure/clojure "1.8.0"] 
[clj-webdriver "0.7.2"] 
[org.seleniumhq.selenium/selenium-server "3.0.0-beta4"] 

Firefox 48.0.2 
Mac OS Sierra 10.12 

आरईपीएल सत्र से पता चलता है कि यह काम करता है (मैं https://httpbin.org/ का इस्तेमाल किया है यह परीक्षण करने के लिए)।

मैं निम्नलिखित की जाँच करेगा के निवारण के लिए:

  • प्रिंट क्या कुकीज़ ड्राइवर से लौट रहे थे या ब्राउज़र कंसोल में जाँच देखने के लिए अगर आपके लॉगिन पृष्ठ के प्रतिसाद सही कुकीज़
  • प्रिंट सेट करने के लिए हेडर हैं कि आपके http-client cookiestore में
  • आपके लॉगिन-सुरक्षित पृष्ठ पर वास्तविक अनुरोध भेजने के लिए http-client (या अपने सर्वर में डीबग लॉगिंग सक्षम करने के लिए) डीबग लॉगिंग सक्षम करें और यदि अनुरोध में लॉगिन पृष्ठ द्वारा कुकीज़ सेट की गई है।

आरईपीएल सत्र में आप देख सकते हैं कि सेलेनियम से लौटाई गई कुकीज़ में पहले अनुरोध द्वारा कुकीज़ सेट की गई हैं। वे http-client कुकी स्टोर में भी मौजूद हैं और वे https://httpbin.org/cookies URL द्वारा ठीक से लौट आए हैं जो इंगित करते हैं कि उन्हें http-client द्वारा अनुरोध के साथ भेजा गया है।

(require '[clj-webdriver.taxi :as taxi]) 
(require '[clj-http.client :as client]) 
(require '[clj-http.cookies :as cookies]) 
(require '[clojure.pprint :refer [pprint]]) 
(import java.text.SimpleDateFormat) 
(import org.apache.http.impl.cookie.BasicClientCookie) 

(defn convert-selemium-cookie-to-httpclient-cookie [x] 
    (let [sf (SimpleDateFormat. "yyyy-MM-dd") 
     fake-date (.parse sf "2018-08-06")] 
    (doto 
     (BasicClientCookie. (:name x) (:value x)) 
     (.setDomain (:domain x)) 
     (.setPath (:path x)) 
     (.setExpiryDate (if (:expiry x) (:expiry x) fake-date)) 
     (.setSecure (:secure? x))))) 

(defn add-selenium-cookies-to-httpclient-cookie-store [x] 
    (let [cs (cookies/cookie-store) 
     http-cookies (map convert-selemium-cookie-to-httpclient-cookie x)] 
    (mapv (fn [x] (.addCookie cs x)) http-cookies) cs)) 

(def cookie-name (str "c1" (System/currentTimeMillis))) 
(def cookie-value (str "v1" (System/currentTimeMillis))) 

(pprint cookie-name) 
;; "c11475935066134" 

(pprint cookie-value) 
;; "v11475935066814" 

(def driver (taxi/new-driver {:browser :firefox})) 

(taxi/to driver (format "https://httpbin.org/cookies/set?%s=%s" cookie-name cookie-value)) 

(def selenium-cookies (taxi/cookies driver)) 

(pprint selenium-cookies) 
;; #{{:cookie 
;; #object[org.openqa.selenium.Cookie 0x4dc96ce8 "c11475935066134=v11475935066814; path=/; domain=httpbin.org"], 
;; :name "c11475935066134", 
;; :value "v11475935066814", 
;; :path "/", 
;; :expiry nil, 
;; :domain "httpbin.org", 
;; :secure? false}} 

(def http-client-cookie-store (add-selenium-cookies-to-httpclient-cookie-store selenium-cookies)) 

(pprint http-client-cookie-store) 
;; #object[org.apache.http.impl.client.BasicCookieStore 0x6dfa86f5 "[[version: 0][name: c11475935066134][value: v11475935066814][domain: httpbin.org][path: /][expiry: Mon Aug 06 00:00:00 CEST 2018]]"] 

(def http-client-response 
    (client/get 
    "https://httpbin.org/cookies" 
    {:cookie-store http-client-cookie-store})) 

(pprint http-client-response) 
;; {:status 200, 
;; :headers 
;; {"Server" "nginx", 
;; "Date" "Sat, 08 Oct 2016 13:58:01 GMT", 
;; "Content-Type" "application/json", 
;; "Content-Length" "64", 
;; "Connection" "close", 
;; "Access-Control-Allow-Origin" "*", 
;; "Access-Control-Allow-Credentials" "true"}, 
;; :body 
;; "{\n \"cookies\": {\n \"c11475935066134\": \"v11475935066814\"\n }\n}\n", 
;; :request-time 1001, 
;; :trace-redirects ["https://httpbin.org/cookies"], 
;; :orig-content-encoding nil} 
0

क्या आपने सेलेनियम-अनुरोधों का प्रयास किया था? https://pypi.python.org/pypi/selenium-requests/

+0

मैं अजगर के बजाय क्लोजर का उपयोग कर रहा हूं। पायथन संस्करण के लिए, मैं इसे पहले से ही बना देता हूं। –

संबंधित मुद्दे