watir-webdriver 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ gem "simplecov", ">= 0.3.5", :platform => :ruby_19
4
+
3
5
  # Specify your gem's dependencies in watir-webdriver.gemspec
4
6
  gemspec
data/Rakefile CHANGED
@@ -8,13 +8,6 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
8
8
  end
9
9
 
10
10
  namespace :spec do
11
- RSpec::Core::RakeTask.new(:rcov) do |spec|
12
- spec.ruby_opts = "-I lib:spec"
13
- spec.pattern = 'spec/**/*_spec.rb'
14
- spec.rcov = true
15
- spec.rcov_opts = %w[--exclude spec,ruby-debug,/Library/Ruby,.gem --include lib/watir-webdriver]
16
- end
17
-
18
11
  RSpec::Core::RakeTask.new(:html) do |spec|
19
12
  spec.ruby_opts = "-I lib:spec"
20
13
  spec.pattern = 'spec/**/*_spec.rb'
@@ -3,7 +3,6 @@ require "selenium-webdriver"
3
3
  require "json"
4
4
 
5
5
  require "watir-webdriver/version"
6
- require "watir-webdriver/core_ext/string"
7
6
  require "watir-webdriver/exception"
8
7
  require "watir-webdriver/xpath_support"
9
8
  require "watir-webdriver/window_switching"
@@ -112,11 +112,7 @@ module Watir
112
112
  args.map! { |e| e.kind_of?(Watir::Element) ? e.element : e }
113
113
  returned = @driver.execute_script(script, *args)
114
114
 
115
- if returned.kind_of? WebDriver::Element
116
- Watir.element_class_for(returned.tag_name).new(self, :element => returned)
117
- else
118
- returned
119
- end
115
+ wrap_elements_in(returned)
120
116
  end
121
117
 
122
118
  def add_checker(checker = nil, &block)
@@ -160,5 +156,26 @@ module Watir
160
156
  self
161
157
  end
162
158
 
159
+ private
160
+
161
+ def wrap_elements_in(obj)
162
+ case obj
163
+ when WebDriver::Element
164
+ wrap_element(obj)
165
+ when Array
166
+ obj.map { |e| wrap_elements_in(e) }
167
+ when Hash
168
+ obj.each { |k,v| obj[k] = wrap_elements_in(v) }
169
+
170
+ obj
171
+ else
172
+ obj
173
+ end
174
+ end
175
+
176
+ def wrap_element(element)
177
+ Watir.element_class_for(element.tag_name).new(self, :element => element)
178
+ end
179
+
163
180
  end # Browser
164
181
  end # Watir
@@ -14,15 +14,6 @@ module Watir
14
14
 
15
15
  VALID_TYPES = %w[button reset submit image]
16
16
 
17
- def self.from(parent, element)
18
- if element.tag_name == "button" ||
19
- element.tag_name == "input" && VALID_TYPES.include?(element.attribute(:type))
20
- Button.new(parent, :element => element)
21
- else
22
- raise TypeError, "expected button or input[@type=#{VALID_TYPES.join("|")}] for #{element.inspect}"
23
- end
24
- end
25
-
26
17
  #
27
18
  # Returns the text of the button.
28
19
  #
@@ -3,14 +3,6 @@
3
3
  module Watir
4
4
  class CheckBox < Input
5
5
 
6
- def self.from(parent, element)
7
- if element.attribute(:type) != "checkbox"
8
- raise TypeError, "expected type=checkbox for #{element.inspect}"
9
- end
10
-
11
- super
12
- end
13
-
14
6
  #
15
7
  # Set this checkbox to the given value
16
8
  #
@@ -1,14 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Watir
3
3
  class FileField < Input
4
- def self.from(parent, element)
5
- if element.attribute(:type) != "file"
6
- raise TypeError, "expected type=file for #{element.inspect}"
7
- end
8
-
9
- super
10
- end
11
-
12
4
  #
13
5
  # Set the file field to the given path
14
6
  #
@@ -2,30 +2,24 @@
2
2
  module Watir
3
3
  class Frame < HTMLElement
4
4
 
5
- VALID_LOCATORS = [:id, :name, :index]
6
-
7
- def initialize(*args)
8
- super
9
- @frame_id = nil
10
- end
11
-
12
5
  def locate
13
6
  @parent.assert_exists
14
7
 
