Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Build out Cookie record and accompanying handling, make sure is worki…
Browse files Browse the repository at this point in the history
…ng in Taxi API, fixes #44
  • Loading branch information
semperos committed Feb 17, 2012
1 parent 512866e commit c0fbacd
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 47 deletions.
42 changes: 42 additions & 0 deletions src/clj_webdriver/cookie.clj
@@ -0,0 +1,42 @@
(ns clj-webdriver.cookie)

(defrecord Cookie [cookie name value path expiry domain secure?])

(defn new-cookie*
([name value] (org.openqa.selenium.Cookie. name value))
([name value path] (org.openqa.selenium.Cookie. name value path))
([name value path expiry] (org.openqa.selenium.Cookie. name value path expiry))
([name value domain path expiry] (org.openqa.selenium.Cookie. name value domain path expiry))
([name value domain path expiry secure?] (org.openqa.selenium.Cookie. name value domain path expiry secure?)))

(defn- nn
[& sexprs]
(not (some nil? sexprs)))

(defn init-cookie
"Instantiate a Cookie record. Keys can be: `:name`, `:value`, `:domain`, `:path`, `:expiry`, or `:secure?`. The keys `:name` and `:value` are not optional."
[{:keys [cookie name value domain path expiry secure?] :or {cookie nil domain nil path nil expiry nil secure? nil} :as cookie-spec}]
{:pre [(or cookie
(nn (:name cookie-spec) (:value cookie-spec)))]}
(let [cookie-obj (cond
(nn cookie) cookie
(nn domain path expiry secure?) (new-cookie* name value domain path expiry secure?)
(nn domain path expiry) (new-cookie* name value domain path expiry)
(nn path expiry) (new-cookie* name value path expiry)
(nn path) (new-cookie* name value path)
:else (new-cookie* name value))
{:keys [name value path domain expiry secure?]} (if cookie
{:name (.getName cookie)
:value (.getValue cookie)
:path (.getPath cookie)
:domain (.getDomain cookie)
:expiry (.getExpiry cookie)
:secure? (.isSecure cookie)}
{:name name
:value value
:path path
:domain domain
:expiry expiry
:secure? secure?})]
(Cookie. cookie-obj name value path expiry domain secure?)))

