page-object 0.6.5 → 0.6.6

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,3 +1,12 @@
1
+ === Version 0.6.6 / 2012-4-26
2
+ * Enhancements
3
+ * Added ability to find span's by title
4
+ * Changed order of initialization so initialize_page is called after goto
5
+ * Updated to use watir-webdriver 0.5.5
6
+ * Updated to use selenium-webdriver 2.21.2
7
+ * Fixes
8
+ * Fixed the problem with determining the existance of an Selenium element
9
+
1
10
  === Version 0.6.5 / 2012-4-12
2
11
  * Enhancements
3
12
  * Added a page level element method to return a generic Element object
@@ -16,3 +16,8 @@ Feature: Handling Asynch calls
16
16
  Scenario: Wait until something is not visible
17
17
  Given I am on the async elements page
18
18
  Then I should be able to wait until the button becomes invisible
19
+
20
+ Scenario: Wait for an element to appear on the page
21
+ Given I am on the async elements page
22
+ When I add a button a few seconds from now
23
+ Then I should be able to click it when it gets added
@@ -9,12 +9,20 @@
9
9
  function hide() {
10
10
  document.getElementById("target").style.display="none";
11
11
  }
12
- </script>
12
+
13
+ function addDiv() {
14
+ var button = document.createElement("input");
15
+ button.setAttribute("type", "button");
16
+ button.setAttribute("value", "New Button")
17
+ document.body.appendChild(button);
18
+ }
19
+ </script>
13
20
  </head>
14
21
  <body>
15
22
  <input type="button" id="target" value="Target"/>
16
23
  <input type="button" onclick="setTimeout(function() {hide();}, 2000);" value="Hide Button"/>
17
24
  <input type="button" onclick="setTimeout(function() {unhide();}, 2000);" value="Unhide Button"/>
25
+ <input type="button" onclick="setTimeout(function() {addDiv();}, 2000);" value="Create Button"/>
18
26
  </body>
19
27
  </html>
20
28
 
@@ -30,7 +30,7 @@
30
30
  page-object rocks!
31
31
  </div>
32
32
 
33
- <span id="span_id" name="span_name" class="span_class">
33
+ <span id="span_id" name="span_name" class="span_class" title="span_title">
34
34
  My alert
35
35
  </span>
36
36
 
@@ -19,6 +19,7 @@ Feature: Span
19
19
  | index |
20
20
  | name |
21
21
  | text |
22
+ | title |
22
23
 
23
24
  Scenario Outline: Locating span using multiple parameters
24
25
  When I search for the span by "<param1>" and "<param2>"
@@ -35,6 +35,8 @@ class AsyncPage
35
35
  button(:target, :value => 'Target')
36
36
  button(:hide, :value => 'Hide Button')
37
37
  button(:unhide, :value => 'Unhide Button')
38
+ button(:create_button, :value => 'Create Button')
39
+ button(:created_button, :value => 'New Button')
38
40
  end
39
41
 
40
42
  Given /^I am on the async elements page$/ do
@@ -60,3 +62,11 @@ Then /^I should be able to wait until the button becomes invisible$/ do
60
62
  @page.target_element.attribute("block").should == "none"
61
63
  end
62
64
  end
65
+
66
+ When /^I add a button a few seconds from now$/ do
67
+ @page.create_button
68
+ end
69
+
70
+ Then /^I should be able to click it when it gets added$/ do
71
+ @page.created_button_element.when_present.click
72
+ end
@@ -100,6 +100,7 @@ class Page
100
100
  span(:span_class, :class => 'span_class')
101
101
  span(:span_index, :index => 0)
102
102
  span(:span_text, :text => 'My alert')
103
+ span(:span_title, :title => 'span_title')
103
104
  span(:span_xpath, :xpath => '//span')
104
105
  span(:span_class_index, :class => "span_class", :index => 0)
105
106
  span(:span_name_index, :name => "span_name", :index => 0)
@@ -5,11 +5,11 @@ module PageObject
5
5
  protected
6
6
 
7
7
  def self.watir_finders
8
- [:class, :id, :index, :text, :xpath]
8
+ [:class, :id, :index, :text, :title, :xpath]
9
9
  end