15
- if @iframe
16
- switch_to_iframe(@iframe)
17
- driver
18
- elsif @frame_id.nil?
19
- locate_iframe || locate_frame
20
- else
21
- switch!
22
- driver
23
- end
8
+ element = locate_iframe || locate_frame
9
+ element or raise UnknownFrameException, "unable to locate frame/iframe using #{selector_string}"
10
+
11
+ FramedDriver.new(element, driver)
24
12
  end
25
13
 
26
14
  def assert_exists
27
- # we always run locate(), to make sure the frame is switched
28
- @element = locate
15
+ if element = @selector[:element]
16
+ @parent.assert_exists
17
+ @element = FramedDriver.new(element, driver)
18
+ else
19
+ @element = nil
20
+ end
21
+
22
+ super
29
23
  end
30
24
 
31
25
  def execute_script(*args)
@@ -46,65 +40,63 @@ module Watir
46
40
 
47
41
  def locate_iframe
48
42
  # hack - frame doesn't have IFrame's attributes either
49
- @iframe = IFrame.new(@parent, @selector.merge(:tag_name => "iframe")).locate
50
-
51
- if @iframe
52
- switch_to_iframe @iframe
53
- driver
54
- end
43
+ IFrame.new(@parent, @selector.merge(:tag_name => "iframe")).locate
55
44
  end
56
45
 
57
46
  def locate_frame
58
- loc = VALID_LOCATORS.find { |loc| @selector.has_key? loc }
59
-
60
- unless loc
61
- raise MissingWayOfFindingObjectException, "can only locate frames by #{VALID_LOCATORS.inspect}"
62
- end
63
-
64
- @frame_id = @selector[loc]
65
-
66
- unless [String, Integer].any? { |e| @frame_id.kind_of?(e) }
67
- raise TypeError, "can't locate frame using #{@frame_id.inspect}:#{@frame_id.class}"
68
- end
69
-
70
- switch!
47
+ locator = locator_class.new(@parent.wd, @selector.merge(:tag_name => "frame"), self.class.attribute_list)
48
+ locator.locate
49
+ end
50
+ end # Frame
71
51
 
72
- driver
52
+ module Container
53
+ def frame(*args)
54
+ Frame.new(self, extract_selector(args))
73
55
  end
74
56
 
75
- def switch!
76
- driver.switch_to.frame @frame_id
77
- rescue Selenium::WebDriver::Error::NoSuchFrameError => e
78
- raise UnknownFrameException, e.message
57
+ def frames(*args)
58
+ FrameCollection.new(self, extract_selector(args).merge(:tag_name => /^(iframe|frame)$/)) # hack
79
59
  end
60
+ end
80
61
 
81
- def switch_to_iframe(element)
82
- loc = [:id, :name].find { |e| not [nil, ""].include?(element.attribute(e)) }
83
- if loc.nil?
84
- raise MissingWayOfFindingObjectException, "can't switch to frame without :id or :name"
85
- end
62
+ # @api private
63
+ #
64
+ # another hack..
65
+ #
86
66
 
87
- # TODO: get rid of this when we can switch to elements
88
- # http://groups.google.com/group/selenium-developers/browse_thread/thread/428bd68e9e8bfecd/19a02ecd20835249
67
+ class FramedDriver
68
+ def initialize(element, driver)
69
+ @element = element
70
+ @driver = driver
71
+ end
72
+
73
+ def ==(other)
74
+ @element == other.element
75
+ end
76
+ alias_method :eql?, :==
77
+
78
+ protected
79
+
80
+ def element
81
+ @element
82
+ end
83
+
84
+ private
89
85
 
90
- if @parent.kind_of? Frame
91
- parent_id = @parent.instance_variable_get("@frame_id")
92
- loc = [parent_id, element.attribute(loc)].join(".")
86
+ def method_missing(meth, *args, &blk)
87
+ if @driver.respond_to?(meth)
88
+ switch!
89
+ @driver.send(meth, *args, &blk)
93
90
  else
94
- loc = element.attribute(loc)
91
+ @element.send(meth, *args, &blk)
95
92
  end
96
-
97
- driver.switch_to.frame loc
98
93
  end
99
- end # Frame
100
94
 
101
- module Container
102
- def frame(*args)
103
- Frame.new(self, extract_selector(args))
95
+ def switch!
96
+ @driver.switch_to.frame @element
97
+ rescue Selenium::WebDriver::Error::NoSuchFrameError => e
98
+ raise UnknownFrameException, e.message
104
99
  end
