capybara 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +4 -4
- data/README.rdoc +9 -2
- data/lib/capybara.rb +12 -6
- data/lib/capybara/driver/base.rb +17 -0
- data/lib/capybara/driver/culerity_driver.rb +22 -10
- data/lib/capybara/driver/rack_test_driver.rb +41 -36
- data/lib/capybara/driver/selenium_driver.rb +12 -5
- data/lib/capybara/dsl.rb +6 -6
- data/lib/capybara/node.rb +9 -5
- data/lib/capybara/rails.rb +0 -4
- data/lib/capybara/server.rb +3 -0
- data/lib/capybara/session.rb +69 -81
- data/lib/capybara/xpath.rb +124 -0
- data/spec/driver/selenium_driver_spec.rb +1 -1
- data/spec/drivers_spec.rb +20 -3
- data/spec/dsl_spec.rb +4 -3
- data/spec/public/jquery-ui.js +35 -0
- data/spec/session/culerity_session_spec.rb +4 -3
- data/spec/session/rack_test_session_spec.rb +4 -3
- data/spec/session/selenium_session_spec.rb +5 -4
- data/spec/session_spec.rb +248 -49
- data/spec/test_app.rb +1 -1
- data/spec/views/form.erb +26 -3
- data/spec/views/with_js.erb +25 -0
- data/spec/xpath_spec.rb +195 -0
- metadata +6 -6
- data/lib/capybara/driver/firewatir_driver.rb +0 -66
- data/lib/capybara/driver/safariwatir_driver.rb +0 -67
- data/spec/driver/firewatir_driver_spec.rb +0 -10
- data/spec/driver/safariwarit_driver_spec.rb +0 -10
@@ -0,0 +1,35 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery UI 1.7.2
|
3
|
+
*
|
4
|
+
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
5
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
6
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
7
|
+
*
|
8
|
+
* http://docs.jquery.com/UI
|
9
|
+
*/
|
10
|
+
jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/*
|
11
|
+
* jQuery UI Draggable 1.7.2
|
12
|
+
*
|
13
|
+
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
14
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
15
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
16
|
+
*
|
17
|
+
* http://docs.jquery.com/UI/Draggables
|
18
|
+
*
|
19
|
+
* Depends:
|
20
|
+
* ui.core.js
|
21
|
+
*/
|
22
|
+
(function(a){a.widget("ui.draggable",a.extend({},a.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy()},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;if(c.cursorAt){this._adjustOffsetFromHelper(c.cursorAt)}if(c.containment){this._setContainment()}this._trigger("start",b);this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();this._trigger("drag",b,c);this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){b._trigger("stop",c);b._clear()})}else{this._trigger("stop",c);this._clear()}return false},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},_trigger:function(b,c,d){d=d||this._uiHash();a.ui.plugin.call(this,b,[c,d]);if(b=="drag"){this.positionAbs=this._convertPositionTo("absolute")}return a.widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(b){return{helper:this.helper,position:this.position,absolutePosition:this.positionAbs,offset:this.positionAbs}}}));a.extend(a.ui.draggable,{version:"1.7.2",eventPrefix:"drag",defaults:{addClasses:true,appendTo:"parent",axis:false,cancel:":input,option",connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,delay:0,distance:1,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false}});a.ui.plugin.add("draggable","connectToSortable",{start:function(c,e){var d=a(this).data("draggable"),f=d.options,b=a.extend({},e,{item:d.element});d.sortables=[];a(f.connectToSortable).each(function(){var g=a.data(this,"sortable");if(g&&!g.options.disabled){d.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",c,b)}})},stop:function(c,e){var d=a(this).data("draggable"),b=a.extend({},e,{item:d.element});a.each(d.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;d.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance._mouseStop(c);this.instance.options.helper=this.instance.options._helper;if(d.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})}}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",c,b)}})},drag:function(c,f){var e=a(this).data("draggable"),b=this;var d=function(i){var n=this.offset.click.top,m=this.offset.click.left;var g=this.positionAbs.top,k=this.positionAbs.left;var j=i.height,l=i.width;var p=i.top,h=i.left;return a.ui.isOver(g+n,k+m,p,h,j,l)};a.each(e.sortables,function(g){this.instance.positionAbs=e.positionAbs;this.instance.helperProportions=e.helperProportions;this.instance.offset.click=e.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=a(b).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return f.helper[0]};c.target=this.instance.currentItem[0];this.instance._mouseCapture(c,true);this.instance._mouseStart(c,true,true);this.instance.offset.click.top=e.offset.click.top;this.instance.offset.click.left=e.offset.click.left;this.instance.offset.parent.left-=e.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=e.offset.parent.top-this.instance.offset.parent.top;e._trigger("toSortable",c);e.dropped=this.instance.element;e.currentItem=e.element;this.instance.fromOutside=e}if(this.instance.currentItem){this.instance._mouseDrag(c)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",c,this.instance._uiHash(this.instance));this.instance._mouseStop(c,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}e._trigger("fromSortable",c);e.dropped=false}}})}});a.ui.plugin.add("draggable","cursor",{start:function(c,d){var b=a("body"),e=a(this).data("draggable").options;if(b.css("cursor")){e._cursor=b.css("cursor")}b.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._cursor){a("body").css("cursor",d._cursor)}}});a.ui.plugin.add("draggable","iframeFix",{start:function(b,c){var d=a(this).data("draggable").options;a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop+f.scrollSpeed}else{if(d.pageY-c.overflowOffset.top<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop-f.scrollSpeed}}}if(!f.axis||f.axis!="y"){if((c.overflowOffset.left+c.scrollParent[0].offsetWidth)-d.pageX<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft+f.scrollSpeed}else{if(d.pageX-c.overflowOffset.left<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft-f.scrollSpeed}}}}else{if(!f.axis||f.axis!="x"){if(d.pageY-a(document).scrollTop()<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-f.scrollSpeed)}else{if(a(window).height()-(d.pageY-a(document).scrollTop())<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+f.scrollSpeed)}}}if(!f.axis||f.axis!="y"){if(d.pageX-a(document).scrollLeft()<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-f.scrollSpeed)}else{if(a(window).width()-(d.pageX-a(document).scrollLeft())<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+f.scrollSpeed)}}}}if(b!==false&&a.ui.ddmanager&&!f.dropBehaviour){a.ui.ddmanager.prepareOffsets(c,d)}}});a.ui.plugin.add("draggable","snap",{start:function(c,d){var b=a(this).data("draggable"),e=b.options;b.snapElements=[];a(e.snap.constructor!=String?(e.snap.items||":data(draggable)"):e.snap).each(function(){var g=a(this);var f=g.offset();if(this!=b.element[0]){b.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})}})},drag:function(u,p){var g=a(this).data("draggable"),q=g.options;var y=q.snapTolerance;var x=p.offset.left,w=x+g.helperProportions.width,f=p.offset.top,e=f+g.helperProportions.height;for(var v=g.snapElements.length-1;v>=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y<x&&x<n+y&&m-y<f&&f<A+y)||(s-y<x&&x<n+y&&m-y<e&&e<A+y)||(s-y<w&&w<n+y&&m-y<f&&f<A+y)||(s-y<w&&w<n+y&&m-y<e&&e<A+y))){if(g.snapElements[v].snapping){(g.options.snap.release&&g.options.snap.release.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=false;continue}if(q.snapMode!="inner"){var c=Math.abs(m-e)<=y;var z=Math.abs(A-f)<=y;var j=Math.abs(s-w)<=y;var k=Math.abs(n-x)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s-g.helperProportions.width}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n}).left-g.margins.left}}var h=(c||z||j||k);if(q.snapMode!="outer"){var c=Math.abs(m-f)<=y;var z=Math.abs(A-e)<=y;var j=Math.abs(s-x)<=y;var k=Math.abs(n-w)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A-g.helperProportions.height,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n-g.helperProportions.width}).left-g.margins.left}}if(!g.snapElements[v].snapping&&(c||z||j||k||h)){(g.options.snap.snap&&g.options.snap.snap.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=(c||z||j||k||h)}}});a.ui.plugin.add("draggable","stack",{start:function(b,c){var e=a(this).data("draggable").options;var d=a.makeArray(a(e.stack.group)).sort(function(g,f){return(parseInt(a(g).css("zIndex"),10)||e.stack.min)-(parseInt(a(f).css("zIndex"),10)||e.stack.min)});a(d).each(function(f){this.style.zIndex=e.stack.min+f});this[0].style.zIndex=e.stack.min+d.length}});a.ui.plugin.add("draggable","zIndex",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("zIndex")){e._zIndex=b.css("zIndex")}b.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._zIndex){a(c.helper).css("zIndex",d._zIndex)}}})})(jQuery);;/*
|
23
|
+
* jQuery UI Droppable 1.7.2
|
24
|
+
*
|
25
|
+
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
26
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
27
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
28
|
+
*
|
29
|
+
* http://docs.jquery.com/UI/Droppables
|
30
|
+
*
|
31
|
+
* Depends:
|
32
|
+
* ui.core.js
|
33
|
+
* ui.draggable.js
|
34
|
+
*/
|
35
|
+
(function(a){a.widget("ui.droppable",{_init:function(){var c=this.options,b=c.accept;this.isover=0;this.isout=1;this.options.accept=this.options.accept&&a.isFunction(this.options.accept)?this.options.accept:function(e){return e.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};a.ui.ddmanager.droppables[this.options.scope]=a.ui.ddmanager.droppables[this.options.scope]||[];a.ui.ddmanager.droppables[this.options.scope].push(this);(this.options.addClasses&&this.element.addClass("ui-droppable"))},destroy:function(){var b=a.ui.ddmanager.droppables[this.options.scope];for(var c=0;c<b.length;c++){if(b[c]==this){b.splice(c,1)}}this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable")},_setData:function(b,c){if(b=="accept"){this.options.accept=c&&a.isFunction(c)?c:function(e){return e.is(c)}}else{a.widget.prototype._setData.apply(this,arguments)}},_activate:function(c){var b=a.ui.ddmanager.current;if(this.options.activeClass){this.element.addClass(this.options.activeClass)}(b&&this._trigger("activate",c,this.ui(b)))},_deactivate:function(c){var b=a.ui.ddmanager.current;if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}(b&&this._trigger("deactivate",c,this.ui(b)))},_over:function(c){var b=a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return}if(this.options.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.hoverClass){this.element.addClass(this.options.hoverClass)}this._trigger("over",c,this.ui(b))}},_out:function(c){var b=a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return}if(this.options.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("out",c,this.ui(b))}},_drop:function(c,d){var b=d||a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return false}var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var f=a.data(this,"droppable");if(f.options.greedy&&a.ui.intersect(b,a.extend(f,{offset:f.element.offset()}),f.options.tolerance)){e=true;return false}});if(e){return false}if(this.options.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("drop",c,this.ui(b));return this.element}return false},ui:function(b){return{draggable:(b.currentItem||b.element),helper:b.helper,position:b.position,absolutePosition:b.positionAbs,offset:b.positionAbs}}});a.extend(a.ui.droppable,{version:"1.7.2",eventPrefix:"drop",defaults:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"}});a.ui.intersect=function(q,j,o){if(!j.offset){return false}var e=(q.positionAbs||q.position.absolute).left,d=e+q.helperProportions.width,n=(q.positionAbs||q.position.absolute).top,m=n+q.helperProportions.height;var g=j.offset.left,c=g+j.proportions.width,p=j.offset.top,k=p+j.proportions.height;switch(o){case"fit":return(g<e&&d<c&&p<n&&m<k);break;case"intersect":return(g<e+(q.helperProportions.width/2)&&d-(q.helperProportions.width/2)<c&&p<n+(q.helperProportions.height/2)&&m-(q.helperProportions.height/2)<k);break;case"pointer":var h=((q.positionAbs||q.position.absolute).left+(q.clickOffset||q.offset.click).left),i=((q.positionAbs||q.position.absolute).top+(q.clickOffset||q.offset.click).top),f=a.ui.isOver(i,h,p,g,j.proportions.height,j.proportions.width);return f;break;case"touch":return((n>=p&&n<=k)||(m>=p&&m<=k)||(n<p&&m>k))&&((e>=g&&e<=c)||(d>=g&&d<=c)||(e<g&&d>c));break;default:return false;break}};a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,g){var b=a.ui.ddmanager.droppables[e.options.scope];var f=g?g.type:null;var h=(e.currentItem||e.element).find(":data(droppable)").andSelf();droppablesLoop:for(var d=0;d<b.length;d++){if(b[d].options.disabled||(e&&!b[d].options.accept.call(b[d].element[0],(e.currentItem||e.element)))){continue}for(var c=0;c<h.length;c++){if(h[c]==b[d].element[0]){b[d].proportions.height=0;continue droppablesLoop}}b[d].visible=b[d].element.css("display")!="none";if(!b[d].visible){continue}b[d].offset=b[d].element.offset();b[d].proportions={width:b[d].element[0].offsetWidth,height:b[d].element[0].offsetHeight};if(f=="mousedown"){b[d]._activate.call(b[d],g)}}},drop:function(b,c){var d=false;a.each(a.ui.ddmanager.droppables[b.options.scope],function(){if(!this.options){return}if(!this.options.disabled&&this.visible&&a.ui.intersect(b,this,this.options.tolerance)){d=this._drop.call(this,c)}if(!this.options.disabled&&this.visible&&this.options.accept.call(this.element[0],(b.currentItem||b.element))){this.isout=1;this.isover=0;this._deactivate.call(this,c)}});return d},drag:function(b,c){if(b.options.refreshPositions){a.ui.ddmanager.prepareOffsets(b,c)}a.each(a.ui.ddmanager.droppables[b.options.scope],function(){if(this.options.disabled||this.greedyChild||!this.visible){return}var e=a.ui.intersect(b,this,this.options.tolerance);var g=!e&&this.isover==1?"isout":(e&&this.isover==0?"isover":null);if(!g){return}var f;if(this.options.greedy){var d=this.element.parents(":data(droppable):eq(0)");if(d.length){f=a.data(d[0],"droppable");f.greedyChild=(g=="isover"?1:0)}}if(f&&g=="isover"){f.isover=0;f.isout=1;f._out.call(f,c)}this[g]=1;this[g=="isout"?"isover":"isout"]=0;this[g=="isover"?"_over":"_out"].call(this,c);if(f&&g=="isout"){f.isout=0;f.isover=1;f._over.call(f,c)}})}}})(jQuery);;
|
@@ -5,19 +5,20 @@ describe Capybara::Session do
|
|
5
5
|
before do
|
6
6
|
@session = Capybara::Session.new(:culerity, TestApp)
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
describe '#driver' do
|
10
10
|
it "should be a rack test driver" do
|
11
11
|
@session.driver.should be_an_instance_of(Capybara::Driver::Culerity)
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
describe '#mode' do
|
16
16
|
it "should remember the mode" do
|
17
17
|
@session.mode.should == :culerity
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
it_should_behave_like "session"
|
22
|
+
it_should_behave_like "session with javascript support"
|
22
23
|
end
|
23
24
|
end
|
@@ -5,19 +5,20 @@ describe Capybara::Session do
|
|
5
5
|
before do
|
6
6
|
@session = Capybara::Session.new(:rack_test, TestApp)
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
describe '#driver' do
|
10
10
|
it "should be a rack test driver" do
|
11
11
|
@session.driver.should be_an_instance_of(Capybara::Driver::RackTest)
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
describe '#mode' do
|
16
16
|
it "should remember the mode" do
|
17
17
|
@session.mode.should == :rack_test
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
it_should_behave_like "session"
|
22
|
+
it_should_behave_like "session without javascript support"
|
22
23
|
end
|
23
24
|
end
|
@@ -5,19 +5,20 @@ describe Capybara::Session do
|
|
5
5
|
before do
|
6
6
|
@session = Capybara::Session.new(:selenium, TestApp)
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
describe '#driver' do
|
10
|
-
it "should be a
|
10
|
+
it "should be a selenium driver" do
|
11
11
|
@session.driver.should be_an_instance_of(Capybara::Driver::Selenium)
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
describe '#mode' do
|
16
16
|
it "should remember the mode" do
|
17
17
|
@session.mode.should == :selenium
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
it_should_behave_like "session"
|
22
|
+
it_should_behave_like "session with javascript support"
|
22
23
|
end
|
23
24
|
end
|
data/spec/session_spec.rb
CHANGED
@@ -67,6 +67,14 @@ shared_examples_for "session" do
|
|
67
67
|
@session.visit('/form')
|
68
68
|
end
|
69
69
|
|
70
|
+
context "with multiple values with the same name" do
|
71
|
+
it "should use the latest given value" do
|
72
|
+
@session.check('Terms of Use')
|
73
|
+
@session.click_button('awesome')
|
74
|
+
extract_results(@session)['terms_of_use'].should == '1'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
70
78
|
context "with value given on a submit button" do
|
71
79
|
before do
|
72
80
|
@session.click_button('awesome')
|
@@ -77,6 +85,10 @@ shared_examples_for "session" do
|
|
77
85
|
@results['first_name'].should == 'John'
|
78
86
|
end
|
79
87
|
|
88
|
+
it "should escape fields when submitting" do
|
89
|
+
@results['phone'].should == '+1 555 7021'
|
90
|
+
end
|
91
|
+
|
80
92
|
it "should serialize and submit password fields" do
|
81
93
|
@results['password'].should == 'seeekrit'
|
82
94
|
end
|
@@ -173,7 +185,7 @@ shared_examples_for "session" do
|
|
173
185
|
end.should raise_error(Capybara::ElementNotFound)
|
174
186
|
end
|
175
187
|
end
|
176
|
-
|
188
|
+
|
177
189
|
it "should serialize and send GET forms" do
|
178
190
|
@session.visit('/form')
|
179
191
|
@session.click_button('med')
|
@@ -205,6 +217,12 @@ shared_examples_for "session" do
|
|
205
217
|
extract_results(@session)['first_name'].should == 'Harry'
|
206
218
|
end
|
207
219
|
|
220
|
+
it "should favour exact label matches over partial matches" do
|
221
|
+
@session.fill_in('Name', :with => 'Harry Jones')
|
222
|
+
@session.click_button('awesome')
|
223
|
+
extract_results(@session)['name'].should == 'Harry Jones'
|
224
|
+
end
|
225
|
+
|
208
226
|
it "should fill in a textarea by id" do
|
209
227
|
@session.fill_in('form_description', :with => 'Texty text')
|
210
228
|
@session.click_button('awesome')
|
@@ -254,6 +272,12 @@ shared_examples_for "session" do
|
|
254
272
|
@session.click_button('awesome')
|
255
273
|
extract_results(@session)['gender'].should == 'both'
|
256
274
|
end
|
275
|
+
|
276
|
+
context "with a locator that doesn't exist" do
|
277
|
+
it "should raise an error" do
|
278
|
+
running { @session.choose('does not exist') }.should raise_error(Capybara::ElementNotFound)
|
279
|
+
end
|
280
|
+
end
|
257
281
|
end
|
258
282
|
|
259
283
|
describe "#check" do
|
@@ -272,6 +296,12 @@ shared_examples_for "session" do
|
|
272
296
|
@session.click_button('awesome')
|
273
297
|
extract_results(@session)['pets'].should include('dog', 'cat', 'hamster')
|
274
298
|
end
|
299
|
+
|
300
|
+
context "with a locator that doesn't exist" do
|
301
|
+
it "should raise an error" do
|
302
|
+
running { @session.check('does not exist') }.should raise_error(Capybara::ElementNotFound)
|
303
|
+
end
|
304
|
+
end
|
275
305
|
end
|
276
306
|
|
277
307
|
describe "#uncheck" do
|
@@ -292,6 +322,12 @@ shared_examples_for "session" do
|
|
292
322
|
extract_results(@session)['pets'].should include('dog')
|
293
323
|
extract_results(@session)['pets'].should_not include('hamster')
|
294
324
|
end
|
325
|
+
|
326
|
+
context "with a locator that doesn't exist" do
|
327
|
+
it "should raise an error" do
|
328
|
+
running { @session.uncheck('does not exist') }.should raise_error(Capybara::ElementNotFound)
|
329
|
+
end
|
330
|
+
end
|
295
331
|
end
|
296
332
|
|
297
333
|
describe "#select" do
|
@@ -310,6 +346,12 @@ shared_examples_for "session" do
|
|
310
346
|
@session.click_button('awesome')
|
311
347
|
extract_results(@session)['locale'].should == 'fi'
|
312
348
|
end
|
349
|
+
|
350
|
+
context "with a locator that doesn't exist" do
|
351
|
+
it "should raise an error" do
|
352
|
+
running { @session.select('foo', :from => 'does not exist') }.should raise_error(Capybara::ElementNotFound)
|
353
|
+
end
|
354
|
+
end
|
313
355
|
end
|
314
356
|
|
315
357
|
describe '#has_content?' do
|
@@ -320,6 +362,13 @@ shared_examples_for "session" do
|
|
320
362
|
@session.should have_content('Redirect')
|
321
363
|
end
|
322
364
|
|
365
|
+
it "should be true if scoped to an element which has the content" do
|
366
|
+
@session.visit('/with_html')
|
367
|
+
@session.within("//a[@title='awesome title']") do
|
368
|
+
@session.should have_content('labore')
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
323
372
|
it "should be false if the given content is not on the page" do
|
324
373
|
@session.visit('/with_html')
|
325
374
|
@session.should_not have_content('xxxxyzzz')
|
@@ -358,7 +407,7 @@ shared_examples_for "session" do
|
|
358
407
|
@session.should_not have_xpath("//p//a[@id='doesnotexist']")
|
359
408
|
@session.should_not have_xpath("//p[contains(.,'thisstringisnotonpage')]")
|
360
409
|
end
|
361
|
-
|
410
|
+
|
362
411
|
it "should respect scopes" do
|
363
412
|
@session.within "//p[@id='first']" do
|
364
413
|
@session.should have_xpath("//a[@id='foo']")
|
@@ -384,20 +433,20 @@ shared_examples_for "session" do
|
|
384
433
|
@session.should_not have_xpath("//p//a[@id='doesnotexist']", :count => 1)
|
385
434
|
end
|
386
435
|
end
|
387
|
-
|
436
|
+
|
388
437
|
context "with text" do
|
389
438
|
it "should discard all matches where the given string is not contained" do
|
390
439
|
@session.should have_xpath("//p//a", :text => "Redirect", :count => 1)
|
391
440
|
@session.should_not have_xpath("//p", :text => "Doesnotexist")
|
392
441
|
end
|
393
|
-
|
442
|
+
|
394
443
|
it "should discard all matches where the given regexp is not matched" do
|
395
444
|
@session.should have_xpath("//p//a", :text => /re[dab]i/i, :count => 1)
|
396
445
|
@session.should_not have_xpath("//p//a", :text => /Red$/)
|
397
446
|
end
|
398
447
|
end
|
399
448
|
end
|
400
|
-
|
449
|
+
|
401
450
|
describe '#has_css?' do
|
402
451
|
before do
|
403
452
|
@session.visit('/with_html')
|
@@ -413,7 +462,7 @@ shared_examples_for "session" do
|
|
413
462
|
@session.should_not have_css("p a#doesnotexist")
|
414
463
|
@session.should_not have_css("p.nosuchclass")
|
415
464
|
end
|
416
|
-
|
465
|
+
|
417
466
|
it "should respect scopes" do
|
418
467
|
@session.within "//p[@id='first']" do
|
419
468
|
@session.should have_css("a#foo")
|
@@ -437,13 +486,13 @@ shared_examples_for "session" do
|
|
437
486
|
@session.should_not have_css("p a.doesnotexist", :count => 1)
|
438
487
|
end
|
439
488
|
end
|
440
|
-
|
489
|
+
|
441
490
|
context "with text" do
|
442
491
|
it "should discard all matches where the given string is not contained" do
|
443
492
|
@session.should have_css("p a", :text => "Redirect", :count => 1)
|
444
493
|
@session.should_not have_css("p a", :text => "Doesnotexist")
|
445
494
|
end
|
446
|
-
|
495
|
+
|
447
496
|
it "should discard all matches where the given regexp is not matched" do
|
448
497
|
@session.should have_css("p a", :text => /re[dab]i/i, :count => 1)
|
449
498
|
@session.should_not have_css("p a", :text => /Red$/)
|
@@ -486,10 +535,19 @@ shared_examples_for "session" do
|
|
486
535
|
@session.click_button('Upload')
|
487
536
|
@session.body.should include(File.read(@test_file_path))
|
488
537
|
end
|
538
|
+
|
539
|
+
it "should not break if no file is submitted" do
|
540
|
+
@session.click_button('Upload')
|
541
|
+
end
|
489
542
|
end
|
490
543
|
|
544
|
+
context "with a locator that doesn't exist" do
|
545
|
+
it "should raise an error" do
|
546
|
+
running { @session.attach_file('does not exist', 'foo.txt') }.should raise_error(Capybara::ElementNotFound)
|
547
|
+
end
|
548
|
+
end
|
491
549
|
end
|
492
|
-
|
550
|
+
|
493
551
|
describe '#find_field' do
|
494
552
|
before do
|
495
553
|
@session.visit('/form')
|
@@ -500,28 +558,17 @@ shared_examples_for "session" do
|
|
500
558
|
@session.find_field('form_description').text.should == 'Descriptive text goes here'
|
501
559
|
@session.find_field('Region')[:name].should == 'form[region]'
|
502
560
|
end
|
503
|
-
|
504
|
-
it "should
|
505
|
-
|
506
|
-
@session.find_field('Does not exist')
|
507
|
-
}.should raise_error(Capybara::ElementNotFound)
|
508
|
-
end
|
509
|
-
|
510
|
-
it "should find only given kind of field" do
|
511
|
-
@session.find_field('form_description', :text_field, :text_area).text.should == 'Descriptive text goes here'
|
512
|
-
running {
|
513
|
-
@session.find_field('form_description', :password_field)
|
514
|
-
}.should raise_error(Capybara::ElementNotFound)
|
561
|
+
|
562
|
+
it "should be nil if the field doesn't exist" do
|
563
|
+
@session.find_field('Does not exist').should be_nil
|
515
564
|
end
|
516
|
-
|
565
|
+
|
517
566
|
it "should be aliased as 'field_labeled' for webrat compatibility" do
|
518
567
|
@session.field_labeled('Dog').value.should == 'dog'
|
519
|
-
|
520
|
-
@session.field_labeled('Does not exist')
|
521
|
-
}.should raise_error(Capybara::ElementNotFound)
|
568
|
+
@session.field_labeled('Does not exist').should be_nil
|
522
569
|
end
|
523
570
|
end
|
524
|
-
|
571
|
+
|
525
572
|
describe '#find_link' do
|
526
573
|
before do
|
527
574
|
@session.visit('/with_html')
|
@@ -531,14 +578,12 @@ shared_examples_for "session" do
|
|
531
578
|
@session.find_link('foo').text.should == "ullamco"
|
532
579
|
@session.find_link('labore')[:href].should == "/with_simple_html"
|
533
580
|
end
|
534
|
-
|
535
|
-
it "should
|
536
|
-
|
537
|
-
@session.find_link('Does not exist')
|
538
|
-
}.should raise_error(Capybara::ElementNotFound)
|
581
|
+
|
582
|
+
it "should return nil if the field doesn't exist" do
|
583
|
+
@session.find_link('Does not exist').should be_nil
|
539
584
|
end
|
540
585
|
end
|
541
|
-
|
586
|
+
|
542
587
|
describe '#find_button' do
|
543
588
|
before do
|
544
589
|
@session.visit('/form')
|
@@ -548,11 +593,110 @@ shared_examples_for "session" do
|
|
548
593
|
@session.find_button('med')[:id].should == "mediocre"
|
549
594
|
@session.find_button('crap321').value.should == "crappy"
|
550
595
|
end
|
596
|
+
|
597
|
+
it "should return nil if the field doesn't exist" do
|
598
|
+
@session.find_button('Does not exist').should be_nil
|
599
|
+
end
|
600
|
+
end
|
601
|
+
|
602
|
+
describe '#all' do
|
603
|
+
before do
|
604
|
+
@session.visit('/with_html')
|
605
|
+
end
|
606
|
+
|
607
|
+
it "should find all elements using the given locator" do
|
608
|
+
@session.all('//p').should have(3).elements
|
609
|
+
@session.all('//h1').first.text.should == 'This is a test'
|
610
|
+
@session.all("//input[@id='test_field']").first[:value].should == 'monkey'
|
611
|
+
end
|
612
|
+
|
613
|
+
it "should return an empty array when nothing was found" do
|
614
|
+
@session.all('//div').should be_empty
|
615
|
+
end
|
616
|
+
|
617
|
+
it "should accept an XPath instance" do
|
618
|
+
@session.visit('/form')
|
619
|
+
@xpath = Capybara::XPath.text_field('Name')
|
620
|
+
@result = @session.all(@xpath)
|
621
|
+
@result.map(&:value).should include('Smith', 'John', 'John Smith')
|
622
|
+
end
|
623
|
+
|
624
|
+
context "within a scope" do
|
625
|
+
before do
|
626
|
+
@session.visit('/with_scope')
|
627
|
+
end
|
628
|
+
|
629
|
+
it "should find any element using the given locator" do
|
630
|
+
@session.within(:xpath, "//div[@id='for_bar']") do
|
631
|
+
@session.all('//li').should have(2).elements
|
632
|
+
end
|
633
|
+
end
|
634
|
+
end
|
635
|
+
end
|
636
|
+
|
637
|
+
describe '#find' do
|
638
|
+
before do
|
639
|
+
@session.visit('/with_html')
|
640
|
+
end
|
641
|
+
|
642
|
+
it "should find the first element using the given locator" do
|
643
|
+
@session.find('//h1').text.should == 'This is a test'
|
644
|
+
@session.find("//input[@id='test_field']")[:value].should == 'monkey'
|
645
|
+
end
|
646
|
+
|
647
|
+
it "should return nil when nothing was found" do
|
648
|
+
@session.find('//div').should be_nil
|
649
|
+
end
|
650
|
+
|
651
|
+
it "should accept an XPath instance and respect the order of paths" do
|
652
|
+
@session.visit('/form')
|
653
|
+
@xpath = Capybara::XPath.text_field('Name')
|
654
|
+
@session.find(@xpath).value.should == 'John Smith'
|
655
|
+
end
|
656
|
+
|
657
|
+
context "within a scope" do
|
658
|
+
before do
|
659
|
+
@session.visit('/with_scope')
|
660
|
+
end
|
661
|
+
|
662
|
+
it "should find the first element using the given locator" do
|
663
|
+
@session.within(:xpath, "//div[@id='for_bar']") do
|
664
|
+
@session.find('//li').text.should =~ /With Simple HTML/
|
665
|
+
end
|
666
|
+
end
|
667
|
+
end
|
668
|
+
end
|
669
|
+
|
670
|
+
describe '#wait_for' do
|
671
|
+
before do
|
672
|
+
@session.visit('/with_html')
|
673
|
+
end
|
674
|
+
|
675
|
+
it "should find the first element using the given locator" do
|
676
|
+
@session.wait_for('//h1').text.should == 'This is a test'
|
677
|
+
@session.wait_for("//input[@id='test_field']")[:value].should == 'monkey'
|
678
|
+
end
|
551
679
|
|
552
|
-
it "should
|
553
|
-
|
554
|
-
|
555
|
-
|
680
|
+
it "should return nil when nothing was found" do
|
681
|
+
@session.wait_for('//div').should be_nil
|
682
|
+
end
|
683
|
+
|
684
|
+
it "should accept an XPath instance and respect the order of paths" do
|
685
|
+
@session.visit('/form')
|
686
|
+
@xpath = Capybara::XPath.text_field('Name')
|
687
|
+
@session.wait_for(@xpath).value.should == 'John Smith'
|
688
|
+
end
|
689
|
+
|
690
|
+
context "within a scope" do
|
691
|
+
before do
|
692
|
+
@session.visit('/with_scope')
|
693
|
+
end
|
694
|
+
|
695
|
+
it "should find the first element using the given locator" do
|
696
|
+
@session.within(:xpath, "//div[@id='for_bar']") do
|
697
|
+
@session.wait_for('//li').text.should =~ /With Simple HTML/
|
698
|
+
end
|
699
|
+
end
|
556
700
|
end
|
557
701
|
end
|
558
702
|
|
@@ -560,7 +704,7 @@ shared_examples_for "session" do
|
|
560
704
|
before do
|
561
705
|
@session.visit('/with_scope')
|
562
706
|
end
|
563
|
-
|
707
|
+
|
564
708
|
context "with CSS selector" do
|
565
709
|
it "should click links in the given scope" do
|
566
710
|
@session.within(:css, "ul li[contains('With Simple HTML')]") do
|
@@ -569,7 +713,7 @@ shared_examples_for "session" do
|
|
569
713
|
@session.body.should include('<h1>Bar</h1>')
|
570
714
|
end
|
571
715
|
end
|
572
|
-
|
716
|
+
|
573
717
|
context "with XPath selector" do
|
574
718
|
it "should click links in the given scope" do
|
575
719
|
@session.within(:xpath, "//li[contains(.,'With Simple HTML')]") do
|
@@ -578,7 +722,7 @@ shared_examples_for "session" do
|
|
578
722
|
@session.body.should include('<h1>Bar</h1>')
|
579
723
|
end
|
580
724
|
end
|
581
|
-
|
725
|
+
|
582
726
|
context "with the default selector" do
|
583
727
|
it "should use XPath" do
|
584
728
|
@session.within("//li[contains(., 'With Simple HTML')]") do
|
@@ -587,12 +731,12 @@ shared_examples_for "session" do
|
|
587
731
|
@session.body.should include('<h1>Bar</h1>')
|
588
732
|
end
|
589
733
|
end
|
590
|
-
|
734
|
+
|
591
735
|
context "with the default selector set to CSS" do
|
592
736
|
after do
|
593
737
|
Capybara.default_selector = :xpath
|
594
738
|
end
|
595
|
-
|
739
|
+
|
596
740
|
it "should use CSS" do
|
597
741
|
Capybara.default_selector = :css
|
598
742
|
@session.within("ul li[contains('With Simple HTML')]") do
|
@@ -601,7 +745,7 @@ shared_examples_for "session" do
|
|
601
745
|
@session.body.should include('<h1>Bar</h1>')
|
602
746
|
end
|
603
747
|
end
|
604
|
-
|
748
|
+
|
605
749
|
context "with click_link" do
|
606
750
|
it "should click links in the given scope" do
|
607
751
|
@session.within("//li[contains(.,'With Simple HTML')]") do
|
@@ -629,7 +773,7 @@ shared_examples_for "session" do
|
|
629
773
|
@session.body.should include('Hello world')
|
630
774
|
end
|
631
775
|
end
|
632
|
-
|
776
|
+
|
633
777
|
it "should raise an error if the scope is not found on the page" do
|
634
778
|
running {
|
635
779
|
@session.within("//div[@id='doesnotexist']") do
|
@@ -653,12 +797,12 @@ shared_examples_for "session" do
|
|
653
797
|
end
|
654
798
|
end
|
655
799
|
end
|
656
|
-
|
800
|
+
|
657
801
|
describe '#within_fieldset' do
|
658
802
|
before do
|
659
803
|
@session.visit('/fieldsets')
|
660
804
|
end
|
661
|
-
|
805
|
+
|
662
806
|
it "should restrict scope to a fieldset given by id" do
|
663
807
|
@session.within_fieldset("villain_fieldset") do
|
664
808
|
@session.fill_in("Name", :with => 'Goldfinger')
|
@@ -666,7 +810,7 @@ shared_examples_for "session" do
|
|
666
810
|
end
|
667
811
|
extract_results(@session)['villain_name'].should == 'Goldfinger'
|
668
812
|
end
|
669
|
-
|
813
|
+
|
670
814
|
it "should restrict scope to a fieldset given by legend" do
|
671
815
|
@session.within_fieldset("Villain") do
|
672
816
|
@session.fill_in("Name", :with => 'Goldfinger')
|
@@ -675,12 +819,12 @@ shared_examples_for "session" do
|
|
675
819
|
extract_results(@session)['villain_name'].should == 'Goldfinger'
|
676
820
|
end
|
677
821
|
end
|
678
|
-
|
822
|
+
|
679
823
|
describe '#within_table' do
|
680
824
|
before do
|
681
825
|
@session.visit('/tables')
|
682
826
|
end
|
683
|
-
|
827
|
+
|
684
828
|
it "should restrict scope to a fieldset given by id" do
|
685
829
|
@session.within_table("girl_table") do
|
686
830
|
@session.fill_in("Name", :with => 'Christmas')
|
@@ -688,7 +832,7 @@ shared_examples_for "session" do
|
|
688
832
|
end
|
689
833
|
extract_results(@session)['girl_name'].should == 'Christmas'
|
690
834
|
end
|
691
|
-
|
835
|
+
|
692
836
|
it "should restrict scope to a fieldset given by legend" do
|
693
837
|
@session.within_table("Villain") do
|
694
838
|
@session.fill_in("Name", :with => 'Quantum')
|
@@ -697,6 +841,60 @@ shared_examples_for "session" do
|
|
697
841
|
extract_results(@session)['villain_name'].should == 'Quantum'
|
698
842
|
end
|
699
843
|
end
|
844
|
+
|
845
|
+
end
|
846
|
+
|
847
|
+
shared_examples_for "session without javascript support" do
|
848
|
+
describe "#evaluate_script" do
|
849
|
+
before{ @session.visit('/with_js') }
|
850
|
+
it "should raise an error" do
|
851
|
+
running {
|
852
|
+
@session.evaluate_script("1+5")
|
853
|
+
}.should raise_error(Capybara::NotSupportedByDriverError)
|
854
|
+
end
|
855
|
+
end
|
856
|
+
end
|
857
|
+
|
858
|
+
shared_examples_for "session with javascript support" do
|
859
|
+
describe "#evaluate_script" do
|
860
|
+
before{ @session.visit('/with_js') }
|
861
|
+
it "should return the evaluated script" do
|
862
|
+
@session.evaluate_script("1+3").should == 4
|
863
|
+
end
|
864
|
+
end
|
865
|
+
|
866
|
+
describe '#wait_for' do
|
867
|
+
it "should wait for asynchronous load" do
|
868
|
+
@session.visit('/with_js')
|
869
|
+
@session.click_link('Click me')
|
870
|
+
@session.wait_for("//a[contains(.,'Has been clicked')]")[:href].should == '#'
|
871
|
+
end
|
872
|
+
end
|
873
|
+
|
874
|
+
describe '#click_link' do
|
875
|
+
it "should wait for asynchronous load" do
|
876
|
+
@session.visit('/with_js')
|
877
|
+
@session.click_link('Click me')
|
878
|
+
@session.click_link('Has been clicked')
|
879
|
+
end
|
880
|
+
end
|
881
|
+
|
882
|
+
describe '#click_button' do
|
883
|
+
it "should wait for asynchronous load" do
|
884
|
+
@session.visit('/with_js')
|
885
|
+
@session.click_link('Click me')
|
886
|
+
@session.click_button('New Here')
|
887
|
+
end
|
888
|
+
end
|
889
|
+
|
890
|
+
describe '#fill_in' do
|
891
|
+
it "should wait for asynchronous load" do
|
892
|
+
@session.visit('/with_js')
|
893
|
+
@session.click_link('Click me')
|
894
|
+
@session.fill_in('new_field', :with => 'Testing...')
|
895
|
+
end
|
896
|
+
end
|
897
|
+
|
700
898
|
end
|
701
899
|
|
702
900
|
describe Capybara::Session do
|
@@ -708,3 +906,4 @@ describe Capybara::Session do
|
|
708
906
|
end
|
709
907
|
end
|
710
908
|
end
|
909
|
+
|