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