105
100
 
106
- def frames(*args)
107
- FrameCollection.new(self, extract_selector(args))
108
- end
109
- end
101
+ end # FramedDriver
110
102
  end # Watir
@@ -412,7 +412,7 @@ module Watir
412
412
  end
413
413
  end
414
414
  class Track < HTMLElement
415
- attributes(:string => [:kind, :src, :charset, :srclang, :label, :track])
415
+ attributes(:string => [:kind, :src, :srclang, :label, :track], :bool => [:default])
416
416
  end
417
417
  class TrackCollection < ElementCollection
418
418
  def element_class
@@ -753,6 +753,7 @@ module Watir
753
753
 
754
754
 
755
755
 
756
+
756
757
  module Container
757
758
  #
758
759
  # @return [Anchor]
@@ -4,20 +4,6 @@ module Watir
4
4
 
5
5
  alias_method :readonly?, :read_only?
6
6
 
7
- #
8
- # @private
9
- #
10
- # subclasses can use this to validate the incoming element
11
- #
12
-
13
- def self.from(parent, element)
14
- unless element.tag_name == "input"
15
- raise TypeError, "can't create #{self} from #{element.inspect}"
16
- end
17
-
18
- new(parent, :element => element)
19
- end
20
-
21
7
  def enabled?
22
8
  !disabled?
23
9
  end
@@ -1,13 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Watir
3
3
  class Radio < Input
4
- def self.from(parent, element)
5
- if element.attribute(:type) != "radio"
6
- raise TypeError, "expected type=radio for #{element.inspect}"
7
- end
8
-
9
- super
10
- end
11
4
  #
12
5
  # Select this radio button.
13
6
  #
@@ -5,16 +5,6 @@ module Watir
5
5
  attributes Watir::TextArea.typed_attributes
6
6
  remove_method :type # we want Input#type here, which was overriden by TextArea's attributes
7
7
 
8
- def self.from(parent, element)
9
- type = element.attribute(:type)
10
-
11
- if TextFieldLocator::NON_TEXT_TYPES.include?(type)
12
- raise TypeError, "expected type != #{type} for #{element.inspect}"
13
- end
14
-
15
- super
16
- end
17
-
18
8
  #
19
9
  # Clear the element, the type in the given value.
20
10
  #
@@ -1,3 +1,3 @@
1
1
  module Watir
2
- VERSION = "0.1.7"
2
+ VERSION = "0.1.8"
3
3
  end
data/spec/browser_spec.rb CHANGED
@@ -21,10 +21,29 @@ describe Watir::Browser do
21
21
  end
22
22
 
23
23
  describe "#execute_script" do
24
- it "returns DOM elements as Watir objects" do
25
- browser.goto(WatirSpec.files + "/definition_lists.html")
26
- returned = browser.execute_script("return document.getElementById('experience-list')")
27
- returned.should be_kind_of(Watir::DList)
24
+ before { browser.goto(WatirSpec.files + "/definition_lists.html") }
25
+
26
+ it "wraps elements as Watir objects" do
27
+ returned = browser.execute_script("return document.body")
28
+ returned.should be_kind_of(Watir::Body)
29
+ end
30
+
31
+ it "wraps elements in an array" do
32
+ list = browser.execute_script("return [document.body];")
33
+ list.size.should == 1
34
+ list.first.should be_kind_of(Watir::Body)
35
+ end
36
+
37
+ it "wraps elements in a Hash" do
38
+ hash = browser.execute_script("return {element: document.body};")
39
+ hash['element'].should be_kind_of(Watir::Body)
40
+ end
41
+
42
+ it "wraps elements in a deep object" do
43
+ hash = browser.execute_script("return {elements: [document.body], body: {element: document.body }}")
44
+
45
+ hash['elements'].first.should be_kind_of(Watir::Body)
46
+ hash['body']['element'].should be_kind_of(Watir::Body)
28
47
  end
29
48
  end
30
49
 
data/spec/html/wait.html CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  <body>
22
22
  <div id="foo" style="display:block;">foo</div>
23
- <div id="bar" style="display:none;">bar</div>
23
+ <div id="bar" style="display:none;" onclick='this.innerHTML = "changed"'>bar</div>
24
24
  <a id="show_bar" href="#" onclick="setTimeoutDisplay('bar', 'block', 500);">show bar</a>