10
10
 
11
11
  def self.selenium_finders
12
- [:class, :id, :name, :text, :xpath, :index]
12
+ [:class, :id, :name, :text, :title, :xpath, :index]
13
13
  end
14
14
  end
15
15
 
@@ -1,5 +1,6 @@
1
1
  require 'page-object/elements'
2
2
  require 'page-object/core_ext/string'
3
+ require 'page-object/platforms/selenium_webdriver/surrogate_selenium_element'
3
4
 
4
5
  module PageObject
5
6
  module Platforms
@@ -886,7 +887,12 @@ module PageObject
886
887
  def find_selenium_element(identifier, type, tag, other=nil)
887
888
  how, what, frame_identifiers = parse_identifiers(identifier, type, tag, other)
888
889
  switch_to_frame(frame_identifiers)
889
- element = @browser.find_element(how, what)
890
+ begin
891
+ element = @browser.find_element(how, what)
892
+ rescue Selenium::WebDriver::Error::NoSuchElementError
893
+ @browser.switch_to.default_content unless frame_identifiers.nil?
894
+ return build_null_object(identifier, type, tag, other)
895
+ end
890
896
  @browser.switch_to.default_content unless frame_identifiers.nil?
891
897
  type.new(element, :platform => :selenium_webdriver)
892
898
  end
@@ -899,6 +905,16 @@ module PageObject
899
905
  elements.map { |element| type.new(element, :platform => :selenium_webdriver) }
900
906
  end
901
907
 
908
+ def build_null_object(identifier, type, tag, other)
909
+ null_element = SurrogateSeleniumElement.new
910
+ null_element.identifier = identifier
911
+ null_element.type = type
912
+ null_element.tag = tag
913
+ null_element.other = other
914
+ null_element.platform = self
915
+ Elements::Element.new(null_element, :platform => :selenium_webdriver)
916
+ end
917
+
902
918
  def parse_identifiers(identifier, element, tag_name=nil, additional=nil)
903
919
  frame_identifiers = identifier.delete(:frame)
904
920
  identifier = add_tagname_if_needed identifier, tag_name, additional if tag_name
@@ -932,6 +948,7 @@ module PageObject
932
948
  return false if identifier[:text] and ['div', 'span', 'td', 'label'].include? tag
933
949
  return false if identifier[:title] and tag == 'input' and additional[:type] == 'text'
934
950
  return false if identifier[:title] and tag == 'input' and additional[:type] == 'file'
951
+ return false if identifier[:title] and tag == 'span'
935
952
  return false if identifier[:value] and tag == 'input' and
936
953
  ['radio', 'submit', 'image', 'button', 'reset', 'checkbox', 'hidden'].include? additional[:type]
937
954
  true
@@ -0,0 +1,42 @@
1
+ module PageObject
2
+ module Platforms
3
+ module SeleniumWebDriver
4
+ class SurrogateSeleniumElement
5
+ attr_accessor :identifier, :type, :tag, :other, :platform
6
+
7
+ def exists?
8
+ attempt_to_find_element unless @element
9
+ @element ? (not @element.element.nil?) : false
10
+ end
11
+
12
+ def visible?
13
+ attempt_to_find_element unless @element
14
+ @element ? @element.element.displayed? : false
15
+ end
16
+
17
+ def nil?
18
+ attempt_to_find_element unless @element
19
+ @element ? @element.element.nil? : true
20
+ end
21
+
22
+ def displayed?
23
+ attempt_to_find_element unless @element
24
+ @element ? @element.element.displayed? : false
25
+ end
26
+
27
+ def method_missing(meth, *args)
28
+ return @element.send(meth, *args) if @element
29
+ $stderr.puts "You are calling #{meth} on an element that does not yet exist."
30
+ raise Selenium::WebDriver::Error::NoSuchElementError
31
+ end
32
+
33
+ private
34
+
35
+ def attempt_to_find_element
36
+ @element = platform.send(:find_selenium_element, identifier, type, tag, other) unless @element
37
+ @element = nil if @element.element.instance_of?(::PageObject::Platforms::SeleniumWebDriver::SurrogateSeleniumElement)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,4 +1,4 @@
1
1
  module PageObject
