Skip to content

Instantly share code, notes, and snippets.

@ToJans
Created March 14, 2013 11:41
Show Gist options
  • Save ToJans/5160710 to your computer and use it in GitHub Desktop.
Save ToJans/5160710 to your computer and use it in GitHub Desktop.
Browser = require('zombie')
class Client
is_defined = (what) -> what != null && typeof what isnt 'undefined'
constructor: (base) ->
@base = base
@browser = new Browser()
guard_result_required: (selector,fn) =>
selector = selector.selector if is_defined selector.selector
ret = fn(selector)
if ! is_defined(ret)
throw "Unable to find [#{selector}], body\n #{@browser.html()}"
ret
element: (selector) => @guard_result_required(selector, (x)=>@browser.query(x))
elements: (selector) => @guard_result_required(selector, (x)=>@browser.queryAll(x))
element_text: (selector) ->
selector = selector.selector if is_defined selector.selector
ret = @browser.text(selector)
ret
submit: (done,submit_button,data,allowed_statuscodes) =>
pars = submit_button
cb = =>
@browser.wait(pars.wait_in_Ms) if is_defined pars.wait_in_Ms
done()
todo = () =>
if is_defined pars.submit_button
submit_button = pars.submit_button
data = pars.data unless is_defined data
allowed_statuscodes = pars.allowed_statuscodes unless is_defined allowed_statuscodes
for key,val in data
selector = "[input[name=#{key}]"
guard_result_required @browser.query(selector)
@browser.fill(selector,val)
@browser.pressButton(submit_button,@handle_visit(cb,allowed_statuscodes))
if is_defined pars.url
@visit(todo ,pars.url,allowed_statuscodes)
else
todo()
visit: (cb,url,allowed_statuscodes) =>
pars = url
url = pars.url if is_defined pars.url
allowed_statuscodes = pars.allowed_statuscodes unless is_defined allowed_statuscodes
@browser.visit(url, @handle_visit(cb,allowed_statuscodes,pars.wait_in_Ms))
handle_visit: (cb,allowed_statuscodes,wait_in_Ms) =>
=>
console.log allowed_statuscodes
allowed_statuscodes=[200] unless is_defined allowed_statuscodes
if(@browser.statusCode not in allowed_statuscodes)
try
message = @browser.querySelector('h1').textContent
stacktrace = @browser.querySelector('tbody pre').textContent
console.error(message, stacktrace)
catch exception
throw exception
@browser.wait(wait_in_Ms) if is_defined wait_in_Ms
cb() if is_defined cb
module.exports = Client
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment