selenium-webdriver-element-decorators 0.1.0 → 0.2.0

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.
@@ -2,5 +2,7 @@ require 'selenium/webdriver/elements/element'
2
2
  require 'selenium/webdriver/elements/browser'
3
3
  require 'selenium/webdriver/elements/form'
4
4
  require 'selenium/webdriver/elements/textbox'
5
+ require 'selenium/webdriver/elements/checkbox'
6
+ require 'selenium/webdriver/elements/button'
5
7
  require 'selenium/webdriver/elements/select'
6
8
  require 'selenium/webdriver/elements/file_chooser'
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/element'
2
+
3
+ module Selenium
4
+ module WebDriver
5
+ module Elements
6
+
7
+ class Button < Element
8
+
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+
15
+
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/element'
2
+
3
+ module Selenium
4
+ module WebDriver
5
+ module Elements
6
+
7
+ class Checkbox < Element
8
+
9
+ def check state = 'on'
10
+ if @element.selected? != state
11
+ @element.toggle
12
+ end
13
+ end
14
+
15
+ def uncheck
16
+ check 'off'
17
+ end
18
+
19
+ def populate data
20
+ if data != nil
21
+ check data
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+
31
+
@@ -23,9 +23,15 @@ module Selenium
23
23
  case element.tag_name
24
24
  when 'form' then Form.new element, browser
25
25
  when 'input' then
26
- case element.attribute('type')
26
+ type = element['type']
27
+ case element['type']
28
+ when 'text', 'password' then Textbox.new element, browser
29
+ when 'submit', 'reset', 'button', 'image' then Button.new element, browser
30
+ when 'checkbox' then Checkbox.new element, browser
27
31
  when 'file' then FileChooser.new element, browser
28
- else Textbox.new element, browser
32
+ # TODO: implement radio buttons
33
+ #when 'radio' then Element.new element, browser
34
+ else Element.new element, browser
29
35
  end
30
36
  when 'textarea' then Textbox.new element, browser
31
37
  when 'select' then Select.new element, browser
@@ -43,29 +49,13 @@ module Selenium
43
49
  end
44
50
 
45
51
  def find_elements *args
46
- @element.find_elements(*args).collect { |el| Element.new el, @browser }
52
+ @element.find_elements(*args).collect { |el| create_element el, @browser }
47
53
  end
48
54
 
49
55
  def element_present? *args
50
56
  find_element(*args) != nil
51
57
  end
52
58
 
53
- def find_select *args
54
- begin
55
- Select.new(@element.find_element *args)
56
- rescue Selenium::WebDriver::Error::NoSuchElementError
57
- nil
58
- end
59
- end
60
-
61
- def find_file_chooser *args
62
- begin
63
- FileChooser.new(@element.find_element *args)
64
- rescue Selenium::WebDriver::Error::NoSuchElementError
65
- nil
66
- end
67
- end
68
-
69
59
  end
70
60
 
71
61
  def send_keys *args
@@ -76,5 +66,6 @@ module Selenium
76
66
  end
77
67
 
78
68
  end
69
+
79
70
  end
80
71
  end
@@ -22,6 +22,12 @@ module Selenium
22
22
  end
23
23
  end
24
24
 
25
+ def populate data
26
+ if data != nil
27
+ choose_file data
28
+ end
29
+ end
30
+
25
31
  def autoit
26
32
  autoit = Thread.new do
27
33
  AutoItX3::Window.wait "Open"
@@ -13,8 +13,18 @@ module Selenium
13
13
  end
14
14
  end
15
15
 
16
- def populate
16
+ def populate data
17
+ inputs = []
18
+ find_elements(:tag_name => 'input').each do |input|
19
+ inputs << input if input.is_a? Textbox or input.is_a? Checkbox or input.is_a? FileChooser
20
+ end
21
+ inputs += find_elements :tag_name => 'textarea'
22
+ inputs += find_elements :tag_name => 'select'
17
23
 
24
+ inputs.each do |input|
25
+ input.populate data[input['name']]
26
+ end
27
+ self
18
28
  end
19
29
 
20
30
  end
@@ -13,28 +13,62 @@ module Selenium
13
13
  end
14
14
  end
15
15
 