2
2
  # @private
3
- VERSION = "0.6.5"
3
+ VERSION = "0.6.6"
4
4
  end
data/lib/page-object.rb CHANGED
@@ -55,8 +55,8 @@ module PageObject
55
55
  def initialize(browser, visit=false)
56
56
  @browser = browser
57
57
  include_platform_driver(browser)
58
- initialize_page if respond_to?(:initialize_page)
59
58
  goto if visit && respond_to?(:goto)
59
+ initialize_page if respond_to?(:initialize_page)
60
60
  end
61
61
 
62
62
  # @private
data/page-object.gemspec CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency 'watir-webdriver', '>= 0.5.4'
23
- s.add_dependency 'selenium-webdriver', '>= 2.21.0'
22
+ s.add_dependency 'watir-webdriver', '>= 0.5.5'
23
+ s.add_dependency 'selenium-webdriver', '>= 2.21.2'
24
24
 
25
25
  s.add_development_dependency 'rspec', '>= 2.6.0'
26
26
  s.add_development_dependency 'cucumber', '>= 1.1.0'
@@ -6,14 +6,14 @@ describe PageObject::Elements::Span do
6
6
 
7
7
  describe "when mapping how to find an element" do
8
8
  it "should map watir types to same" do
9
- [:class, :id, :index, :text, :xpath].each do |t|
9
+ [:class, :id, :index, :text, :title, :xpath].each do |t|
10
10
  identifier = span.watir_identifier_for t => 'value'
11
11
  identifier.keys.first.should == t
12
12
  end
13
13
  end
14
14
 
15
15
  it "should map selenium types to same" do
16
- [:class, :id, :index, :name, :text, :xpath].each do |t|
16
+ [:class, :id, :index, :name, :text, :title, :xpath].each do |t|
17
17
  key, value = span.selenium_identifier_for t => 'value'
18
18
  key.should == t
19
19
  end
@@ -21,11 +21,18 @@ describe PageObject::PagePopulator do
21
21
  page_object.populate_page_with('tf' => 'value')
22
22
  end
23
23
 
24
- it "should not set a value if it is not found on the page" do
24
+ it "should not set a value in a text field if it is not found on the page" do
25
25
  browser.should_not_receive(:text_field)
26
26
  page_object.populate_page_with('coffee' => 'value')
27
27
  end
28
28
 
29
+ it "should not populate a text field when it is disabled" do
30
+ page_object.should_not_receive(:tf=)
31
+ page_object.should_receive(:tf_element).and_return(browser)
32
+ browser.should_receive(:enabled?).and_return(false)
33
+ page_object.populate_page_with('tf' => true)
34
+ end
35
+
29
36
  it "should set a value in a text area" do
30
37
  page_object.should_receive(:ta=).with('value')
31
38
  page_object.stub(:is_enabled?).and_return(true)
@@ -82,10 +89,4 @@ describe PageObject::PagePopulator do
82
89
  page_object.populate_page_with('rb' => true)
83
90
  end
84
91
 
85
- it "should not populate a text field when it is disabled" do
86
- page_object.should_not_receive(:tf=)
87
- page_object.should_receive(:tf_element).and_return(browser)
88
- browser.should_receive(:enabled?).and_return(false)
89
- page_object.populate_page_with('tf' => true)
90
- end
91
92
  end
@@ -37,4 +37,32 @@ describe PageObject::Platforms::SeleniumWebDriver::PageObject do
37
37
  selenium_page_object.platform.div_for(:text => 'foo')
38
38
  end
39
39
  end
