selenium_dsl 1.0.0 → 1.1.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.
- data/.idea/.rakeTasks +1 -1
- data/.idea/selenium_dsl.iml +8 -1
- data/.idea/vcs.xml +1 -0
- data/.idea/workspace.xml +997 -0
- data/CHANGES +4 -0
- data/Gemfile +15 -1
- data/Gemfile.lock +21 -2
- data/lib/selenium_dsl.rb +5 -4
- data/lib/selenium_dsl/capybara/dsl.rb +68 -0
- data/lib/selenium_dsl/capybara/script.rb +19 -0
- data/lib/selenium_dsl/selenium_client/dsl.rb +50 -0
- data/lib/selenium_dsl/{script.rb → selenium_client/script.rb} +33 -33
- data/lib/selenium_dsl/selenium_helper.rb +5 -0
- data/lib/selenium_dsl/selenium_webdriver/dsl.rb +42 -0
- data/lib/selenium_dsl/selenium_webdriver/script.rb +65 -0
- data/lib/selenium_dsl/version.rb +1 -1
- data/lib/selenium_dsl/watir_webdriver/dsl.rb +39 -0
- data/lib/selenium_dsl/watir_webdriver/script.rb +18 -0
- data/selenium_dsl.gemspec +2 -1
- data/spec/access_wikipedia_spec.rb +177 -30
- data/spec/spec_helper.rb +58 -7
- metadata +30 -6
- data/lib/selenium_dsl/dsl.rb +0 -31
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'selenium/webdriver'
|
2
|
+
require 'selenium_dsl/proxy'
|
3
|
+
|
4
|
+
module SeleniumDSL::SeleniumWebdriver
|
5
|
+
class Script < SeleniumDSL::Proxy
|
6
|
+
attr_reader :driver
|
7
|
+
|
8
|
+
attr_accessor :timeout_in_seconds
|
9
|
+
|
10
|
+
def initialize driver
|
11
|
+
super driver, [:open, :select, :type]
|
12
|
+
|
13
|
+
@driver = driver
|
14
|
+
|
15
|
+
@timeout_in_seconds = 60
|
16
|
+
end
|
17
|
+
|
18
|
+
def condition block
|
19
|
+
lambda do |type, query|
|
20
|
+
element = find_element(type, query)
|
21
|
+
|
22
|
+
block.call(element)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def wait_for_condition(type, query, condition)
|
27
|
+
wait = ::Selenium::WebDriver::Wait.new(:timeout => @timeout_in_seconds) # seconds
|
28
|
+
|
29
|
+
wait.until { condition.call(type, query) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def is_text_present type, query, value
|
33
|
+
!!(find_element(type, query).text =~ /#{value}/i)
|
34
|
+
end
|
35
|
+
|
36
|
+
def click type, query
|
37
|
+
find_element(type, query).click
|
38
|
+
end
|
39
|
+
|
40
|
+
def select_box type, query, value
|
41
|
+
select_box = find_element(type, query)
|
42
|
+
|
43
|
+
options = select_box.find_elements(:tag_name => "option")
|
44
|
+
|
45
|
+
option = nil
|
46
|
+
|
47
|
+
if value.kind_of? Fixnum # get n-th element
|
48
|
+
option = options[value]
|
49
|
+
else
|
50
|
+
options.each do |current_option|
|
51
|
+
if current_option.text == value
|
52
|
+
option = current_option
|
53
|
+
break
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
option.click if option
|
59
|
+
end
|
60
|
+
|
61
|
+
def input type, query, value
|
62
|
+
find_element(type, query).send_keys(value)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/selenium_dsl/version.rb
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'watir-webdriver'
|
2
|
+
require 'selenium_dsl/proxy'
|
3
|
+
require 'selenium_dsl/watir_webdriver/script'
|
4
|
+
|
5
|
+
module SeleniumDSL::WatirWebdriver
|
6
|
+
class DSL
|
7
|
+
attr_reader :script, :driver
|
8
|
+
|
9
|
+
attr_writer :timeout_in_seconds
|
10
|
+
|
11
|
+
def initialize(browser, capabilities={})
|
12
|
+
@driver = Watir::Browser.new browser.to_sym
|
13
|
+
|
14
|
+
@driver.capabilities.merge(capabilities) unless capabilities.empty?
|
15
|
+
|
16
|
+
@script = SeleniumDSL::WatirWebdriver::Script.new @driver
|
17
|
+
end
|
18
|
+
|
19
|
+
def timeout_in_seconds= timeout_in_seconds
|
20
|
+
#@driver.manage.timeouts.implicit_wait = timeout_in_seconds.to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
def start
|
24
|
+
end
|
25
|
+
|
26
|
+
def stop
|
27
|
+
@driver.close
|
28
|
+
end
|
29
|
+
|
30
|
+
def watir_webdriver(&block)
|
31
|
+
@script.instance_eval(&block)
|
32
|
+
|
33
|
+
@script
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'selenium_dsl/proxy'
|
2
|
+
|
3
|
+
module SeleniumDSL::WatirWebdriver
|
4
|
+
class Script < SeleniumDSL::Proxy
|
5
|
+
attr_reader :driver
|
6
|
+
|
7
|
+
attr_accessor :timeout_in_seconds
|
8
|
+
|
9
|
+
def initialize driver
|
10
|
+
super driver, [:open, :select, :type]
|
11
|
+
|
12
|
+
@driver = driver
|
13
|
+
|
14
|
+
@timeout_in_seconds = 60
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/selenium_dsl.gemspec
CHANGED
@@ -15,7 +15,8 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.require_paths = ["lib"]
|
16
16
|
spec.version = SeleniumDSL::VERSION
|
17
17
|
|
18
|
-
spec.add_runtime_dependency "selenium-
|
18
|
+
spec.add_runtime_dependency "selenium-webdriver", [">= 0"]
|
19
|
+
spec.add_runtime_dependency "selenium", [">= 0"]
|
19
20
|
spec.add_development_dependency "gemspec_deps_gen", [">= 0"]
|
20
21
|
spec.add_development_dependency "gemcutter", [">= 0"]
|
21
22
|
|
@@ -1,54 +1,201 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
4
4
|
|
5
5
|
describe "access wikipedia" do
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
config = load_configuration
|
7
|
+
it "should submit the request with selenium-client" do
|
8
|
+
start_selenium_server
|
10
9
|
|
11
|
-
|
12
|
-
puts "Selenium: #{config['selenium_server_address']}:#{config['selenium_server_port']}"
|
10
|
+
config = load_configuration
|
13
11
|
|
14
|
-
|
15
|
-
|
12
|
+
puts "Application: #{config[:webapp_url]}"
|
13
|
+
puts "Selenium: #{config[:selenium_host]}:#{config[:selenium_port]}"
|
14
|
+
|
15
|
+
driver = SeleniumDSL::SeleniumClient::DSL.new(
|
16
|
+
config[:selenium_host], config[:selenium_port], config[:browser], config[:webapp_url])
|
17
|
+
|
18
|
+
driver.timeout_in_seconds = config['timeout_in_seconds']
|
19
|
+
|
20
|
+
driver.start
|
21
|
+
|
22
|
+
driver.selenium_client do
|
23
|
+
open "/"
|
24
|
+
|
25
|
+
is_text_present("The Free Encyclopedia").should be_true
|
26
|
+
|
27
|
+
type "searchInput", "iphone"
|
28
|
+
|
29
|
+
click "go", :wait => true
|
30
|
+
|
31
|
+
is_text_present("iPhone").should be_true
|
16
32
|
end
|
17
33
|
|
18
|
-
|
19
|
-
|
20
|
-
|
34
|
+
driver.stop
|
35
|
+
|
36
|
+
stop_selenium_server
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should submit the request with selenium webdriver" do
|
40
|
+
start_selenium_server
|
41
|
+
|
42
|
+
config = load_configuration
|
43
|
+
|
44
|
+
puts "Application: #{config[:webapp_url]}"
|
45
|
+
puts "Selenium: #{config[:selenium_host]}:#{config[:selenium_port]}"
|
46
|
+
|
47
|
+
driver = SeleniumDSL::SeleniumWebdriver::DSL.new(
|
48
|
+
config[:selenium_host], config[:selenium_port], config[:browser])
|
49
|
+
|
50
|
+
driver.timeout_in_seconds = config[:timeout_in_seconds]
|
21
51
|
|
22
|
-
|
52
|
+
driver.start
|
23
53
|
|
24
|
-
|
54
|
+
driver.selenium_webdriver do
|
55
|
+
get config[:webapp_url]
|
25
56
|
|
26
|
-
|
57
|
+
expect(find_element(:id, 'www-wikipedia-org')).not_to be_nil
|
27
58
|
|
28
|
-
|
29
|
-
end
|
59
|
+
find_element(:id, 'searchInput').send_keys("iphone")
|
30
60
|
|
61
|
+
find_element(:name, 'go').click
|
62
|
+
|
63
|
+
disabled_condition = condition(lambda { |element| element.attribute("disabled").nil? ? true : element.attribute("disabled") })
|
64
|
+
|
65
|
+
wait_for_condition :id, 'content', disabled_condition
|
66
|
+
|
67
|
+
expect(find_element(:id, 'content').text).to match /iPhone/
|
31
68
|
end
|
69
|
+
|
70
|
+
driver.stop
|
71
|
+
|
72
|
+
stop_selenium_server
|
32
73
|
end
|
33
74
|
|
34
|
-
|
75
|
+
it "should submit the request with watir webdriver" do
|
76
|
+
config = load_configuration
|
35
77
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
'selenium_server_port' => '4444',
|
43
|
-
'selenium_browser_key' => '*firefox',
|
44
|
-
'timeout_in_seconds' => 40
|
45
|
-
}
|
78
|
+
driver = SeleniumDSL::WatirWebdriver::DSL.new(config[:browser])
|
79
|
+
|
80
|
+
driver.start
|
81
|
+
|
82
|
+
driver.watir_webdriver do
|
83
|
+
goto config[:webapp_url]
|
46
84
|
|
47
|
-
|
85
|
+
expect(element(:id => 'www-wikipedia-org')).not_to be_nil
|
48
86
|
|
49
|
-
|
87
|
+
text_field(:id => 'searchInput').set("iphone")
|
50
88
|
|
51
|
-
|
89
|
+
button(:name => 'go').click
|
90
|
+
|
91
|
+
# todo: 1. how to wait?
|
92
|
+
# todo 2. how to use selenium?
|
93
|
+
# todo 3. how to use remote selenium?
|
94
|
+
|
95
|
+
#wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
|
96
|
+
#wait.until {
|
97
|
+
# driver.find_element(:id, 'content')
|
98
|
+
#}
|
99
|
+
|
100
|
+
expect(element(:id, 'content').text).to match /iPhone/
|
101
|
+
|
102
|
+
expect(url).to eq "http://en.wikipedia.org/wiki/Iphone"
|
103
|
+
end
|
104
|
+
|
105
|
+
driver.stop
|
106
|
+
end
|
107
|
+
|
108
|
+
#it "should submit the request with capybara and webkit" do
|
109
|
+
# config = load_configuration
|
110
|
+
#
|
111
|
+
# driver = SeleniumDSL::Capybara::DSL.new(
|
112
|
+
# config[:selenium_host], config[:selenium_port], config[:browser], config[:webapp_url], :webkit)
|
113
|
+
#
|
114
|
+
# driver.timeout_in_seconds = config['timeout_in_seconds']
|
115
|
+
#
|
116
|
+
# driver.start
|
117
|
+
#
|
118
|
+
# driver.capybara do
|
119
|
+
# visit '/'
|
120
|
+
#
|
121
|
+
# text.should =~ /The Free Encyclopedia/
|
122
|
+
#
|
123
|
+
# expect(find('#www-wikipedia-org')).not_to be_nil
|
124
|
+
#
|
125
|
+
# fill_in 'searchInput', :with => 'iphone.com'
|
126
|
+
# click_button ' → '
|
127
|
+
#
|
128
|
+
# ## todo: how to wait?
|
129
|
+
# ##wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
|
130
|
+
# ##wait.until {
|
131
|
+
# ## driver.find_element(:id, 'content')
|
132
|
+
# ##}
|
133
|
+
#
|
134
|
+
# expect(find('#content').text).to match /iPhone/
|
135
|
+
#
|
136
|
+
# # "http://en.wikipedia.org/wiki/Special:Search?search=iphone.com&go=Go"
|
137
|
+
# #expect(page.current_url).to eq "http://en.wikipedia.org/wiki/Iphone"
|
138
|
+
#
|
139
|
+
# # save_and_open_page
|
140
|
+
# end
|
141
|
+
#
|
142
|
+
# driver.stop
|
143
|
+
#end
|
144
|
+
#
|
145
|
+
#it "should submit the request with capybara and selenium" do
|
146
|
+
# start_selenium_server(:port => 4444)
|
147
|
+
#
|
148
|
+
# config = load_configuration
|
149
|
+
#
|
150
|
+
# driver = SeleniumDSL::Capybara::DSL.new(
|
151
|
+
# config[:selenium_host], config[:selenium_port], config[:browser], config[:webapp_url], :selenium)
|
152
|
+
#
|
153
|
+
# driver.timeout_in_seconds = config['timeout_in_seconds']
|
154
|
+
#
|
155
|
+
# driver.start
|
156
|
+
#
|
157
|
+
# driver.capybara do
|
158
|
+
# visit '/'
|
159
|
+
#
|
160
|
+
# text.should =~ /The Free Encyclopedia/
|
161
|
+
#
|
162
|
+
# expect(find('#www-wikipedia-org')).not_to be_nil
|
163
|
+
#
|
164
|
+
# fill_in 'searchInput', :with => 'iphone.com'
|
165
|
+
# click_button ' → '
|
166
|
+
#
|
167
|
+
# ## todo: how to wait?
|
168
|
+
# # todo: how to execute remote selenium?
|
169
|
+
#
|
170
|
+
# ##wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
|
171
|
+
# ##wait.until {
|
172
|
+
# ## driver.find_element(:id, 'content')
|
173
|
+
# ##}
|
174
|
+
#
|
175
|
+
# expect(find('#content').text).to match /iPhone/
|
176
|
+
#
|
177
|
+
# # "http://en.wikipedia.org/wiki/Special:Search?search=iphone.com&go=Go"
|
178
|
+
# #expect(page.current_url).to eq "http://en.wikipedia.org/wiki/Iphone"
|
179
|
+
#
|
180
|
+
# # save_and_open_page
|
181
|
+
# end
|
182
|
+
#
|
183
|
+
# driver.stop
|
184
|
+
#
|
185
|
+
# stop_selenium_server
|
186
|
+
#end
|
187
|
+
|
188
|
+
private
|
189
|
+
|
190
|
+
def load_configuration
|
191
|
+
{
|
192
|
+
:webapp_url => "http://www.wikipedia.org",
|
193
|
+
|
194
|
+
:selenium_host => "localhost",
|
195
|
+
:selenium_port => "4444",
|
196
|
+
:browser => 'firefox',
|
197
|
+
:timeout_in_seconds => 40
|
198
|
+
}
|
52
199
|
end
|
53
200
|
|
54
201
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,10 +4,14 @@ require 'rubygems' unless Object.const_defined?(:Gem)
|
|
4
4
|
$:.unshift File.dirname(__FILE__) + '/../lib'
|
5
5
|
|
6
6
|
require "selenium_dsl"
|
7
|
+
require 'selenium/server'
|
7
8
|
|
8
|
-
SeleniumDSL::Script.send :include, RSpec::Matchers
|
9
|
+
SeleniumDSL::SeleniumClient::Script.send :include, RSpec::Matchers
|
10
|
+
SeleniumDSL::SeleniumWebdriver::Script.send :include, RSpec::Matchers
|
11
|
+
SeleniumDSL::WatirWebdriver::Script.send :include, RSpec::Matchers
|
12
|
+
#SeleniumDSL::Capybara::Script.send :include, RSpec::Matchers
|
9
13
|
|
10
|
-
RSpec.configuration.include(SeleniumDSL::DSL)
|
14
|
+
#RSpec.configuration.include(SeleniumDSL::DSL)
|
11
15
|
|
12
16
|
module Selenium::Client::Base
|
13
17
|
alias originalInitialize initialize
|
@@ -20,11 +24,58 @@ module Selenium::Client::Base
|
|
20
24
|
end
|
21
25
|
|
22
26
|
share_examples_for :SeleniumTest do
|
23
|
-
before :
|
24
|
-
|
27
|
+
before :all do
|
28
|
+
start_selenium_server
|
25
29
|
end
|
26
30
|
|
27
|
-
after :
|
28
|
-
|
31
|
+
after :all do
|
32
|
+
stop_selenium_server
|
29
33
|
end
|
30
|
-
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
#def selenium_already_started?
|
38
|
+
# system "lsof -i :4444"
|
39
|
+
#end
|
40
|
+
#
|
41
|
+
#def download_selenium_server url, file_name
|
42
|
+
# system "mkdir #{File.dirname(file_name)}"
|
43
|
+
# system "wget #{url} -O #{file_name}"
|
44
|
+
#end
|
45
|
+
#
|
46
|
+
#def start_selenium_server opts = {}
|
47
|
+
# unless selenium_already_started?
|
48
|
+
# require 'selenium'
|
49
|
+
#
|
50
|
+
# version = Selenium::Starter::SELENIUM_SERVER_VERSION
|
51
|
+
# url = "http://selenium.googlecode.com/files/selenium-server-standalone-#{version}.jar"
|
52
|
+
# file_name = "#{ENV['HOME']}/.selenium/assets/selenium-#{version}/selenium-server-standalone-#{version}.jar"
|
53
|
+
#
|
54
|
+
# unless File.exist? file_name
|
55
|
+
# download_selenium_server url, file_name
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# opts[:background] = true
|
59
|
+
# @server = Selenium::Server.new(file_name, opts)
|
60
|
+
# @server.start
|
61
|
+
# end
|
62
|
+
#end
|
63
|
+
|
64
|
+
def start_selenium_server
|
65
|
+
require 'selenium'
|
66
|
+
|
67
|
+
version = Selenium::Starter::SELENIUM_SERVER_VERSION
|
68
|
+
selenium_server_standalone_jar = "#{ENV['HOME']}/.selenium/assets/selenium-#{version}/selenium-server-standalone-#{version}.jar"
|
69
|
+
|
70
|
+
if File.exist? selenium_server_standalone_jar
|
71
|
+
@server = Selenium::Server.new(selenium_server_standalone_jar, :background => true)
|
72
|
+
@server.start
|
73
|
+
else
|
74
|
+
puts "Selenium gem is not installed.Run: selenium install"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def stop_selenium_server
|
79
|
+
@server.stop if @server
|
80
|
+
@server = nil
|
81
|
+
end
|