2016-09-29 16 views
12

Seleniumを使用してサイトにログインし、そのクッキーをhttpclientにエクスポートします。Selenium webdriverからクッキー内の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をで正常にログインして、そのサイトは、私はPythonで同じようなことを試してみました。client/getはまだログインしていないページを返す、クッキーの店にクッキーをコピーした後、セッション間でクッキーを持続し、それができたが、 webdriverからリクエストに正常にCookieを転送します(httpクライアントのpython)。 java/clojureのどこに問題があるのか​​不明です。

答えて

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 

REPLセッションが、それは(私はそれをテストするためにhttps://httpbin.org/を使用している)に動作していることを示しています。私は次のようにあなたのコードをテストしています。

私は次のことを確認しますトラブルシューティングするには、次のドライバから返されたか確認するために、ブラウザのコンソールで確認したものをクッキー

  • 印刷ログインページからの応答が正しいクッキーを設定するために、ヘッダーが含まれている場合
  • 印刷何あなたhttp-client cookiestoreには、
  • が含まれています。http-clientのデバッグログを有効にする(またはサーバーでデバッグログを有効にする)と、実際の要求がログイン保護ページに送信されているかどうか、

REPLセッションでは、セレンから返されたクッキーには、最初のリクエストによって設定されたクッキーが含まれていることがわかります。これらはhttp-clientクッキーストアにも存在し、http-clientによってリクエストとともに送信されたことを示すhttps://httpbin.org/cookies URLによって適切に返されます。

(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} 
関連する問題