Selenium 1.0.9 → 1.1.11

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.
Files changed (32) hide show
  1. data/lib/selenium.rb +4 -1
  2. data/lib/selenium/auto_it.rb +6 -0
  3. data/lib/selenium/auto_it_driver.rb +45 -0
  4. data/lib/selenium/auto_it_window.rb +86 -0
  5. data/lib/selenium/autoit/AutoItX3.dll +0 -0
  6. data/lib/selenium/autoit/README +1 -0
  7. data/lib/selenium/button.rb +4 -16
  8. data/lib/selenium/file_upload.rb +16 -0
  9. data/lib/selenium/html_element.rb +26 -0
  10. data/lib/selenium/link.rb +8 -18
  11. data/lib/selenium/selenium_server.rb +73 -44
  12. data/lib/selenium/server.rb +24 -0
  13. data/lib/selenium/server_manager.rb +2 -0
  14. data/lib/selenium/text_field.rb +6 -7
  15. data/lib/selenium/version +1 -1
  16. data/lib/selenium/web_page.rb +109 -2
  17. data/spec/selenium/examples/selenium_ruby/directory_listing_page.rb +9 -0
  18. data/spec/selenium/{download_page.rb → examples/selenium_ruby/download_page.rb} +0 -0
  19. data/spec/selenium/{home_page.rb → examples/selenium_ruby/home_page.rb} +0 -4
  20. data/spec/selenium/{license_page.rb → examples/selenium_ruby/license_page.rb} +0 -0
  21. data/spec/selenium/examples/selenium_ruby/menu.rb +29 -0
  22. data/spec/selenium/{selenium_ruby_page.rb → examples/selenium_ruby/selenium_ruby_page.rb} +2 -9
  23. data/spec/selenium/manual_tc_file_upload.rb +53 -0
  24. data/spec/selenium/tc_auto_it.rb +18 -0
  25. data/spec/selenium/tc_auto_it_window.rb +19 -0
  26. data/spec/selenium/tc_basic_operation.rb +7 -11
  27. data/spec/selenium/tc_domain_example.rb +21 -22
  28. data/spec/selenium/tc_interaction_example.rb +9 -9
  29. data/spec/selenium/tc_web_page.rb +19 -0
  30. metadata +59 -39
  31. data/lib/selenium/directory_listing_page.rb +0 -20
  32. data/spec/selenium/menu.rb +0 -31
@@ -3,10 +3,13 @@ $:.unshift File.join(File.dirname(__FILE__), 'selenium')
3
3
  require 'openqa/selenium'
4
4
 
5
5
  require 'selenium_server'
6
+ require 'web_page'
6
7
  require 'server'
7
- require 'directory_listing_page'
8
8
 
9
+ require 'html_element'
9
10
  require 'button'
10
11
  require 'link'
11
12
  require 'locator'
12
13
  require 'text_field'
14
+
15
+
@@ -0,0 +1,6 @@
1
+ $:.unshift File.join(File.dirname(__FILE__))
2
+
3
+ require 'win32ole'
4
+ require 'auto_it_driver'
5
+ require 'auto_it_window'
6
+ require 'file_upload'
@@ -0,0 +1,45 @@
1
+ module Selenium
2
+ class AutoIt
3
+ @@autoit = nil
4
+
5
+ def self.load
6
+ begin
7
+ @@autoit = load_instance
8
+ rescue WIN32OLERuntimeError
9
+ registerAutoItDll
10
+ @@autoit = load_instance
11
+ end
12
+ @@autoit
13
+ end
14
+
15
+ def self.load_instance
16
+ @@autoit = WIN32OLE.new('AutoItX3.Control') unless @@autoit
17
+ @@autoit
18
+ end
19
+
20
+ def self.reset
21
+ if @@autoit
22
+ @@autoit.ole_free
23
+ @@autoit =nil
24
+ system("regsvr32.exe /s /u #{dll}")
25
+ end
26
+ end
27
+
28
+ def self.registerAutoItDll
29
+ system("regsvr32.exe /s #{dll}")
30
+ end
31
+
32
+ def self.dll
33
+ File.join(File.dirname(__FILE__), 'autoit', 'AutoItX3.dll')
34
+ end
35
+
36
+ def initialize
37
+ @autoit = AutoIt.load
38
+ end
39
+
40
+ def on_window_active(title, text = nil)
41
+ @autoit.WinWaitActive(title, text, 30)
42
+ yield @@autoit
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,86 @@
1
+ $:.unshift File.join(File.dirname(__FILE__))
2
+
3
+ require 'auto_it'
4
+
5
+ class AutoItWindow
6
+ def initialize(autoit, title, text=nil)
7
+ @autoit = autoit
8
+ @title = title
9
+ @text = text
10
+ end
11
+
12
+ def self.wait_for(autoit, title, text = nil)
13
+ window = self.new(autoit, title, text)
14
+ window.wait_for_appear
15
+ window
16
+ end
17
+
18
+ def self.on_activation(autoit, title, text = nil)
19
+ window = wait_for(autoit, title, text)
20
+ yield window
21
+ end
22
+
23
+ def wait_for_activation
24
+ @autoit.WinWaitActive(@title, @text, 30)
25
+ end
26
+
27
+ def wait_for_appear
28
+ @autoit.WinWait(@title, @text, 30)
29
+ end
30
+
31
+ def activate
32
+ @autoit.WinActivate(@title, @text)
33
+ end
34
+
35
+ def active?
36
+ 1 == @autoit.WinActive(@title, @text)
37
+ end
38
+
39
+ def state
40
+ AutoItWindowState.new(@autoit.WinGetState(@title, @text))
41
+ end
42
+
43
+ def send_keys(keys)
44
+ activate_if_needed
45
+ @autoit.Send(keys)
46
+ end
47
+
48
+ def close
49
+ @autoit.WinClose(@title)
50
+ end
51
+
52
+ def activate_if_needed
53
+ winstate = state
54
+ activate unless winstate.active?
55
+ end
56
+ end
57
+
58
+ class AutoItWindowState
59
+ def initialize(state)
60
+ @state = state
61
+ end
62
+
63
+ def exists?
64
+ @state & 1 > 0
65
+ end
66
+
67
+ def visible?
68
+ @state & 2 > 0
69
+ end
70
+
71
+ def enabled?
72
+ @state & 4 > 0
73
+ end
74
+
75
+ def active?
76
+ @state & 8 > 0
77
+ end
78
+
79
+ def minimized?
80
+ @state & 16 > 0
81
+ end
82
+
83
+ def maxmized?
84
+ @state & 32 > 0
85
+ end
86
+ end
@@ -0,0 +1 @@
1
+ All the files in this foler are from the "AutoIt" project (http://www.autoitscript.com/autoit3/), under autoit3 license
@@ -1,19 +1,7 @@
1
1
  module Selenium
2
- class Button
3
- attr_reader :browser
4
-
5
- def initialize(browser, locator)
6
- @browser = browser
7
- @locator = locator
2
+ class Button < HtmlElement
3
+ def initialize(webpage, locator)
4
+ super(webpage, locator)
5
+ end
8
6
  end
9
-
10
- def click
11
- browser.click(@locator)
12
- end
13
-
14
- def click_wait
15
- click
16
- browser.wait_for_page_to_load()
17
- end
18
- end
19
7
  end
@@ -0,0 +1,16 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'auto_it_window'
4
+
5
+ module Selenium
6
+ class FileUpload
7
+ def initialize(webpage, locator)
8
+ @webpage = webpage
9
+ @locator = locator
10
+ end
11
+
12
+ def enter(file)
13
+ @webpage.upload(@locator, file)
14
+ end
15
+ end
16
+ end
@@ -1,4 +1,30 @@
1
1
  module Selenium
2
2
  class HtmlElement
3
+ attr_reader :webpage, :locator
4
+ def initialize(webpage, locator)
5
+ webpage = WebPage.new(webpage) if webpage.is_a? SeleniumDriver
6
+ @webpage = webpage
7
+ @locator = locator
8
+ end
9
+
10
+ def browser
11
+ webpage.browser
12
+ end
13
+
14
+ def present?
15
+ webpage.browser.is_element_present @locator
16
+ end
17
+
18
+ # click the element
19
+ def click
20
+ @webpage.click(@locator)
21
+ end
22
+
23
+ # click the element and wait for page to load
24
+ # TODO: wait on block instead if givven
25
+ def click_wait
26
+ @webpage.click_wait(@locator)
27
+ end
28
+
3
29
  end
4
30
  end
@@ -1,32 +1,22 @@
1
1
  module Selenium
2
2
 
3
3
  # Link class that models the behavior of a link
4
- class Link
5
- attr_reader :browser
6
-
4
+ class Link < HtmlElement
7
5
  def Link::by_id(browser, id, target = nil)
8
- Link.new(browser, "id=#{id}", target)
6
+ Link.new(WebPage.new(browser), "id=#{id}", target)
9
7
  end
10
8
 
11
9
  def Link::by_text(browser, text, target = nil)
12
- Link.new(browser, "link=#{text}", target)
10
+ Link.new(WebPage.new(browser), "link=#{text}", target)
13
11
  end
14
12
 
15
- def initialize(browser, locator, target = nil)
16
- @browser = browser
17
- @locator = locator
13
+ def initialize(webpage, locator, target = nil)
14
+ super(webpage, locator)
18
15
  @target = target
19
16
  end
20
17
 
21
- # click the link
22
- def click
23
- @browser.click(@locator)
24
- end
25
-
26
- # click the link and wait for page to load
27
- def click_wait
28
- click
29
- @browser.wait_for_page_to_load(30000)
18
+ def with_target(target)
19
+ Link.new(webpage, locator, target.new(webpage.browser))
30
20
  end
31
21
 
32
22
  # click the link, wait for the page to load, and asserts the target that
@@ -34,7 +24,7 @@ module Selenium
34
24
  def go
35
25
  raise "target page not defined for link #{@locator}" unless @target
36
26
  click_wait
37
- @target.assert_page
27
+ @target.ensure_present
38
28
  @target
39
29
  end
40
30
  end
@@ -2,54 +2,83 @@ require 'net/http'
2
2
 
3
3
  module Selenium
4
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
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
23
9
 
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(*argv)
31
- SeleniumServer.run(['-port', port_number.to_s] + argv)
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|
10
+ def SeleniumServer::run(argv, vmparameter='')
11
+ jar_file = SeleniumServer.jar_file
12
+ if (argv[0] == '-stop')
13
+ server = SeleniumServer.new(argv[1])
14
+ puts "stopping server on port #{server.port_number}"
15
+ server.stop
16
+ elsif argv[0] == '-check'
17
+ server = SeleniumServer.new(argv[1])
18
+ if (server.running?)
19
+ puts "server running on #{server.port_number}"
20
+ else
21
+ puts "server not running on #{server.port_number}"
22
+ end
23
+ else
24
+ command = "java #{vmparameter} -jar #{jar_file} #{argv.join(' ')}"
25
+ puts command
26
+ system(command)
27
+ end
28
+ end
29
+
30
+ private
31
+ def SeleniumServer::jar_file
32
+ File.join(File.dirname(__FILE__), 'openqa', 'selenium-server.jar.txt')
33
+ end
34
+
35
+ public
36
+ attr_reader :port_number, :request_timeout
37
+ attr_accessor :print_log
38
+
39
+ # Initialize the server driver with an opitonal port number (default to 4444)
40
+ def initialize(port_number_to_use = 4444)
41
+ port_number_to_use = 4444 unless port_number_to_use
42
+ @port_number = port_number_to_use
43
+ @request_timeout = 30
44
+ @print_log = false
45
+ end
46
+
47
+ def port_number
48
+ @port_number
49
+ end
50
+
51
+ # Starts the Selenium server. This does not return until the server is shutdown.
52
+ def start(*argv)
53
+ logging_option = ''
54
+ logging_option = '-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog -Dorg.apache.commons.logging.simplelog.defaultlog=warn' unless @print_log
55
+ SeleniumServer.run(['-port', port_number.to_s, '-timeout', request_timeout.to_s] + argv, logging_option)
56
+ end
57
+
58
+ # Stops the Selenium server
59
+ def stop
60
+ Net::HTTP.get('localhost', '/selenium-server/driver/?cmd=shutDown', @port_number)
61
+ end
62
+
63
+ # Check if the Selenium is running by sending a test_complete command with invalid session ID
64
+ def running?
65
+ begin
66
+ ping
67
+ rescue Errno::EBADF, Errno::ECONNREFUSED => e
68
+ return false
69
+ end
70
+ return true
71
+ end
72
+
73
+ # ping the server to see if it is running, raises error if not
74
+ # returns the ping status
75
+ def ping
76
+ url = URI.parse("http://localhost:#{@port_number}/selenium-server/driver/?cmd=testComplete&sessionId=smoketest")
77
+ request = Net::HTTP::Get.new(url.path)
78
+ Net::HTTP.start(url.host, url.port) {|http|
45
79
  http.read_timeout=5
46
80
  http.request(request)
47
81
  }
48
- puts "response: #{res}"
49
- rescue Errno::EBADF, Errno::ECONNREFUSED => e
50
- return false
51
82
  end
52
- return true
53
83
  end
54
- end
55
84
  end
@@ -1,3 +1,5 @@
1
+ require 'uri'
2
+
1
3
  module Selenium
2
4
  # The class that can manages the server driver classes.
3
5
  # This class is originally copied from the BuildMaster project.
@@ -28,13 +30,33 @@ class Server
28
30
  @status = 'stopped'
29
31
  end
30
32
 
33
+ def print_log=(value)
34
+ @server.print_log = value
35
+ end
36
+
31
37
  # Starts the server, returns when the server is up and running
32
38
  def start(*argv)
39
+ puts "starting selenium server..."
33
40
  starting_server(*argv)
34
41
  wait_for_condition {@server.running?}
42
+ puts "started selenium server"
35
43
  @status = 'started'
36
44
  end
37
45
 
46
+ def driver(browser_start_command, browser_url)
47
+ SeleniumDriver.new('localhost', @server.port_number, browser_start_command, browser_url, @server.request_timeout * 1000)
48
+ end
49
+
50
+ def open(browser_start_command, browser_url)
51
+ url = URI.parse(browser_url)
52
+ browser = driver(browser_start_command, URI::Generic::new(url.scheme, url.userinfo, url.host, url.port, nil, nil, nil, nil, nil))
53
+ browser.start
54
+ browser.open(url.request_uri)
55
+ page = WebPage.new(browser)
56
+ page.wait_for_load
57
+ page
58
+ end
59
+
38
60
  # Starts the server, does not return until the server shuts down
39
61
  def run(*argv)
40
62
  @server.start(*argv)
@@ -42,8 +64,10 @@ class Server
42
64
 
43
65
  # Stops the server, returns when the server is no longer running
44
66
  def stop
67
+ puts "stopping selenium server..."
45
68
  stopping_server
46
69
  wait_for_condition {not @server.running?}
70
+ puts "stopped selenium server."
47
71
  @status = 'stopped'
48
72
  end
49
73
 
@@ -1,3 +1,5 @@
1
+
2
+
1
3
  module Selenium
2
4
 
3
5
  require 'server'
@@ -1,18 +1,17 @@
1
1
  module Selenium
2
- class TextField
2
+ class TextField < HtmlElement
3
3
  attr_reader :browser
4
4
 
5
- def initialize(browser, locator)
6
- @browser = browser
7
- @locator = locator
5
+ def initialize(webpage, locator)
6
+ super(webpage, locator)
8
7
  end
9
8
 
10
- def type(value)
11
- @browser.type(@locator, value)
9
+ def enter(value)
10
+ @webpage.enter(@locator, value)
12
11
  end
13
12
 
14
13
  def value
15
- @browser.get_value(@locator)
14
+ @webpage.value(@locator)
16
15
  end
17
16
  end
18
17
  end
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.1.11
@@ -1,18 +1,125 @@
1
1
  $:.unshift File.dirname(__FILE__)
2
2
 
3
+ require 'timeout'
4
+
3
5
  module Selenium
4
6
  # Class that models a web page with a title
5
7
  class WebPage
6
- attr_reader :title
8
+ attr_reader :browser
9
+ attr_accessor :timeout, :interval_millis
7
10
 
8
- def initialize(browser, expected_title)
11
+ def initialize(browser, expected_title = nil)
9
12
  @browser = browser
10
13
  @expected_title = expected_title
14
+ @timeout = 60
15
+ @interval_millis = 100
11
16
  end
12
17
 
13
18
  def title
19
+ raise 'nil as browser' unless @browser
14
20
  @browser.get_title
15
21
  end
22
+
23
+ def present?
24
+ title == @expected_title
25
+ end
26
+
27
+ def ensure_present
28
+ title.should == @expected_title
29
+ end
30
+
31
+ def html
32
+ @browser.get_html_source
33
+ end
34
+
35
+ def wait_for_load
36
+ @browser.wait_for_page_to_load
37
+ end
38
+
39
+ def wait_until(message, &block)
40
+ Timeout::timeout(timeout, "Timeout waiting for : #{message}") do
41
+ while(not yield message)
42
+ sleep interval_millis / 1000.0
43
+ end
44
+ end
45
+ end
46
+
47
+ def link(how, what=nil)
48
+ if (how == :text)
49
+ locator = "link=#{what}"
50
+ elsif (how == :href)
51
+ locator = "xpath=//a[@href='#{what}']"
52
+ else
53
+ locator = element_locator(how, what)
54
+ end
55
+ Link.new(self, locator)
56
+ end
57
+
58
+ def text_field(how, what=nil)
59
+ TextField.new(self, element_locator(how, what))
60
+ end
61
+
62
+ def button(how, what=nil)
63
+ Button.new(self, element_locator(how, what))
64
+ end
65
+
66
+ def element_locator(how, what=nil)
67
+ locator = how
68
+ if (not what.nil?)
69
+ if (how == :xpath or how == :name or how == :id)
70
+ locator = "#{how}=#{what}"
71
+ else
72
+ raise "couldn't understand how to build locator using #{how} with #{what}"
73
+ end
74
+ end
75
+ end
76
+
77
+ def file_upload(how, what)
78
+ FileUpload.new(self, element_locator(how, what))
79
+ end
80
+
81
+ def open(url)
82
+ @browser.open(url)
83
+ end
84
+
85
+ def close
86
+ @browser.stop
87
+ end
88
+
89
+ def click(locator)
90
+ @browser.click(locator)
91
+ end
92
+
93
+ def click_wait(locator)
94
+ click(locator)
95
+ wait_for_load
96
+ end
97
+
98
+ # enter the text to the element found by locator
99
+ def enter(locator, text)
100
+ @browser.type(locator, text)
101
+ end
102
+
103
+ def value(locator)
104
+ @browser.get_value(locator)
105
+ end
106
+
107
+ def upload(locator, file)
108
+ # @browser.attach_file(locator, file)
109
+ @browser.click(locator)
110
+ require 'auto_it'
111
+ autoit = AutoIt.load
112
+ window = AutoItWindow.wait_for(autoit, 'File Upload')
113
+ puts window
114
+ end
115
+
116
+ def capture_page(file)
117
+ @browser.capture_entire_page_screenshot(file)
118
+ end
119
+
120
+ def capture_screen(file)
121
+ @browser.capture_screenshot(file)
122
+ end
16
123
 
17
124
  end
18
125
  end
@@ -0,0 +1,9 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ module Selenium
4
+ class DirectoryListingPage < WebPage
5
+ def initialize(browser)
6
+ super(browser, 'Index of /')
7
+ end
8
+ end
9
+ end
@@ -2,10 +2,6 @@ $:.unshift File.dirname(__FILE__)
2
2
  require 'menu'
3
3
  require 'selenium_ruby_page'
4
4
 
5
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib', 'selenium')
6
-
7
- require 'link'
8
-
9
5
  module Selenium
10
6
  class HomePage < SeleniumRubyPage
11
7
 
@@ -0,0 +1,29 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'home_page'
4
+ require 'directory_listing_page'
5
+ require 'license_page'
6
+
7
+ module Selenium
8
+ class Menu
9
+ attr_reader :webpage
10
+ def initialize(webpage)
11
+ @webpage = webpage
12
+ end
13
+
14
+ def home_link
15
+ # todo there should be a way to alter this instance so that the click returns the directory listing page
16
+ webpage.link(:id, 'home').with_target(DirectoryListingPage)
17
+ end
18
+
19
+ #MENU START
20
+ def download_link
21
+ webpage.link(:text, 'Download')
22
+ end
23
+
24
+ def license_link
25
+ webpage.link(:text, 'License').with_target(LicensePage)
26
+ end
27
+ #MENU END
28
+ end
29
+ end
@@ -1,9 +1,6 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib', 'selenium')
2
-
3
- require 'web_page'
4
-
5
1
  $:.unshift File.dirname(__FILE__)
6
2
 
3
+ #require '../../../../lib/selenium'
7
4
  require 'menu'
8
5
 
9
6
  module Selenium
@@ -14,12 +11,8 @@ module Selenium
14
11
  super(browser, expected_title)
15
12
  end
16
13
 
17
- def assert_page
18
- title.should == @expected_title
19
- end
20
-
21
14
  def menu
22
- Menu.new(@browser)
15
+ Menu.new(self)
23
16
  end
24
17
  end
25
18
  end
@@ -0,0 +1,53 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..')
2
+
3
+ require 'lib/selenium/auto_it'
4
+ require 'lib/selenium'
5
+ require 'spec'
6
+
7
+ module Selenium
8
+ describe FileUpload do
9
+ before(:all) do
10
+ @server = Server.on_port(4440)
11
+ # @server.print_log = true
12
+ @server.start
13
+ end
14
+
15
+ after(:all) do
16
+ @server.stop
17
+ end
18
+
19
+ before do
20
+ # @page = @server.open('*iexplore', 'http://www.rubyforge.org/projects/selenium')
21
+ @page = @server.open('*chrome D:\Program Files\Mozilla Firefox2\firefox.exe', 'http://www.rubyforge.org/projects/selenium')
22
+ end
23
+
24
+ after do
25
+ file = File.join(File.dirname(__FILE__), 'screenshot.png')
26
+ puts "image at #{file}"
27
+ @page.capture_screen(file)
28
+ @page.close
29
+ end
30
+
31
+ # this requires the user to manually enter the login information on rubyforge, and can only be run by selenium admin
32
+ it 'should handle firefox' do
33
+ login_link = @page.link(:text, 'Log In')
34
+ autoit = AutoIt.load
35
+ login_link.click if login_link.present?
36
+ AutoItWindow.wait_for(autoit, 'Website Certified by an Unknown Authority').send_keys(' ')
37
+ @page.wait_for_load
38
+ @page.wait_until('manual login for test') do |message|
39
+ puts message
40
+ not login_link.present?
41
+ end
42
+ @page.wait_for_load
43
+ selenium_project_link = @page.link(:text, 'Selenium')
44
+ selenium_project_link.should be_present
45
+ selenium_project_link.click_wait
46
+ @page.link(:text, 'Files').click_wait
47
+ @page.link(:href, '/frs/admin/?group_id=2789').click_wait
48
+ @page.link(:xpath, "//a[@href='qrs.php?package_id=3298&group_id=2789']").click_wait
49
+ @page.file_upload(:name, 'userfile').enter("file:///#{__FILE__}")
50
+ # @page.file_upload('userfile').enter("file:///#{__FILE__}")
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,18 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..')
2
+
3
+ require 'lib/selenium/auto_it'
4
+ require 'spec'
5
+
6
+ module Selenium
7
+ describe AutoIt do
8
+ it 'should control notepad' do
9
+ autoit = AutoIt.load
10
+ autoit.Run('Notepad.exe')
11
+ autoit.WinWaitActive('Untitled - Notepad')
12
+ autoit.Send('some text')
13
+ autoit.WinClose('Untitled - Notepad')
14
+ autoit.WinWaitActive('Notepad', 'Do you want to save')
15
+ autoit.Send('!n')
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..')
2
+
3
+ require 'lib/selenium/auto_it'
4
+ require 'spec'
5
+
6
+ module Selenium
7
+ describe AutoItWindow do
8
+ it 'should control notepad' do
9
+ autoit = AutoIt.load
10
+ autoit.Run('Notepad.exe')
11
+ window = AutoItWindow.new(autoit, 'Untitled - Notepad')
12
+ window.wait_for_activation
13
+ window.send_keys('some text')
14
+ window.close
15
+ confirm = AutoItWindow.wait_for(autoit, 'Notepad', 'Do you want to save')
16
+ confirm.send_keys('!n')
17
+ end
18
+ end
19
+ end
@@ -3,39 +3,35 @@ require 'spec'
3
3
  $:.unshift File.join(File.dirname(__FILE__), '..', '..')
4
4
 
5
5
  require 'lib/selenium'
6
- require 'spec/selenium/home_page'
7
- require 'spec/selenium/download_page'
6
+ require 'spec/selenium/examples/selenium_ruby/home_page'
7
+ require 'spec/selenium/examples/selenium_ruby/download_page'
8
8
 
9
9
  module Selenium
10
10
  describe 'basic operation with selenium' do
11
-
12
11
  before do
13
12
  port = 4567
14
13
  @server = Selenium::Server.on_port(port)
15
14
  @server.start
16
- @browser = Selenium::SeleniumDriver.new("localhost", port, "*iexplore", "http://localhost:2000", 10000)
17
- @browser.start
18
- @browser.open('http://localhost:2000/index.html')
15
+ @webpage = @server.open("*iexplore", 'http://localhost:2000/index.html')
16
+ @browser = @webpage.browser
19
17
  end
20
18
 
21
19
  after do
22
- @browser.stop
20
+ @webpage.close
23
21
  @server.stop
24
22
  end
25
23
 
26
24
  it 'should click through menus' do
27
- =begin comment
28
25
  #TEST START
29
26
  page = HomePage.new(@browser)
30
27
  page.menu.download_link.click_wait
31
28
  page = DownloadPage.new(@browser)
32
- page.assert_page
29
+ page.should be_present
33
30
  page = page.menu.home_link.go
34
- page.link_to_entry('index.txt').click_wait
31
+ page.link(:text, 'index.txt').click_wait
35
32
  page = HomePage.new(@browser)
36
33
  page.menu.license_link.go
37
34
  #TEST END
38
- =end comment
39
35
  end
40
36
  end
41
37
  end
@@ -1,55 +1,54 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..')
2
2
 
3
3
  require 'spec'
4
- require 'selenium'
4
+ require 'lib/selenium'
5
5
 
6
6
  #START GOOGLEHOME
7
- class GoogleHomPage
8
- include Selenium::Locator
9
- attr_reader :browser
10
-
11
- def GoogleHomPage::open(sel)
12
- sel.open("http://www.google.com/webhp")
13
- GoogleHomPage.new(sel)
14
- end
15
-
7
+ class GoogleHomPage < Selenium::WebPage
16
8
  def initialize(browser)
17
- @browser = browser
18
- end
9
+ super(browser, 'Google')
10
+ end
19
11
 
20
12
  def title
21
13
  browser.get_title
22
14
  end
23
15
 
24
16
  def search_field
25
- Selenium::TextField.new(browser, by_name('q'))
17
+ text_field(:name, 'q')
26
18
  end
27
19
 
28
20
  def search_button
29
- Selenium::Button.new(browser, by_name('btnG'))
21
+ button(:name, 'btnG')
30
22
  end
31
23
 
32
24
  end
33
25
  #END GOOGLEHOME
34
26
 
35
27
  context 'Test goole search' do
36
- before do
28
+ before(:all) do
37
29
  port = 4567
38
30
  @server = Selenium::Server.on_port(port)
39
31
  @server.start
40
- @sel = Selenium::SeleniumDriver.new("localhost", port, "*chrome", "http://www.google.com", 15000)
41
- @sel.start
42
32
  end
43
33
 
44
- after do
45
- @sel.stop
34
+ before(:each) do
35
+ @webpage = @server.open('*chrome D:\Program Files\Mozilla Firefox2\firefox.exe', 'http://www.google.com/webhp')
36
+ end
37
+
38
+ after(:each) do
39
+ @webpage.close if @webpage
40
+ end
41
+
42
+ after(:all) do
43
+ puts "stopping server"
46
44
  @server.stop
47
45
  end
48
46
 
49
47
  #START DOMAIN
50
48
  specify'searh hello world with google using docmain based script' do
51
- page = GoogleHomPage.open(@sel)
52
- page.search_field.type('hello world')
49
+ page = GoogleHomPage.new(@webpage.browser)
50
+ page.should be_present
51
+ page.search_field.enter('hello world')
53
52
  page.search_button.click_wait
54
53
  page.title.should == 'hello world - Google Search'
55
54
  page.search_field.value.should == 'hello world'
@@ -7,23 +7,23 @@ require 'selenium'
7
7
  context 'Test goole search' do
8
8
  before do
9
9
  port = 4567
10
- @server = Selenium::Server.on_port(4567)
10
+ @server = Selenium::Server.on_port(port)
11
11
  @server.start
12
- @sel = Selenium::SeleniumDriver.new("localhost", port, "*chrome", "http://www.google.com", 15000)
13
- @sel.start
12
+ @page = @server.open('*chrome D:\Program Files\Mozilla Firefox2\firefox.exe', 'http://www.google.com')
14
13
  end
15
14
 
16
15
  after do
17
- @sel.stop
16
+ @page.close
18
17
  @server.stop
19
18
  end
20
19
 
21
20
  specify'searh hello world with google using interaction based script' do
22
- @sel.open("http://www.google.com")
23
- @sel.type("q", "hello world")
24
- @sel.click("btnG")
25
- @sel.wait_for_page_to_load("5000")
26
- @sel.get_title.should == 'hello world - Google Search'
21
+ @page.open("/")
22
+ @page.title.should == 'Google'
23
+ @page.enter("q", "hello world")
24
+ @page.click("btnG")
25
+ @page.wait_for_load
26
+ @page.title.should == 'hello world - Google Search'
27
27
  end
28
28
 
29
29
  end
@@ -0,0 +1,19 @@
1
+ require 'spec'
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..')
4
+
5
+ require 'lib/selenium'
6
+
7
+ module Selenium
8
+ describe WebPage do
9
+ it 'should create link based on text' do
10
+ webpage = WebPage.new('browser')
11
+ webpage.link(:text, 'text').locator.should == 'link=text'
12
+ end
13
+
14
+ it 'should create link based on href' do
15
+ webpage = WebPage.new('browser')
16
+ webpage.link(:href, 'a.html').locator.should == "xpath=//a[@href='a.html']"
17
+ end
18
+ end
19
+ end
metadata CHANGED
@@ -1,38 +1,37 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: Selenium
5
3
  version: !ruby/object:Gem::Version
6
- version: 1.0.9
7
- date: 2008-05-18 00:00:00 -07: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:
4
+ version: 1.1.11
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Shane Duan
8
+ autorequire: selenium
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-07-12 00:00:00 -07:00
13
+ default_executable: selenium
14
+ dependencies: []
15
+
16
+ description:
17
+ email: selenium-ruby@googlegroups.com
18
+ executables:
19
+ - selenium
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
31
24
  files:
32
25
  - bin/selenium
33
26
  - lib/selenium
27
+ - lib/selenium/autoit
28
+ - lib/selenium/autoit/AutoItX3.dll
29
+ - lib/selenium/autoit/README
30
+ - lib/selenium/auto_it.rb
31
+ - lib/selenium/auto_it_driver.rb
32
+ - lib/selenium/auto_it_window.rb
34
33
  - lib/selenium/button.rb
35
- - lib/selenium/directory_listing_page.rb
34
+ - lib/selenium/file_upload.rb
36
35
  - lib/selenium/html_element.rb
37
36
  - lib/selenium/link.rb
38
37
  - lib/selenium/locator.rb
@@ -50,29 +49,50 @@ files:
50
49
  - lib/selenium/web_page.rb
51
50
  - lib/selenium.rb
52
51
  - spec/selenium
53
- - spec/selenium/download_page.rb
54
- - spec/selenium/home_page.rb
55
- - spec/selenium/license_page.rb
52
+ - spec/selenium/examples
53
+ - spec/selenium/examples/selenium_ruby
54
+ - spec/selenium/examples/selenium_ruby/directory_listing_page.rb
55
+ - spec/selenium/examples/selenium_ruby/download_page.rb
56
+ - spec/selenium/examples/selenium_ruby/home_page.rb
57
+ - spec/selenium/examples/selenium_ruby/license_page.rb
58
+ - spec/selenium/examples/selenium_ruby/menu.rb
59
+ - spec/selenium/examples/selenium_ruby/selenium_ruby_page.rb
60
+ - spec/selenium/manual_tc_file_upload.rb
56
61
  - spec/selenium/manual_tc_timout.rb
57
- - spec/selenium/menu.rb
58
- - spec/selenium/selenium_ruby_page.rb
62
+ - spec/selenium/tc_auto_it.rb
63
+ - spec/selenium/tc_auto_it_window.rb
59
64
  - spec/selenium/tc_basic_operation.rb
60
65
  - spec/selenium/tc_domain_example.rb
61
66
  - spec/selenium/tc_interaction_example.rb
62
67
  - spec/selenium/tc_server.rb
68
+ - spec/selenium/tc_web_page.rb
63
69
  - spec/ts_selenium.rb
64
70
  - README
65
- test_files: []
66
-
71
+ has_rdoc: true
72
+ homepage: http://selenium.rubyforge.org/
73
+ post_install_message:
67
74
  rdoc_options: []
68
75
 
69
- extra_rdoc_files:
70
- - README
71
- executables:
72
- - selenium
73
- extensions: []
74
-
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: "0"
83
+ version:
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: "0"
89
+ version:
75
90
  requirements: []
76
91
 
77
- dependencies: []
92
+ rubyforge_project: selenium
93
+ rubygems_version: 1.2.0
94
+ signing_key:
95
+ specification_version: 2
96
+ summary: A project that wraps selenium API into object-oriented testing style and packages it into a RubyGem.
97
+ test_files: []
78
98
 
@@ -1,20 +0,0 @@
1
- $:.unshift File.dirname(__FILE__)
2
- require 'link'
3
-
4
- module Selenium
5
- class DirectoryListingPage
6
- attr_reader :browser
7
-
8
- def initialize(browser)
9
- @browser = browser
10
- end
11
-
12
- def link_to_entry(text)
13
- Link.new(browser, "link=#{text}")
14
- end
15
-
16
- def assert_page
17
- @browser.get_title.should == 'Index of /'
18
- end
19
- end
20
- end
@@ -1,31 +0,0 @@
1
- $:.unshift File.dirname(__FILE__)
2
-
3
- require 'home_page'
4
-
5
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib', 'selenium')
6
-
7
- require 'directory_listing_page'
8
- require 'license_page'
9
-
10
- module Selenium
11
- class Menu
12
- attr_reader :browser
13
- def initialize(browser)
14
- @browser = browser
15
- end
16
- def home_link
17
- # todo there should be a way to alter this instance so that the click returns the directory listing page
18
- Link.by_id(browser, 'home', DirectoryListingPage.new(@browser))
19
- end
20
-
21
- #MENU START
22
- def download_link
23
- Link.by_text(browser, 'Download')
24
- end
25
-
26
- def license_link
27
- Link.by_text(browser, 'License', LicensePage.new(@browser))
28
- end
29
- #MENU END
30
- end
31
- end