4 changes: 2 additions & 2 deletions src/clj_webdriver/core.clj
Expand Up @@ -13,15 +13,15 @@
;; WebDriver API. ;; WebDriver API.
;; ;;
(ns clj-webdriver.core (ns clj-webdriver.core
(:use [clj-webdriver driver element util window-handle options]) (:use [clj-webdriver driver element util window-handle options cookie])
(:require [clj-webdriver.js.browserbot :as browserbot-js] (:require [clj-webdriver.js.browserbot :as browserbot-js]
[clj-webdriver.cache :as cache] [clj-webdriver.cache :as cache]
[clojure.java.io :as io] [clojure.java.io :as io]
[clojure.string :as string] [clojure.string :as string]
[clojure.tools.logging :as log]) [clojure.tools.logging :as log])
(:import [clj_webdriver.driver Driver] (:import [clj_webdriver.driver Driver]
[clj_webdriver.element Element] [clj_webdriver.element Element]
[org.openqa.selenium By WebDriver WebElement Cookie [org.openqa.selenium By WebDriver WebElement
OutputType NoSuchElementException Keys] OutputType NoSuchElementException Keys]
[org.openqa.selenium.firefox FirefoxDriver] [org.openqa.selenium.firefox FirefoxDriver]
[org.openqa.selenium.ie InternetExplorerDriver] [org.openqa.selenium.ie InternetExplorerDriver]
Expand Down
30 changes: 21 additions & 9 deletions src/clj_webdriver/core_driver.clj
Expand Up @@ -147,7 +147,8 @@
(.window (.switchTo (:driver handle)) (:handle handle)) (.window (.switchTo (:driver handle)) (:handle handle))
driver) driver)
(number? handle) (do (number? handle) (do
driver(switch-to-window driver (nth (window-handles driver) handle))) (switch-to-window driver (nth (window-handles driver) handle))
driver)
(nil? handle) (throw (RuntimeException. "No window can be found")) (nil? handle) (throw (RuntimeException. "No window can be found"))
:else (do :else (do
(.window (.switchTo (:webdriver driver)) handle) (.window (.switchTo (:webdriver driver)) handle)
Expand All @@ -169,18 +170,29 @@


;; Options Interface (cookies) ;; Options Interface (cookies)
IOptions IOptions
(add-cookie [driver cookie] (add-cookie [driver cookie-spec]
(.addCookie (.manage (:webdriver driver)) cookie)) (.addCookie (.manage (:webdriver driver)) (:cookie (init-cookie cookie-spec)))
driver)

(delete-cookie-named [driver cookie-name] (delete-cookie-named [driver cookie-name]
(.deleteCookieNamed (.manage (:webdriver driver)) cookie-name)) (.deleteCookieNamed (.manage (:webdriver driver)) cookie-name)
(delete-cookie [driver cookie] driver)
(.deleteCookie (.manage (:webdriver driver)) cookie))
(delete-cookie [driver cookie-spec]
(.deleteCookie (.manage (:webdriver driver)) (:cookie (init-cookie cookie-spec)))
driver)

(delete-all-cookies [driver] (delete-all-cookies [driver]
(.deleteAllCookies (.manage (:webdriver driver)))) (.deleteAllCookies (.manage (:webdriver driver)))
driver)

(cookies [driver] (cookies [driver]
(into #{} (.getCookies (.manage (:webdriver driver))))) (into #{} (map #(init-cookie {:cookie %})
(.getCookies (.manage (:webdriver driver))))))

(cookie-named [driver cookie-name] (cookie-named [driver cookie-name]
(.getCookieNamed (.manage (:webdriver driver)) cookie-name)) (let [cookie-obj (.getCookieNamed (.manage (:webdriver driver)) cookie-name)]
(init-cookie {:cookie cookie-obj})))




;; Find Functions ;; Find Functions
Expand Down
26 changes: 5 additions & 21 deletions src/clj_webdriver/options.clj
@@ -1,27 +1,11 @@
(ns clj-webdriver.options (ns clj-webdriver.options)
(:import org.openqa.selenium.Cookie))


(defprotocol IOptions (defprotocol IOptions
"Options interface, including cookie and timeout handling" "Options interface, including cookie and timeout handling"
(add-cookie [driver cookie] "Add a new cookie to the browser session") (add-cookie [driver cookie-spec] "Add a new cookie to the browser session")
(delete-cookie-named [driver cookie] "Delete a cookie given its name") (delete-cookie-named [driver cookie-name] "Delete a cookie given its name")
(delete-cookie [driver cookie] "Delete a cookie given a cookie instance") (delete-cookie [driver cookie-spec] "Delete a cookie given a cookie instance")
(delete-all-cookies [driver] "Delete all cookies defined in the current session") (delete-all-cookies [driver] "Delete all cookies defined in the current session")
(cookies [driver] "Retrieve a set of cookies defined in the current session") (cookies [driver] "Retrieve a set of cookies defined in the current session")
(cookie-named [driver name] "Retrieve a cookie object given its name")) (cookie-named [driver cookie-name] "Retrieve a cookie object given its name"))


(defn new-cookie
"Create a new cookie instance"
([name value] (new-cookie name value "/" nil))
([name value path] (new-cookie name value path nil))
([name value path date] (new Cookie name value path date)))

(defn cookie-name
"Retrieve the name of a particular cookie"
[cookie]
(.getName cookie))

(defn cookie-value
"Retrieve the value of a particular cookie"
[cookie]
(.getValue cookie))
39 changes: 24 additions & 15 deletions src/clj_webdriver/taxi.clj
Expand Up @@ -91,9 +91,11 @@
(core/to *driver* url)) (core/to *driver* url))


(defn back (defn back
"Navigate back in the browser history." "Navigate back in the browser history, optionally `n` times."
[] ([] (back 1))
(core/back *driver*)) ([n]
(dotimes [m n]
(core/back *driver*))))


(defn close (defn close
"Close the browser. If multiple windows are open, this only closes the active window." "Close the browser. If multiple windows are open, this only closes the active window."
Expand All @@ -107,8 +109,10 @@


(defn forward (defn forward
"Navigate forward in the browser history." "Navigate forward in the browser history."
[] ([] (forward 1))
(core/forward *driver*)) ([n]
(dotimes [m n]
(core/forward *driver*))))


(defn get-url (defn get-url
"Navigate the browser to `url`." "Navigate the browser to `url`."
Expand Down Expand Up @@ -184,32 +188,34 @@
[] []
(core/switch-to-active *driver*)) (core/switch-to-active *driver*))


;; TODO: test coverage
(defn add-cookie (defn add-cookie
"Add the given `cookie` to the browser session." "Add the given `cookie` to the browser session."
[cookie] [cookie]
(options/add-cookie *driver* cookie)) (options/add-cookie *driver* cookie))


(defn delete-cookie-named ;; TODO: test coverage
"Delete the cookie with name `cookie-name` from the browser session."
[cookie-name]
(options/delete-cookie-named *driver* cookie-name))

(defn delete-cookie (defn delete-cookie
"Delete the given `cookie` from the browser session." "Provided the name of a cookie or a Cookie record itself, delete it from the browser session."
[cookie] [name-or-obj]
(options/delete-cookie *driver* cookie)) (if (string? name-or-obj)
(options/delete-cookie-named *driver* name-or-obj)
(options/delete-cookie *driver* name-or-obj)))


;; TODO: test coverage
(defn delete-all-cookies (defn delete-all-cookies
"Delete all cookies from the browser session." "Delete all cookies from the browser session."
[] []
(options/delete-all-cookies *driver*)) (options/delete-all-cookies *driver*))


;; TODO: test coverage
(defn cookies (defn cookies
"Return all cookies in the browser session." "Return all cookies in the browser session."
[] []
(options/cookies *driver*)) (options/cookies *driver*))


(defn cookie-named ;; TODO: test coverage
(defn cookie
"Return the cookie with name `cookie-name`." "Return the cookie with name `cookie-name`."
[cookie-name] [cookie-name]
(options/cookie-named *driver* cookie-name)) (options/cookie-named *driver* cookie-name))
Expand Down Expand Up @@ -588,4 +594,7 @@
[& query-action-maps] [& query-action-maps]
(doseq [entry query-action-maps (doseq [entry query-action-maps
[k v] entry] [k v] entry]
(quick-fill* k v true))) (quick-fill* k v true)))


;; IDEA: Go 2 pages back/forward

0 comments on commit c0fbacd

Please sign in to comment.