16
- def select_by_value value
17
- options = @element.find_elements :tag_name => 'option'
18
- options.each { |opt|
19
- if (opt.value == value)
20
- opt.select()
21
- break
16
+ def select_by_value selection
17
+ if selection.is_a?(Array)
18
+ unless @element['multiple']
19
+ raise "Attempt to select multiple values in a listbox with single selection mode"
22
20
  end
23
- }
21
+ options = @element.find_elements :tag_name => 'option'
22
+ options.each do |opt|
23
+ if (selection.include? opt.value)
24
+ opt.select unless opt.selected?
25
+ else
26
+ opt.toggle if opt.selected?
27
+ end
28
+ end
29
+ else
30
+ options = @element.find_elements :tag_name => 'option'
31
+ options.each do |opt|
32
+ if (opt.value == selection)
33
+ opt.select
34
+ break
35
+ end
36
+ end
37
+ end
24
38
  end
25
39
 
26
- def select_by_text text
27
- options = @element.find_elements :tag_name => 'option'
28
- options.each { |opt|
29
- if (opt.text == text)
30
- opt.select()
31
- break
40
+ def select_by_text selection
41
+ if selection.is_a?(Array)
42
+ unless @element['multiple']
43
+ raise "Attempt to select multiple values in a listbox with single selection mode"
44
+ end
45
+ options = @element.find_elements :tag_name => 'option'
46
+ options.each do |opt|
47
+ if (selection.include? opt.text)
48
+ opt.select unless opt.selected?
49
+ else
50
+ opt.toggle if opt.selected?
51
+ end
52
+ end
53
+ else
54
+ options = @element.find_elements :tag_name => 'option'
55
+ options.each do |opt|
56
+ if (opt.text == selection)
57
+ opt.select
58
+ break
59
+ end
32
60
  end
33
- }
61
+ end
34
62
  end
35
63
 
36
64
  end
37
65
 
66
+ def populate data
67
+ if data != nil
68
+ select_by_value data
69
+ end
70
+ end
71
+
38
72
  end
39
73
  end
40
74
  end
@@ -28,6 +28,12 @@ module Selenium
28
28
  @element.send_keys *args
29
29
  end
30
30
 
31
+ def populate data
32
+ if data != nil
33
+ type data
34
+ end
35
+ end
36
+
31
37
  end
32
38
 
33
39
  end
data/spec/browser_spec.rb CHANGED
@@ -19,7 +19,7 @@ describe "Browser" do
19
19
 
20
20
  it "should find several elements" do
21
21
  links = @browser.find_elements :class => "gb1"
22
- links.length.should eq 7
22
+ links.length.should have_at_least(4).items
23
23
  end
24
24
 
25
25
  it "should type in textbox" do
