> While trying out clj-webdriver (for testing web pages), I got the impulse to
> reduce some of my boilerplate. I'd like your advice on best practices.

I would start with the main test macro, web-test. I would replace your
local variable b with a dynamically bound var *browser* that web-test
is responsible for setting. The options is a map that allows you to
specify browser and implicit-wait timeout like {:browser :firefox
:timeout 60000} but has reasonable defaults so that you can usually
use {} instead.

(defvar ^:dynamic *browser* nil)

(defmacro web-test [name options & actions]
    ...)

(web-test test-login {}
    (-> *browser* (find-it {:text "Login"})
        click)
    (-> *browser* (find-it {:class "text", :name "login"})
        (input-text "username"))
    (-> *browser* (find-it {:class "text", :name "password"})
        (input-text "password"))
    (-> *browser* (find-it :input {:value "Log in"})
        click)
    (is (-> *browser* (find-it {:href "/logout"})
        present?)))

Next, I'd factor our the "(-> *browser* (find-it" pattern with another macro.

    (defmacro web-action [search-parameters & actions]
        ...)

This converts

    (-> *browser* (find-it {:text "Login"})
        click)

into

    (web-action {:text "Login"} click)

If there is a lot of clicking and entering text in fields, I might
also create click-it and write-it macros so that you can say:

    (click-it {:text "Login"})

    (write-it {:class "text", :name "login"} "username")

After all these changes, the original example becomes:

(web-test test-login {}
    (click-it {:text "Login"})
    (write-it {:class "text", :name "login"} "username")
    (write-it {:class "text", :name "password"} "password")
    (click-it {:value "Log in"})
    (is (-> *browser* (find-it {:href "/logout"})
        present?)))

Hmm, maybe needs an is-present macro as well?

    (is-present {:href "/logout"})

If you have a lot of tests related to the same form, you can also make
shortcuts for commonly references elements:

    (def login-text {:class "text", :name "login"})

After all these changes, tests like these should be very easy to write.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to