lib/capybara/poltergeist/client/agent.coffee in poltergeist-1.1.2 vs lib/capybara/poltergeist/client/agent.coffee in poltergeist-1.2.0
- old
+ new
@@ -25,19 +25,19 @@
throw error
currentUrl: ->
window.location.toString()
- find: (selector, within = document) ->
- results = document.evaluate(selector, within, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
- ids = []
+ find: (method, selector, within = document) ->
+ if method == "xpath"
+ xpath = document.evaluate(selector, within, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
+ results = (xpath.snapshotItem(i) for i in [0...xpath.snapshotLength])
+ else
+ results = within.querySelectorAll(selector)
- for i in [0...results.snapshotLength]
- ids.push(this.register(results.snapshotItem(i)))
+ this.register(el) for el in results
- ids
-
register: (element) ->
@elements.push(element)
@elements.length - 1
documentSize: ->
@@ -71,12 +71,12 @@
constructor: (@agent, @element) ->
parentId: ->
@agent.register(@element.parentNode)
- find: (selector) ->
- @agent.find(selector, @element)
+ find: (method, selector) ->
+ @agent.find(method, selector, @element)
isObsolete: ->
obsolete = (element) =>
if element.parentNode?
if element.parentNode == document
@@ -90,16 +90,45 @@
changed: ->
event = document.createEvent('HTMLEvents')
event.initEvent('change', true, false)
@element.dispatchEvent(event)
+ input: ->
+ event = document.createEvent('HTMLEvents')
+ event.initEvent('input', true, false)
+ @element.dispatchEvent(event)
+
+ keyupdowned: (eventName, keyCode) ->
+ event = document.createEvent('UIEvents')
+ event.initEvent(eventName, true, true)
+ event.keyCode = keyCode
+ event.which = keyCode
+ event.charCode = 0
+ @element.dispatchEvent(event)
+
+ keypressed: (altKey, ctrlKey, shiftKey, metaKey, keyCode, charCode) ->
+ event = document.createEvent('UIEvents')
+ event.initEvent('keypress', true, true)
+ event.window = @agent.window
+ event.altKey = altKey
+ event.ctrlKey = ctrlKey
+ event.shiftKey = shiftKey
+ event.metaKey = metaKey
+ event.keyCode = keyCode
+ event.charCode = charCode
+ event.which = keyCode
+ @element.dispatchEvent(event)
+
insideBody: ->
@element == document.body ||
document.evaluate('ancestor::body', @element, null, XPathResult.BOOLEAN_TYPE, null).booleanValue
- text: ->
- if @element.tagName == 'TEXTAREA'
+ allText: ->
+ @element.textContent
+
+ visibleText: ->
+ if @element.nodeName == "TEXTAREA"
@element.textContent
else
@element.innerText
getAttribute: (name) ->
@@ -115,10 +144,31 @@
if @element.tagName == 'SELECT' && @element.multiple
option.value for option in @element.children when option.selected
else
@element.value
+ set: (value) ->
+ return if @element.readOnly
+
+ if (@element.maxLength >= 0)
+ value = value.substr(0, @element.maxLength)
+
+ @element.value = ''
+ this.trigger('focus')
+
+ for char in value
+ keyCode = this.characterToKeyCode(char)
+ this.keyupdowned('keydown', keyCode)
+ @element.value += char
+
+ this.keypressed(false, false, false, false, char.charCodeAt(0), char.charCodeAt(0))
+ this.keyupdowned('keyup', keyCode)
+
+ this.changed()
+ this.input()
+ this.trigger('blur')
+
isMultiple: ->
@element.multiple
setAttribute: (name, value) ->
@element.setAttribute(name, value)
@@ -145,10 +195,13 @@
else if element.parentElement
this.isVisible element.parentElement
else
true
+ isDisabled: ->
+ @element.disabled || @element.tagName == 'OPTION' && @element.parentNode.disabled
+
frameOffset: ->
win = window
offset = { top: 0, left: 0 }
while win.frameElement
@@ -189,18 +242,11 @@
else
throw "Unknown event"
@element.dispatchEvent(event)
- focusAndHighlight: ->
- @element.focus()
- @element.select()
-
- blur: ->
- @element.blur()
-
- clickTest: (x, y) ->
+ mouseEventTest: (x, y) ->
frameOffset = this.frameOffset()
x -= frameOffset.left
y -= frameOffset.top
@@ -219,9 +265,48 @@
selector += el.tagName.toLowerCase()
selector += "##{el.id}" if el.id
for className in el.classList
selector += ".#{className}"
selector
+
+ characterToKeyCode: (character) ->
+ code = character.toUpperCase().charCodeAt(0)
+ specialKeys =
+ 96: 192 #`
+ 45: 189 #-
+ 61: 187 #=
+ 91: 219 #[
+ 93: 221 #]
+ 92: 220 #\
+ 59: 186 #;
+ 39: 222 #'
+ 44: 188 #,
+ 46: 190 #.
+ 47: 191 #/
+ 127: 46 #delete
+ 126: 192 #~
+ 33: 49 #!
+ 64: 50 #@
+ 35: 51 ##
+ 36: 52 #$
+ 37: 53 #%
+ 94: 54 #^
+ 38: 55 #&
+ 42: 56 #*
+ 40: 57 #(
+ 41: 48 #)
+ 95: 189 #_
+ 43: 187 #+
+ 123: 219 #{
+ 125: 221 #}
+ 124: 220 #|
+ 58: 186 #:
+ 34: 222 #"
+ 60: 188 #<
+ 62: 190 #>
+ 63: 191 #?
+
+ specialKeys[code] || code
isDOMEqual: (other_id) ->
@element == @agent.get(other_id).element
window.__poltergeist = new PoltergeistAgent