page-object 0.6.2 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,2 +1,8 @@
1
+ language: ruby
1
2
  rvm:
2
- - 1.9.2
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - rbx-19mode
7
+ - ree
8
+ - ruby-head
data/ChangeLog CHANGED
@@ -1,3 +1,14 @@
1
+ === Version 0.6.3 / 2012-3-1
2
+ * Enhancements
3
+ * Added #expected_title method to PageObject
4
+ * Added #expected_element method to PageObject
5
+ * Added #execute_script method to PageObject
6
+ * Updated to use selenium-webdriver 2.20.0
7
+ * Fixes
8
+ * Udates to the README - Thanks to p0deje and ivaravko
9
+ WARNING: This change breaks existing code
10
+ * Changed the generated getter for select_list to return the text instead of the value
11
+
1
12
  === Version 0.6.2 / 2012-2-12
2
13
  * Enhancements
3
14
  * Added #wait_for_ajax support for the jQuery framework
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Build Status](http://travis-ci.org/cheezy/page-object.png)](http://travis-ci.org/cheezy/page-object)
4
4
 
5
5
 
6
- A simple gem that assists in creating flexible page objects for testing browser based appications. The goal is to facilitate creating abstraction layers in your tests to decouple the tests from the item they are testing and to provide a simple interface to the elements on a page. It works with both watir-webdriver and selenium-webdriver.
6
+ A simple gem that assists in creating flexible page objects for testing browser based applications. The goal is to facilitate creating abstraction layers in your tests to decouple the tests from the item they are testing and to provide a simple interface to the elements on a page. It works with both watir-webdriver and selenium-webdriver.
7
7
 
8
8
  ## Documentation
9
9
 
@@ -22,56 +22,70 @@ To read about the motivation for this gem please read this [blog entry](http://w
22
22
 
23
23
  You define a new page object by including the PageObject module:
24
24
 
25
- class LoginPage
26
- include PageObject
27
- end
25
+ ````ruby
26
+ class LoginPage
27
+ include PageObject
28
+ end
29
+ ````
28
30
 
29
- When you include this module numerous methods are added to your class that allow you to easily define your page. For the login page you might add the following:
31
+ When you include this module numerous methods are added to your class that allow you to easily define your page. For the login page you might add the following:
30
32
 
31
- class LoginPage
32
- include PageObject
33
+ ````ruby
34
+ class LoginPage
35
+ include PageObject
33
36
 
34
- text_field(:username, :id => 'username')
35
- text_field(:password, :id => 'password')
36
- button(:login, :id => 'login')
37
- end
38
-
39
- Calling the _text_field_ and _button_ methods adds several methods to our page object that allow us to interact with the items on the page. To login using this page we could simply write the following code:
40
-
41
- login_page.username = 'cheezy'
42
- login_page.password = 'secret'
43
- login_page.login
37
+ text_field(:username, :id => 'username')
38
+ text_field(:password, :id => 'password')
39
+ button(:login, :id => 'login')
40
+ end
41
+ ````
42
+
43
+ Calling the _text_field_ and _button_ methods adds several methods to our page object that allow us to interact with the items on the page. To login using this page we could simply write the following code:
44
+
45
+ ````ruby
46
+ login_page.username = 'cheezy'
47
+ login_page.password = 'secret'
48
+ login_page.login
49
+ ````
44
50
 
45
- Another approach might be to create higher level methods on our page object that hide the implementation details even further. Our page object might look like this:
51
+ Another approach might be to create higher level methods on our page object that hide the implementation details even further. Our page object might look like this:
46
52
 
47
- class LoginPage
48
- include PageObject
53
+ ````ruby
54
+ class LoginPage
55
+ include PageObject
49
56
 
50
- text_field(:username, :id => 'username')
51
- text_field(:password, :id => 'password')
52
- button(:login, :id => 'login')
57
+ text_field(:username, :id => 'username')
58
+ text_field(:password, :id => 'password')
59
+ button(:login, :id => 'login')
53
60
 
54
- def login_with(username, password)
55
- self.username = username
56
- self.password = password
57
- login
58
- end
59
- end
61
+ def login_with(username, password)
62
+ self.username = username
63
+ self.password = password
64
+ login
65
+ end
66
+ end
67
+ ````
60
68
 
61
69
  and your usage of the page would become:
62
70
 
63
- login_page.login_with 'cheezy', 'secret'
71
+ ````ruby
72
+ login_page.login_with 'cheezy', 'secret'
73
+ ````
64
74
 
65
75
  ### Creating your page object
66
- page-object supports both [watir-webdriver](https://github.com/jarib/watir-webdriver) and [selenium-webdriver](http://seleniumhq.org/docs/03_webdriver.html). The one used will be determined by which driver you pass into the constructor of your page object. The page object can be create like this:
76
+ page-object supports both [watir-webdriver](https://github.com/jarib/watir-webdriver) and [selenium-webdriver](http://seleniumhq.org/docs/03_webdriver.html). The one used will be determined by which driver you pass into the constructor of your page object. The page object can be create like this:
67
77
 
68
- browser = Watir::Browser.new :firefox
69
- my_page_object = MyPageObject.new(browser)
78
+ ````ruby
79
+ browser = Watir::Browser.new :firefox
80
+ my_page_object = MyPageObject.new(browser)
81
+ ````
70
82
 
71
83
  or
72
84
 
73
- browser = Selenium::WebDriver.for :firefox
74
- my_page_object = MyPageObject.new(browser)
85
+ ````ruby
86
+ browser = Selenium::WebDriver.for :firefox
87
+ my_page_object = MyPageObject.new(browser)
88
+ ````
75
89
 
76
90
  ## Known Issues
77
91
 
@@ -80,9 +94,9 @@ See [http://github.com/cheezy/page-object/issues](http://github.com/cheezy/page-
80
94
  ## Contribute
81
95
 
82
96
  * Fork the project.
83
- * Test drive your feature addition or bug fix. Adding specs is important and I will not accept a pull request that does not have tests.
97
+ * Test drive your feature addition or bug fix. Adding specs is important and I will not accept a pull request that does not have tests.
84
98
  * Make sure you describe your new feature with a cucumber scenario.
85
- * Make sure you provide RDoc comments for any new public method you add. Remember, others will be using this gem.
99
+ * Make sure you provide RDoc comments for any new public method you add. Remember, others will be using this gem.
86
100
  * Commit, do not mess with Rakefile, version, or ChangeLog.
87
101
  (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
88
102
  * Send me a pull request. Bonus points for topic branches.
@@ -12,3 +12,7 @@ Feature: Handling javascript events
12
12
  When I ask to compute "2 + 2"
13
13
  Then I should be able to wait for the answer "4"
14
14
 
15
+ Scenario: Executing javascript in the browser
16
+ Given I am on the static elements page
17
+ Given I execute the javascript "return 2 + 2;"
18
+ Then I should get the answer "4"
@@ -14,6 +14,15 @@ Feature: Page level actions
14
14
 
15
15
  Scenario: Getting the title from a web page
16
16
  Then the page should have the title "Static Elements Page"
17
+
18
+ Scenario: Validating the page title
19
+ Then the page should have the expected title
20
+
21
+ Scenario: Validating the expected element
22
+ Then the page should have the expected element
23
+
24
+ Scenario: Validating that an expected element does not exist
25
+ Then the page should not have the expected element
17
26
 
18
27
  Scenario: Waiting for something
19
28
  Then I should be able to wait for a block to return true
@@ -48,4 +57,4 @@ Feature: Page level actions
48
57
  Then the page should contain the text "Static Elements Page"
49
58
  When I press the forward button
50
59
  Then the page should contain the text "Success"
51
-
60
+
@@ -8,12 +8,13 @@ Feature: Select List
8
8
 
9
9
  Scenario: Selecting an element on the select list
10
10
  When I select "Test 2" from the select list
11
- Then the current item should be "option2"
11
+ Then the current item should be "Test 2"
12
12
 
13
13
  Scenario Outline: Locating select lists on the Page
14
14
  When I search for the select list by "<search_by>"
15
15
  Then I should be able to select "Test 2"
16
- And the value for the selected item should be "option2"
16
+ And the value for the selected item should be "Test 2"
17
+ And the value for the option should be "option2"
17
18
 
18
19
  Scenarios:
19
20
  | search_by |
@@ -26,7 +27,8 @@ Feature: Select List
26
27
  Scenario Outline: Locating a select list using multiple parameters
27
28
  When I search for the select list by "<param1>" and "<param2>"
28
29
  Then I should be able to select "Test 2"
29
- And the value for the selected item should be "option2"
30
+ And the value for the selected item should be "Test 2"
31
+ And the value for the option should be "option2"
30
32
 
31
33
  Scenarios:
32
34
  | param1 | param2 |
@@ -28,3 +28,11 @@ Then /^I should be able to wait for the answer "([^\"]*)"$/ do |answer|
28
28
  @page.wait_for_ajax
29
29
  @page.results.should == answer
30
30
  end
31
+
32
+ Given /^I execute the javascript "([^\"]*)"$/ do |script|
33
+ @answer = @page.execute_script script
34
+ end
35
+
36
+ Then /^I should get the answer "([^\"]*)"$/ do |answer|
37
+ @answer.should == answer.to_i
38
+ end
@@ -78,3 +78,18 @@ When /^I press the forward button$/ do
78
78
  @page.forward
79
79
  end
80
80
 
81
+ Then /^the page should have the expected title$/ do
82
+ @page.should have_expected_title
83
+ end
84
+
85
+ Then /^the page should have the expected element$/ do
86
+ @page.should have_expected_element
87
+ end
88
+
89
+ Then /^the page should not have the expected element$/ do
90
+ class FakePage
91
+ include PageObject
92
+ expected_element :blah
93
+ end
94
+ FakePage.new(@browser).should_not have_expected_element
95
+ end
@@ -43,3 +43,7 @@ Then /^the select list should know that "([^\"]*)" is selected$/ do |text|
43
43
  @page.sel_list_id_element.selected?(text).should be_true
44
44
  end
45
45
 
46
+ Then /^the value for the option should be "([^\"]*)"$/ do |value|
47
+ element = @page.send "sel_list_#{@how}_element".to_sym
48
+ element.value.should == value
49
+ end
@@ -1,6 +1,9 @@
1
1
  class Page
2
2
  include PageObject
3
3
 
4
+ expected_title "Static Elements Page"
5
+ expected_element :hello0
6
+
4
7
  link(:hello0, {:text => "Hello", :index => 0})
5
8
  link(:hello1, {:text => "Hello", :index => 1})
6
9
  link(:hello2, {:text => "Hello", :index => 2})
data/lib/page-object.rb CHANGED
@@ -66,8 +66,7 @@ module PageObject
66
66
 
67
67
  #
68
68
  # Set the javascript framework to use when determining number of
69
- # ajax requests. Valid frameworks are :jquery, :prototype, and
70
- # :dojo
69
+ # ajax requests. Valid frameworks are :jquery and :prototype
71
70
  #
72
71
  def self.javascript_framework=(framework)
73
72
  PageObject::JavascriptFrameworkFacade.framework = framework
@@ -209,6 +208,13 @@ module PageObject
209
208
  def prompt(answer, frame=nil, &block)
210
209
  platform.prompt(answer, frame, &block)
211
210
  end
211
+
212
+ #
213
+ # Execute javascript on the browser
214
+ #
215
+ def execute_script(script)
216
+ platform.execute_script(script)
217
+ end
212
218
 
213
219
  #
214
220
  # Identify an element as existing within a frame or iframe. A frame parameter
@@ -21,6 +21,42 @@ module PageObject
21
21
  end
22
22
  end
23
23
 
24
+ #
25
+ # Creates a method that compares the expected_title of a page against the actual.
26
+ # @param [String] expected_title the literal expected title for the page
27
+ # @param [Regexp] expected_title the expected title pattern for the page
28
+ # @return [boolean]
29
+ # @raise An exception if expected_title does not match actual title
30
+ #
31
+ # @example Specify 'Google' as the expected title of a page
32
+ # expected_title "Google"
33
+ # page.has_expected_title?
34
+ #
35
+ def expected_title(expected_title)
36
+ define_method("has_expected_title?") do
37
+ has_expected_title = expected_title.kind_of?(Regexp) ? expected_title =~ title : expected_title == title
38
+ raise "Expected title '#{expected_title}' instead of '#{title}'" unless has_expected_title
39
+ has_expected_title
40
+ end
41
+ end
42
+
43
+ #
44
+ # Creates a method that provides a way to initialize a page based upon an expected element.
45
+ # This is useful for pages that load dynamic content.
46
+ # @param [Symbol] the name given to the element in the declaration
47
+ # @param [optional, Integer] timeout default value is 5 seconds
48
+ # @return [boolean]
49
+ #
50
+ # @example Specify a text box named :address expected on the page within 10 seconds
51
+ # expected_element(:address, 10)
52
+ # page.has_expected_element?
53
+ #
54
+ def expected_element(element_name, timeout=5)
55
+ define_method("has_expected_element?") do
56
+ self.respond_to? "#{element_name}_element" and self.send("#{element_name}_element").when_present timeout
57
+ end
58
+ end
59
+
24
60
  #
25
61
  # Identify an element as existing within a frame or iframe. A frame parameter
26
62
  # is passed to the block and must be passed to the other calls to PageObject.
@@ -172,7 +208,7 @@ module PageObject
172
208
 
173
209
  #
174
210
  # adds four methods - one to select an item in a drop-down,
175
- # another to fetch the currently selected item, another
211
+ # another to fetch the currently selected item text, another
176
212
  # to retrieve the select list element, and another to check the
177
213
  # drop down's existence.
178
214
  #
@@ -95,6 +95,14 @@ module PageObject
95
95
  result && result.dup.each_key { |k| result[k.to_sym] = result.delete(k) }
96
96
  result
97
97
  end
98
+
99
+ #
100
+ # platform method to execute javascript on the browser
101
+ # See PageObject#execute_script
102
+ #
103
+ def execute_script(script)
104
+ @browser.execute_script script
105
+ end
98
106
 
99
107
  #
100
108
  # platform method to handle attaching to a running window
@@ -266,7 +274,9 @@ module PageObject
266
274
  #
267
275
  def select_list_value_for(identifier)
268
276
  process_selenium_call(identifier, Elements::SelectList, 'select') do |how, what|
269
- @browser.find_element(how, what).attribute('value')
277
+ @browser.find_element(how, what).find_elements(:tag_name => 'option').each do |o|
278
+ return o.text if o.selected?
279
+ end
270
280
  end
271
281
  end
272
282
 
@@ -104,6 +104,14 @@ module PageObject
104
104
  result && result.dup.each_key { |k| result[k.to_sym] = result.delete(k) }
105
105
  result
106
106
  end
107
+
108
+ #
109
+ # platform method to execute javascript on the browser
110
+ # See PageObject#execute_script
111
+ #
112
+ def execute_script(script)
113
+ @browser.wd.execute_script(script)
114
+ end
107
115
 
108
116
  #
109
117
  # platform method to handle attaching to a running window
@@ -256,8 +264,8 @@ module PageObject
256
264
  # See PageObject::Accessors#select_list
257
265
  #
258
266
  def select_list_value_for(identifier)
259
- process_watir_call("select_list(identifier).value", Elements::SelectList,
260
- identifier)
267
+ process_watir_call("select_list(identifier).options.each {|o| return o.text if o.selected?}",
268
+ Elements::SelectList, identifier)
261
269
  end
262
270
 
263
271
  #
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "0.6.2"
3
+ VERSION = "0.6.3"
4
4
  end
data/page-object.gemspec CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
 
22
22
  s.add_dependency 'watir-webdriver', '>= 0.5.3'
23
- s.add_dependency 'selenium-webdriver', '>= 2.19.0'
23
+ s.add_dependency 'selenium-webdriver', '>= 2.20.0'
24
24
 
25
25
  s.add_development_dependency 'rspec', '>= 2.6.0'
26
26
  s.add_development_dependency 'cucumber', '>= 1.1.0'
@@ -4,6 +4,8 @@ class AccessorsTestPageObject
4
4
  include PageObject
5
5
 
6
6
  page_url "http://apple.com"
7
+ expected_title "Expected Title"
8
+ expected_element :google_search
7
9
  link(:google_search, :link => 'Google Search')
8
10
  text_field(:first_name, :id => 'first_name')
9
11
  hidden_field(:social_security_number, :id => 'ssn')
@@ -142,6 +144,34 @@ describe PageObject::Accessors do
142
144
  end
143
145
  end
144
146
 
147
+ describe "validating the page title" do
148
+ it "should validate the title" do
149
+ watir_browser.should_receive(:title).and_return("Expected Title")
150
+ watir_page_object.should have_expected_title
151
+ end
152
+
153
+ it "should raise error when it does not have expected title" do
154
+ watir_browser.should_receive(:title).twice.and_return("Not Expected")
155
+ expect { watir_page_object.has_expected_title? }.to raise_error
156
+ end
157
+ end
158
+
159
+ describe "validating the existence of an element" do
160
+ it "should validate an element exists" do
161
+ watir_page_object.should_receive(:google_search_element).and_return(watir_browser)
162
+ watir_browser.should_receive(:when_present).and_return(true)
163
+ watir_page_object.has_expected_element?
164
+ end
165
+
166
+ it "should handle non-existent elements gracefully" do
167
+ class FakePage
168
+ include PageObject
169
+ expected_element :foo
170
+ end
171
+ FakePage.new(watir_browser).should_not have_expected_element
172
+ end
173
+ end
174
+
145
175
  describe "link accessors" do
146
176
  context "when called on a page object" do
147
177
  it "should generate accessor methods" do
@@ -353,8 +383,11 @@ describe PageObject::Accessors do
353
383
 
354
384
  context "Watir implementation" do
355
385
  it "should get the current item from a select list" do
386
+ selected = "OH"
387
+ selected.should_receive(:selected?).and_return(selected)
388
+ selected.should_receive(:text).and_return("OH")
356
389
  watir_browser.should_receive(:select_list).and_return watir_browser
357
- watir_browser.should_receive(:value).and_return("OH")
390
+ watir_browser.should_receive(:options).and_return([selected])
358
391
  watir_page_object.state.should == "OH"
359
392
  end
360
393
 
@@ -373,8 +406,11 @@ describe PageObject::Accessors do
373
406
 
374
407
  context "Selenium implementation" do
375
408
  it "should should get the current item from a select list" do
409
+ selected = "OH"
410
+ selected.should_receive(:selected?).and_return(selected)
411
+ selected.should_receive(:text).and_return("OH")
376
412
  selenium_browser.should_receive(:find_element).and_return(selenium_browser)
377
- selenium_browser.should_receive(:attribute).and_return("OH")
413
+ selenium_browser.should_receive(:find_elements).and_return([selected])
378
414
  selenium_page_object.state.should == "OH"
379
415
  end
380
416
 
@@ -61,18 +61,18 @@ describe "Element" do
61
61
 
62
62
  it "should build xpath when locating basic elements by name and class" do
63
63
  all_basic_elements.each do |tag|
64
- identifier = {:tag_name => tag, :name => 'foo', :class => 'bar'}
64
+ identifier = {:tag_name => tag, :class => 'bar', :name => 'foo'}
65
65
  how, what = PageObject::Elements::Element.selenium_identifier_for identifier
66
66
  how.should == :xpath
67
- what.should == ".//#{tag}[@name='foo' and @class='bar']"
67
+ what.should == ".//#{tag}[@class='bar' and @name='foo']"
68
68
  end
69
69
  end
70
70
 
71
71
  it "should build xpath when locating input elements by name and class" do
72
72
  all_input_elements.each do |type|
73
- identifier = {:tag_name => 'input', :type => "#{type}", :name => 'foo', :class => 'bar'}
73
+ identifier = {:tag_name => 'input', :type => "#{type}", :class => 'bar', :name => 'foo'}
74
74
  how, what = PageObject::Elements::Element.selenium_identifier_for identifier
75
- what.should include ".//input[@type='#{type}' and @name='foo' and @class='bar']"
75
+ what.should include ".//input[@type='#{type}' and @class='bar' and @name='foo']"
76
76
  end
77
77
  end
78
78
  end
@@ -129,6 +129,12 @@ describe PageObject do
129
129
  watir_page_object.prompt("blah") do
130
130
  end
131
131
  end
132
+
133
+ it "should execute javascript on the browser" do
134
+ watir_browser.should_receive(:wd).and_return(watir_browser)
135
+ watir_browser.should_receive(:execute_script).and_return("abc")
136
+ watir_page_object.execute_script("333").should == "abc"
137
+ end
132
138
 
133
139
  it "should convert a modal popup to a window" do
134
140
  watir_browser.should_receive(:execute_script)
@@ -236,6 +242,11 @@ describe PageObject do
236
242
  selenium_page_object.modal_dialog {}
237
243
  end
238
244
 
245
+ it "should execute javascript on the browser" do
246
+ selenium_browser.should_receive(:execute_script).and_return("abc")
247
+ selenium_page_object.execute_script("333").should == "abc"
248
+ end
249
+
239
250
  it "should switch to a new window with a given title" do
240
251
  selenium_browser.should_receive(:window_handles).and_return(["win1"])
241
252
  selenium_browser.should_receive(:switch_to).twice.and_return(selenium_browser)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: page-object
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-12 00:00:00.000000000 Z
12
+ date: 2012-03-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: watir-webdriver
16
- requirement: &70155418362080 !ruby/object:Gem::Requirement
16
+ requirement: &70256300665480 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,21 +21,21 @@ dependencies:
21
21
  version: 0.5.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70155418362080
24
+ version_requirements: *70256300665480
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: selenium-webdriver
27
- requirement: &70155418361240 !ruby/object:Gem::Requirement
27
+ requirement: &70256300664920 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
31
31
  - !ruby/object:Gem::Version
32
- version: 2.19.0
32
+ version: 2.20.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70155418361240
35
+ version_requirements: *70256300664920
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70155418375380 !ruby/object:Gem::Requirement
38
+ requirement: &70256300664440 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.6.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70155418375380
46
+ version_requirements: *70256300664440
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: cucumber
49
- requirement: &70155418374700 !ruby/object:Gem::Requirement
49
+ requirement: &70256300663980 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.1.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70155418374700
57
+ version_requirements: *70256300663980
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: yard
60
- requirement: &70155418374020 !ruby/object:Gem::Requirement
60
+ requirement: &70256300663520 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.7.2
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70155418374020
68
+ version_requirements: *70256300663520
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rack
71
- requirement: &70155418373300 !ruby/object:Gem::Requirement
71
+ requirement: &70256300696740 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '1.0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70155418373300
79
+ version_requirements: *70256300696740
80
80
  description: Page Object DSL that works with both Watir and Selenium
81
81
  email:
82
82
  - jeff.morgan@leandog.com