@@ -0,0 +1,45 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper.rb')
2
+
3
+ include Selenium::WebDriver::Elements
4
+
5
+ describe "Form" do
6
+
7
+ include Aux
8
+
9
+ it "should populate textbox" do
10
+ populate_and_check 'http://www.htmlcodetutorial.com/forms/index_famsupp_1.html', 1, {'color' => 'red'}
11
+ end
12
+
13
+ it "should populate multiple textboxes" do
14
+ populate_and_check 'http://www.htmlcodetutorial.com/forms/_INPUT_TYPE_PASSWORD.html', 1, {'realname' => 'John Smith', 'mypassword' => 'qwerty'}
15
+ end
16
+
17
+ it "should populate checkboxes" do
18
+ populate_and_check 'http://www.htmlcodetutorial.com/forms/_INPUT_TYPE_CHECKBOX.html', 2, {'mushrooms' => true, 'greenpeppers' => false, 'olives' => true, 'onions' => false}
19
+ end
20
+
21
+ it "should populate textarea" do
22
+ populate_and_check 'http://www.htmlcodetutorial.com/forms/_TEXTAREA.html', 1, { 'comments' => 'bla bla bla'}
23
+ end
24
+
25
+ it "should populate select" do
26
+ populate_and_check 'http://www.htmlcodetutorial.com/forms/_SELECT_onFocus.html', 1, { 'size' => 'm', 'phone' => '+0 123 4567890' }
27
+ end
28
+
29
+ it "should populate multiple select" do
30
+ populate_and_check 'http://www.htmlcodetutorial.com/forms/_SELECT_MULTIPLE.html', 1, { 'toppings' => ['greenpeppers', 'tomatoes'] }
31
+ end
32
+
33
+ it "should populate mixed fields" do
34
+ populate_and_check 'http://www.htmlcodetutorial.com/forms/_SELECT_TABINDEX.html', 1, \
35
+ { 'realname' => 'John Smith', 'email' => 'smith@example.com', 'dep' => 'dev', }
36
+ end
37
+
38
+ def populate_and_check url, form_no, data
39
+ @browser.navigate.to url
40
+ form = @browser.find_elements(:tag_name => 'form')[form_no]
41
+ form.populate(data).submit
42
+ expect_result data
43
+ end
44
+
45
+ end
data/spec/form_spec.rb ADDED
@@ -0,0 +1,26 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper.rb')
2
+
3
+ include Selenium::WebDriver::Elements
4
+
5
+ describe "Form" do
6
+
7
+ include Aux
8
+
9
+ before(:each) do
10
+ @browser.navigate.to 'http://www.htmlcodetutorial.com/forms/index_famsupp_1.html'
11
+ end
12
+
13
+ def form
14
+ @browser.find_elements(:tag_name => 'form')[1]
15
+ end
16
+
17
+ it "should recognize forms" do
18
+ form.should be_kind_of Form
19
+ end
20
+
21
+ it "should submit form" do
22
+ form.submit
23
+ expect_result( {'color' => ''} )
24
+ end
25
+
26
+ end
data/spec/spec_helper.rb CHANGED
@@ -19,3 +19,35 @@ RSpec.configure do |c|
19
19
  end
20
20
 
21
21
  end
22
+
23
+ module Aux
24
+
25
+ def expect_result params
26
+ params.keys.each do |key|
27
+ params[key] = 'on' if params[key] == true
28
+ params.delete(key) if params[key] == false
29
+ end
30
+ params.should eq results
31
+ end
32
+
33
+ def results
34
+ res = {}
35
+ table = @browser.find_elements(:tag_name => 'table')[1]
36
+ rows = table.find_elements :tag_name => 'tr'
37
+ name = nil
38
+ rows.each do |r|
39
+ name_cell = r.find_element(:tag_name => 'th')
40
+ name = name_cell.text unless name_cell == nil
41
+ if res[name] == nil
42
+ res[name] = r.find_element(:tag_name => 'td').text
43
+ else
44
+ unless res[name].is_a? Array
45
+ res[name] = [ res[name] ]
46
+ end
47
+ res[name] << r.find_element(:tag_name => 'td').text
48
+ end
49
+ end
50
+ res
51
+ end
52
+
53
+ end
@@ -0,0 +1,50 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper.rb')
2
+
3
+ include Selenium::WebDriver::Elements
4
+
5
+ describe "Form" do
6
+
7
+ include Aux
8
+
9
+ before(:each) do
10
+ @browser.navigate.to 'http://www.htmlcodetutorial.com/forms/_INPUT_TYPE_TEXT.html'
11
+ end
12
+
13
+ def form
14
+ @browser.find_elements(:tag_name => 'form')[1]
15
+ end
16
+
17
+ def textbox
18
+ form.find_element(:name => 'realname')
19
+ end
20
+
21
+ it "should recognize textboxes" do
22
+ textbox.should be_kind_of Textbox
23
+ end
24
+
25
+ it "should type into textbox" do
26
+ textbox.type 'foo'
27
+ textbox.value.should eq 'foo'
28
+ end
29
+
30
+ it "should clear textbox when typing" do
31
+ textbox.type 'foo'
32
+ textbox.value.should eq 'foo'
33
+ textbox.type 'bar'
34
+ textbox.value.should eq 'bar'
35
+ end
36
+
37
+ it "should not clear textbox when appending" do
38
+ textbox.type 'foo'
39
+ textbox.value.should eq 'foo'
40
+ textbox.append 'bar'
41
+ textbox.value.should eq 'foobar'
42
+ end
43
+
44
+ it "should submit textbox value" do
45
+ textbox.type 'foo'
46
+ form.submit
47
+ expect_result( {'realname' => 'foo'} )
48
+ end
49
+
50
+ end
metadata CHANGED
@@ -1,135 +1,154 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: selenium-webdriver-element-decorators
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- segments:
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
6
  - 0
7
- - 1
7
+ - 2
8
8
  - 0
9
- prerelease: false
9
+ version: 0.2.0
10
10
  platform: ruby
11
- authors:
11
+ authors:
12
12
  - Alexei Barantsev
13
- autorequire: !!null
13
+ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2011-02-16 00:00:00.000000000 +03:00
17
- default_executable: !!null
18
- dependencies:
19
- - !ruby/object:Gem::Dependency
16
+
17
+ date: 2011-02-17 00:00:00 +03:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
20
21
  name: rspec
21
- requirement: &25498800 !ruby/object:Gem::Requirement
22
+ requirement: &id001 !ruby/object:Gem::Requirement
22
23
  none: false
23
- requirements:
24
+ requirements:
24
25
  - - ~>
25
- - !ruby/object:Gem::Version
26
- version: 2.5.0
27
- segments:
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
28
  - 2
29
29
  - 5
30
30
  - 0
31
+ version: 2.5.0
31
32
  type: :development
32
33
  prerelease: false
33
- version_requirements: *25498800
34
- - !ruby/object:Gem::Dependency
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
35
36
  name: bundler
36
- requirement: &25498068 !ruby/object:Gem::Requirement
37
+ requirement: &id002 !ruby/object:Gem::Requirement
37
38
  none: false
38
- requirements:
39
- - - ~>
40
- - !ruby/object:Gem::Version
41
- version: 1.0.0
42
- segments:
39
+ requirements:
40
+ - - "="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
43
  - 1
44
44
  - 0
45
- - 0
45
+ - 9
46
+ version: 1.0.9
46
47
  type: :development
47
48
  prerelease: false
48
- version_requirements: *25498068
49
- - !ruby/object:Gem::Dependency
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
50
51
  name: jeweler
51
- requirement: &25497192 !ruby/object:Gem::Requirement
52
+ requirement: &id003 !ruby/object:Gem::Requirement
52
53
  none: false
53
- requirements:
54
+ requirements:
54
55
  - - ~>
55
- - !ruby/object:Gem::Version
56
- version: 1.5.2
57
- segments:
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
58
  - 1
59
59
  - 5
60
60
  - 2
61
+ version: 1.5.2
61
62
  type: :development
62
63
  prerelease: false
63
- version_requirements: *25497192
64
- - !ruby/object:Gem::Dependency
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
65
66
  name: rcov
66
- requirement: &25496436 !ruby/object:Gem::Requirement
67
+ requirement: &id004 !ruby/object:Gem::Requirement
67
68
  none: false
68
- requirements:
69
- - - ! '>='
70
- - !ruby/object:Gem::Version
71
- version: '0'
72
- segments:
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ segments:
73
73
  - 0
74
+ version: "0"
74
75
  type: :development
75
76
  prerelease: false
76
- version_requirements: *25496436
77
- - !ruby/object:Gem::Dependency
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
78
79
  name: selenium-webdriver
79
- requirement: &25495620 !ruby/object:Gem::Requirement
80
+ requirement: &id005 !ruby/object:Gem::Requirement
80
81
  none: false
81
- requirements:
82
+ requirements:
82
83
  - - ~>
83
- - !ruby/object:Gem::Version
84
- version: 0.1.3
85
- segments:
84
+ - !ruby/object:Gem::Version
85
+ segments:
86
86
  - 0
87
87
  - 1
88
88
  - 3
89
+ version: 0.1.3
89
90
  type: :development
90
91
  prerelease: false
91
- version_requirements: *25495620
92
- - !ruby/object:Gem::Dependency
92
+ version_requirements: *id005
93
+ - !ruby/object:Gem::Dependency
93
94
  name: au3
94
- requirement: &25463436 !ruby/object:Gem::Requirement
95
+ requirement: &id006 !ruby/object:Gem::Requirement
95
96
  none: false
96
- requirements:
97
+ requirements:
97
98
  - - ~>
98
- - !ruby/object:Gem::Version
99
- version: 0.1.2
100
- segments:
99
+ - !ruby/object:Gem::Version
100
+ segments:
101
101
  - 0
102
102
  - 1
103
103
  - 2