40
- end
40
+
41
+ context "when trying to find an element that does not exist" do
42
+ it "should return a surogate selenium object" do
43
+ selenium_browser.should_receive(:find_element).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
44
+ page = SeleniumTestPageObject.new(selenium_browser)
45
+ element = page.link_element(:text => 'blah')
46
+ element.element.should be_instance_of PageObject::Platforms::SeleniumWebDriver::SurrogateSeleniumElement
47
+ end
48
+
49
+ it "should know it is not exist" do
50
+ selenium_browser.should_receive(:find_element).twice.and_raise(Selenium::WebDriver::Error::NoSuchElementError)
51
+ page = SeleniumTestPageObject.new(selenium_browser)
52
+ page.link_element(:text => 'blah').element.exists?.should be_false
53
+ end
54
+
55
+ it "should know it is not visible" do
56
+ selenium_browser.should_receive(:find_element).twice.and_raise(Selenium::WebDriver::Error::NoSuchElementError)
57
+ page = SeleniumTestPageObject.new(selenium_browser)
58
+ page.link_element(:text => 'blah').element.should_not be_visible
59
+ end
60
+
61
+ it "should raise an error when actions are requested" do
62
+ selenium_browser.should_receive(:find_element).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
63
+ page = SeleniumTestPageObject.new(selenium_browser)
64
+ element = page.link_element(:text => 'blah')
65
+ expect { element.text }.to raise_error
66
+ end
67
+ end
68
+ end
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.5
4
+ version: 0.6.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,33 +9,33 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-12 00:00:00.000000000 Z
12
+ date: 2012-04-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: watir-webdriver
16
- requirement: &70361806936260 !ruby/object:Gem::Requirement
16
+ requirement: &70181129846920 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.5.4
21
+ version: 0.5.5
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70361806936260
24
+ version_requirements: *70181129846920
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: selenium-webdriver
27
- requirement: &70361806931840 !ruby/object:Gem::Requirement
27
+ requirement: &70181129845600 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
31
31
  - !ruby/object:Gem::Version
32
- version: 2.21.0
32
+ version: 2.21.2
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70361806931840
35
+ version_requirements: *70181129845600
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70361806930760 !ruby/object:Gem::Requirement
38
+ requirement: &70181129844800 !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: *70361806930760
46
+ version_requirements: *70181129844800
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: cucumber
49
- requirement: &70361806907900 !ruby/object:Gem::Requirement
49
+ requirement: &70181129844060 !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: *70361806907900
57
+ version_requirements: *70181129844060
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: yard
60
- requirement: &70361798515720 !ruby/object:Gem::Requirement
60
+ requirement: &70181129843560 !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: *70361798515720
68
+ version_requirements: *70181129843560
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rack
71
- requirement: &70361798513340 !ruby/object:Gem::Requirement
71
+ requirement: &70181129843100 !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: *70361798513340
79
+ version_requirements: *70181129843100
80
80
  description: Page Object DSL that works with both Watir and Selenium
81
81
  email:
82
82
  - jeff.morgan@leandog.com
@@ -232,11 +232,11 @@ files:
232
232
  - lib/page-object/platforms/selenium_webdriver/form.rb
233
233
  - lib/page-object/platforms/selenium_webdriver/image.rb
234
234
  - lib/page-object/platforms/selenium_webdriver/link.rb
235
- - lib/page-object/platforms/selenium_webdriver/null_selenium_element.rb
236
235
  - lib/page-object/platforms/selenium_webdriver/ordered_list.rb
237
236
  - lib/page-object/platforms/selenium_webdriver/page_object.rb
238
237
  - lib/page-object/platforms/selenium_webdriver/radio_button.rb
239
238
  - lib/page-object/platforms/selenium_webdriver/select_list.rb
239
+ - lib/page-object/platforms/selenium_webdriver/surrogate_selenium_element.rb
240
240
  - lib/page-object/platforms/selenium_webdriver/table.rb
241
241
  - lib/page-object/platforms/selenium_webdriver/table_row.rb
242
242
  - lib/page-object/platforms/selenium_webdriver/text_area.rb
@@ -1,28 +0,0 @@
1
- module PageObject
2
- module Platforms
3
- module SeleniumWebDriver
4
- class NullSeleniumElement
5
- def exists?
6
- false
7
- end
8
-
9
- def visible?
10
- false
11
- end
12
-
13
- def nil?
14
- true
15
- end
16
-
17
- def displayed?
18
- false
19
- end
20
-
21
- def method_missing(meth, *args)
22
- $stderr.puts "You are calling #{meth} on an element that does not yet exist."
23
- raise Selenium::WebDriver::Error::NoSuchElementError
24
- end
25
- end
26
- end
27
- end
28
- end