Selenium 1.0.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/README +17 -0
- data/bin/selenium +5 -0
- data/lib/selenium.rb +13 -0
- data/lib/selenium/button.rb +19 -0
- data/lib/selenium/directory_listing_page.rb +16 -0
- data/lib/selenium/link.rb +27 -0
- data/lib/selenium/locator.rb +15 -0
- data/lib/selenium/openqa/README +5 -0
- data/lib/selenium/openqa/selenium-server.jar.txt +0 -0
- data/lib/selenium/openqa/selenium.rb +1363 -0
- data/lib/selenium/selenium_server.rb +55 -0
- data/lib/selenium/server_manager.rb +82 -0
- data/lib/selenium/text_field.rb +18 -0
- data/lib/selenium/version +1 -0
- data/test/selenium/download_page.rb +13 -0
- data/test/selenium/home_page.rb +18 -0
- data/test/selenium/menu.rb +18 -0
- data/test/selenium/tc_basic_operation.rb +33 -0
- data/test/selenium/tc_selenium_server.rb +19 -0
- metadata +67 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module Selenium
|
4
|
+
|
5
|
+
# Selenium server driver that provides API to start/stop server and check if
|
6
|
+
# server is running.
|
7
|
+
# NOTE: The start does not return until the server shuts down.
|
8
|
+
class SeleniumServer
|
9
|
+
def SeleniumServer::run(argv)
|
10
|
+
jar_file = SeleniumServer.jar_file
|
11
|
+
command = "java -jar #{jar_file} #{argv.join(' ')}"
|
12
|
+
puts command
|
13
|
+
system(command)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def SeleniumServer::jar_file
|
18
|
+
File.join(File.dirname(__FILE__), 'openqa', 'selenium-server.jar.txt')
|
19
|
+
end
|
20
|
+
|
21
|
+
public
|
22
|
+
attr_reader :port_number
|
23
|
+
|
24
|
+
# Initialize the server driver with an opitonal port number (default to 4444)
|
25
|
+
def initialize(port_number = 4444)
|
26
|
+
@port_number = port_number
|
27
|
+
end
|
28
|
+
|
29
|
+
# Starts the Selenium server. This does not return until the server is shutdown.
|
30
|
+
def start
|
31
|
+
SeleniumServer.run(['-port', port_number.to_s])
|
32
|
+
end
|
33
|
+
|
34
|
+
# Stops the Selenium server
|
35
|
+
def stop
|
36
|
+
Net::HTTP.get('localhost', '/selenium-server/driver/?cmd=shutDown', @port_number)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Check if the Selenium is running by sending a test_complete command with invalid session ID
|
40
|
+
def running?
|
41
|
+
url = URI.parse("http://localhost:#{@port_number}/selenium-server/driver/?cmd=testComplete&sessionId=smoketest")
|
42
|
+
request = Net::HTTP::Get.new(url.path)
|
43
|
+
begin
|
44
|
+
res = Net::HTTP.start(url.host, url.port) {|http|
|
45
|
+
http.read_timeout=5
|
46
|
+
http.request(request)
|
47
|
+
}
|
48
|
+
puts "response: #{res}"
|
49
|
+
rescue Errno::EBADF => e
|
50
|
+
return false
|
51
|
+
end
|
52
|
+
return true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Selenium
|
2
|
+
# The class that can manages the server driver classes.
|
3
|
+
# This class is copied from the BuildMaster project.
|
4
|
+
# You can setup your build task to start the server before
|
5
|
+
# the tests and shutdown when it is finished
|
6
|
+
# manager = Selenium::ServerManager.new(Selenium::Server.new)
|
7
|
+
# begin
|
8
|
+
# manager.start
|
9
|
+
# tests.run # run your tests here
|
10
|
+
# ensure
|
11
|
+
# manager.stop
|
12
|
+
# end
|
13
|
+
class ServerManager
|
14
|
+
# The status of the server. Values are
|
15
|
+
# * stopped
|
16
|
+
# * starting
|
17
|
+
# * started
|
18
|
+
# * stopping
|
19
|
+
# * error
|
20
|
+
attr_reader :status
|
21
|
+
|
22
|
+
def initialize(server)
|
23
|
+
@server = server
|
24
|
+
@status = 'stopped'
|
25
|
+
end
|
26
|
+
|
27
|
+
# Starts the server, returns when the server is up and running
|
28
|
+
def start
|
29
|
+
starting_server
|
30
|
+
wait_for_condition {@server.running?}
|
31
|
+
@status = 'started'
|
32
|
+
end
|
33
|
+
|
34
|
+
# Stops the server, returns when the server is no longer running
|
35
|
+
def stop
|
36
|
+
stopping_server
|
37
|
+
wait_for_condition {not @server.running?}
|
38
|
+
@status = 'stopped'
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def starting_server
|
43
|
+
@status = 'starting'
|
44
|
+
['INT', 'TERM'].each { |signal|
|
45
|
+
trap(signal){ @server.stop}
|
46
|
+
}
|
47
|
+
start_thread {@server.start}
|
48
|
+
end
|
49
|
+
|
50
|
+
def stopping_server
|
51
|
+
@status = 'stopping'
|
52
|
+
start_thread {@server.stop}
|
53
|
+
end
|
54
|
+
|
55
|
+
def start_thread
|
56
|
+
Thread.new do
|
57
|
+
begin
|
58
|
+
yield
|
59
|
+
rescue Exception => exception
|
60
|
+
@exception = exception
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def wait_for_condition
|
66
|
+
count = 0
|
67
|
+
sleep 1
|
68
|
+
while not (result = yield)
|
69
|
+
if (@exception)
|
70
|
+
error = @exception
|
71
|
+
@exception = nil
|
72
|
+
@status = 'error'
|
73
|
+
raise error
|
74
|
+
end
|
75
|
+
count = count + 1
|
76
|
+
raise 'wait timed out' unless count < 10
|
77
|
+
sleep 1
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Selenium
|
2
|
+
class TextField
|
3
|
+
attr_reader :browser
|
4
|
+
|
5
|
+
def initialize(browser, locator)
|
6
|
+
@browser = browser
|
7
|
+
@locator = locator
|
8
|
+
end
|
9
|
+
|
10
|
+
def type(value)
|
11
|
+
@browser.type(@locator, value)
|
12
|
+
end
|
13
|
+
|
14
|
+
def value
|
15
|
+
@browser.get_value(@locator)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
require 'menu'
|
3
|
+
|
4
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib', 'selenium')
|
5
|
+
|
6
|
+
require 'link'
|
7
|
+
|
8
|
+
module Selenium
|
9
|
+
class HomePage
|
10
|
+
include Menu
|
11
|
+
attr_reader :browser
|
12
|
+
|
13
|
+
def initialize(browser)
|
14
|
+
@browser = browser
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Selenium
|
2
|
+
module Menu
|
3
|
+
def home_link
|
4
|
+
# todo there should be a way to alter this instance so that the click returns the directory listing page
|
5
|
+
Link.by_id(browser, 'home')
|
6
|
+
end
|
7
|
+
|
8
|
+
#MENU START
|
9
|
+
def download_link
|
10
|
+
Link.by_text(browser, 'Download')
|
11
|
+
end
|
12
|
+
|
13
|
+
def license_link
|
14
|
+
Link.by_text(browser, 'License')
|
15
|
+
end
|
16
|
+
#MENU END
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..')
|
4
|
+
|
5
|
+
require 'lib/selenium'
|
6
|
+
require 'test/selenium/home_page'
|
7
|
+
require 'test/selenium/download_page'
|
8
|
+
|
9
|
+
module Selenium
|
10
|
+
context 'basic operation with selenium' do
|
11
|
+
context_setup do
|
12
|
+
@browser = Selenium::SeleniumDriver.new("localhost", 4444, "*iexplore", "http://localhost:2000", 10000)
|
13
|
+
@browser.start
|
14
|
+
end
|
15
|
+
|
16
|
+
setup do
|
17
|
+
@browser.open('http://localhost:2000/index.html')
|
18
|
+
end
|
19
|
+
|
20
|
+
specify 'click through menus' do
|
21
|
+
#TEST START
|
22
|
+
page = HomePage.new(@browser)
|
23
|
+
page.download_link.click_wait
|
24
|
+
page = DownloadPage.new(@browser)
|
25
|
+
page.home_link.click_wait
|
26
|
+
page = DirectoryListingPage.new(@browser)
|
27
|
+
page.link_to_entry('index.txt').click_wait
|
28
|
+
page = HomePage.new(@browser)
|
29
|
+
page.license_link.click_wait
|
30
|
+
#TEST END
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec'
|
2
|
+
require 'buildmaster/cotta'
|
3
|
+
require 'buildmaster/project/server_manager'
|
4
|
+
|
5
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib', 'selenium')
|
6
|
+
|
7
|
+
require 'selenium_server'
|
8
|
+
|
9
|
+
module Selenium
|
10
|
+
context 'selenium server' do
|
11
|
+
specify 'start and stop server' do
|
12
|
+
server = BuildMaster::ServerManager.new(SeleniumServer.new(4321))
|
13
|
+
puts 'starting server...'
|
14
|
+
server.start
|
15
|
+
puts 'stopping server...'
|
16
|
+
server.stop
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.0
|
3
|
+
specification_version: 1
|
4
|
+
name: Selenium
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 1.0.0
|
7
|
+
date: 2007-01-01 00:00:00 -08:00
|
8
|
+
summary: A project that wraps selenium API into object-oriented testing style and packages it into a RubyGem.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: selenium@gmail.com
|
12
|
+
homepage: http://selenium.rubyforge.org/
|
13
|
+
rubyforge_project: selenium
|
14
|
+
description:
|
15
|
+
autorequire: selenium
|
16
|
+
default_executable: selenium
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Shane Duan
|
31
|
+
files:
|
32
|
+
- bin/selenium
|
33
|
+
- lib/selenium
|
34
|
+
- lib/selenium.rb
|
35
|
+
- lib/selenium/button.rb
|
36
|
+
- lib/selenium/directory_listing_page.rb
|
37
|
+
- lib/selenium/link.rb
|
38
|
+
- lib/selenium/locator.rb
|
39
|
+
- lib/selenium/openqa
|
40
|
+
- lib/selenium/selenium_server.rb
|
41
|
+
- lib/selenium/server_manager.rb
|
42
|
+
- lib/selenium/text_field.rb
|
43
|
+
- lib/selenium/version
|
44
|
+
- lib/selenium/openqa/README
|
45
|
+
- lib/selenium/openqa/selenium-server.jar.txt
|
46
|
+
- lib/selenium/openqa/selenium.rb
|
47
|
+
- test/selenium
|
48
|
+
- test/selenium/download_page.rb
|
49
|
+
- test/selenium/home_page.rb
|
50
|
+
- test/selenium/menu.rb
|
51
|
+
- test/selenium/tc_basic_operation.rb
|
52
|
+
- test/selenium/tc_selenium_server.rb
|
53
|
+
- README
|
54
|
+
test_files: []
|
55
|
+
|
56
|
+
rdoc_options: []
|
57
|
+
|
58
|
+
extra_rdoc_files:
|
59
|
+
- README
|
60
|
+
executables:
|
61
|
+
- selenium
|
62
|
+
extensions: []
|
63
|
+
|
64
|
+
requirements: []
|
65
|
+
|
66
|
+
dependencies: []
|
67
|
+
|