104
+ version: 0.1.2
104
105
  type: :development
105
106
  prerelease: false
106
- version_requirements: *25463436
107
- - !ruby/object:Gem::Dependency
107
+ version_requirements: *id006
108
+ - !ruby/object:Gem::Dependency
109
+ name: selenium-webdriver
110
+ requirement: &id007 !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ~>
114
+ - !ruby/object:Gem::Version
115
+ segments:
116
+ - 0
117
+ - 1
118
+ - 3
119
+ version: 0.1.3
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: *id007
123
+ - !ruby/object:Gem::Dependency
108
124
  name: au3
109
- requirement: &25462548 !ruby/object:Gem::Requirement
125
+ requirement: &id008 !ruby/object:Gem::Requirement
110
126
  none: false
111
- requirements:
127
+ requirements:
112
128
  - - ~>
113
- - !ruby/object:Gem::Version
114
- version: 0.1.2
115
- segments:
129
+ - !ruby/object:Gem::Version
130
+ segments:
116
131
  - 0
117
132
  - 1
118
133
  - 2
134
+ version: 0.1.2
119
135
  type: :runtime
120
136
  prerelease: false
121
- version_requirements: *25462548
122
- description: Selenium 2.0 (WebDriver) decorators for web-elements that provide specific
123
- methods fot each web-element
137
+ version_requirements: *id008
138
+ description: Selenium 2.0 (WebDriver) decorators for web-elements that provide specific methods fot each web-element
124
139
  email: barancev@gmail.com
125
140
  executables: []
141
+
126
142
  extensions: []
127
- extra_rdoc_files:
143
+
144
+ extra_rdoc_files:
128
145
  - LICENSE.txt
129
146
  - README.rdoc
130
- files:
147
+ files:
131
148
  - lib/selenium/webdriver/elements.rb
132
149
  - lib/selenium/webdriver/elements/browser.rb
150
+ - lib/selenium/webdriver/elements/button.rb
151
+ - lib/selenium/webdriver/elements/checkbox.rb
133
152
  - lib/selenium/webdriver/elements/element.rb
134
153
  - lib/selenium/webdriver/elements/file_chooser.rb
135
154
  - lib/selenium/webdriver/elements/form.rb
@@ -138,38 +157,46 @@ files:
138
157
  - LICENSE.txt
139
158
  - README.rdoc
140
159
  - spec/browser_spec.rb
160
+ - spec/form_populate_spec.rb
161
+ - spec/form_spec.rb
141
162
  - spec/spec_helper.rb
163
+ - spec/textbox_spec.rb
142
164
  has_rdoc: true
143
165
  homepage: http://github.com/barancev/selenium-webdriver-element-decorators
144
- licenses:
166
+ licenses:
145
167
  - MIT
146
- post_install_message: !!null
168
+ post_install_message:
147
169
  rdoc_options: []
148
- require_paths:
170
+
171
+ require_paths:
149
172
  - lib
150
- required_ruby_version: !ruby/object:Gem::Requirement
173
+ required_ruby_version: !ruby/object:Gem::Requirement
151
174
  none: false
152
- requirements:
153
- - - ! '>='
154
- - !ruby/object:Gem::Version
155
- version: '0'
156
- segments:
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ hash: 910147891
179
+ segments:
157
180
  - 0
158
- hash: 1058641185
159
- required_rubygems_version: !ruby/object:Gem::Requirement
181
+ version: "0"
182
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
183
  none: false
161
- requirements:
162
- - - ! '>='
163
- - !ruby/object:Gem::Version
164
- version: '0'
165
- segments:
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ segments:
166
188
  - 0
189
+ version: "0"
167
190
  requirements: []
168
- rubyforge_project: !!null
191
+
192
+ rubyforge_project:
169
193
  rubygems_version: 1.3.7
170
- signing_key: !!null
194
+ signing_key:
171
195
  specification_version: 3
172
196
  summary: Selenium 2.0 (WebDriver) decorators for web-elements
173
- test_files:
197
+ test_files:
174
198
  - spec/browser_spec.rb
199
+ - spec/form_populate_spec.rb
200
+ - spec/form_spec.rb
175
201
  - spec/spec_helper.rb
202
+ - spec/textbox_spec.rb