25
25
  <a id="hide_foo" href="#" onclick="setTimeoutDisplay('foo', 'none', 500);">hide foo</a>
26
26
  <a id="remove_foo" href="#" onclick="setTimeoutRemove('foo', 500);">remove foo</a>
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,13 @@
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
 
5
+ if ENV['coverage']
6
+ raise "simplecov only works on Ruby 1.9" unless RUBY_VERSION =~ /^1\.9/
7
+
8
+ require 'simplecov'
9
+ SimpleCov.start { add_filter "spec/" }
10
+ end
11
+
5
12
  require 'watir-webdriver'
6
13
  require 'locator_spec_helper'
7
14
  require 'rubygems'
data/spec/wait_spec.rb CHANGED
@@ -6,7 +6,7 @@ describe Watir::Wait do
6
6
  it "waits until the block returns true" do
7
7
  Wait::until(1) { true }.should be_true
8
8
  end
9
-
9
+
10
10
  it "times out" do
11
11
  lambda do
12
12
  Wait::until(1) { false }
@@ -18,7 +18,7 @@ describe Watir::Wait do
18
18
  it "waits while the block returns true" do
19
19
  Wait::while(1) { false }.should == nil
20
20
  end
21
-
21
+
22
22
  it "times out" do
23
23
  lambda do
24
24
  Wait::while(1) { true }
@@ -37,40 +37,54 @@ describe Watir::Element do
37
37
  it "returns true if the element exists and is visible" do
38
38
  browser.div(:id, 'foo').should be_present
39
39
  end
40
-
40
+
41
41
  it "returns false if the element exists but is not visible" do
42
42
  browser.div(:id, 'bar').should_not be_present
43
43
  end
44
-
44
+
45
45
  it "returns false if the element does not exist" do
46
46
  browser.div(:id, 'should-not-exist').should_not be_present
47
47
  end
48
48
  end
49
-
49
+
50
50
  describe "#when_present" do
51
- it "invokes subsequent methods after waiting for the element's presence" do
52
- browser.a(:id, 'show_bar').click
51
+ it "yields when the element becomes present" do
53
52
  called = false
54
- browser.div(:id, 'bar').when_present(1) do
55
- called = true
56
- end
57
- called.should == true
53
+
54
+ browser.a(:id, 'show_bar').click
55
+ browser.div(:id, 'bar').when_present(1) { called = true }
56
+
57
+ called.should be_true
58
58
  end
59
-
60
- it "times out" do
61
- lambda do
59
+
60
+ it "invokes subsequent method calls when the element becomes present" do
61
+ browser.a(:id, 'show_bar').click
62
+
63
+ bar = browser.div(:id, 'bar')
64
+ bar.when_present(1).click
65
+ bar.text.should == "changed"
66
+ end
67
+
68
+ it "times out when given a block" do
69
+ lambda {
62
70
  browser.div(:id, 'bar').when_present(1) {}
63
- end.should raise_error(Watir::Wait::TimeoutError)
71
+ }.should raise_error(Watir::Wait::TimeoutError)
72
+ end
73
+
74
+ it "times out when not given a block" do
75
+ lambda {
76
+ browser.div(:id, 'bar').when_present(1).click
77
+ }.should raise_error(Watir::Wait::TimeoutError)
64
78
  end
65
79
  end
66
80
 
67
81
  describe "#wait_until_present" do
68
- it "invokes subsequent methods after waiting until the element's appereance" do
82
+ it "it waits until the element appears" do
69
83
  browser.a(:id, 'show_bar').click
70
84
  browser.div(:id, 'bar').wait_until_present(1)
71
85
  end
72
-
73
- it "times out" do
86
+
87
+ it "times out if the element doesn't appear" do
74
88
  lambda do
75
89
  browser.div(:id, 'bar').wait_until_present(1)
76
90
  end.should raise_error(Watir::Wait::TimeoutError)
@@ -87,12 +101,12 @@ describe Watir::Element do
87
101
  browser.a(:id, 'remove_foo').click
88
102
  browser.div(:id, 'foo').wait_while_present(1)
89
103
  end
90
-
91
- it "times out" do
104
+
105
+ it "times out" do
92
106
  lambda do
93
107
  browser.div(:id, 'foo').wait_while_present(1)
94
108
  end.should raise_error(Watir::Wait::TimeoutError)
95
109
  end
96
110
  end
97
-
111
+
98
112
  end