commonwatir 1.6.5 → 1.6.6.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/CHANGES +461 -0
  2. data/{README.txt → LICENSE} +22 -48
  3. data/Rakefile +13 -11
  4. data/VERSION +1 -0
  5. data/lib/commonwatir.rb +3 -3
  6. data/lib/watir.rb +7 -6
  7. data/lib/watir/assertions.rb +44 -44
  8. data/lib/watir/browser.rb +149 -149
  9. data/lib/watir/browsers.rb +13 -12
  10. data/lib/watir/exceptions.rb +47 -47
  11. data/lib/watir/matches.rb +17 -17
  12. data/lib/watir/options.rb +53 -52
  13. data/lib/watir/testcase.rb +97 -58
  14. data/lib/watir/waiter.rb +91 -91
  15. data/unittests/attach_to_existing_window_test.rb +71 -0
  16. data/unittests/browser_test.rb +18 -0
  17. data/unittests/buttons_test.rb +224 -0
  18. data/unittests/dd_test.rb +70 -0
  19. data/unittests/dl_test.rb +68 -0
  20. data/unittests/dt_test.rb +68 -0
  21. data/unittests/element_collections_test.rb +22 -0
  22. data/unittests/em_test.rb +67 -0
  23. data/unittests/form2_test.rb +22 -0
  24. data/unittests/html/blankpage.html +12 -0
  25. data/unittests/html/buttons1.html +41 -0
  26. data/unittests/html/buttons2.html +61 -0
  27. data/unittests/html/definition_lists.html +48 -0
  28. data/unittests/html/emphasis.html +12 -0
  29. data/unittests/html/entertainment_com.html +668 -0
  30. data/unittests/html/frame_buttons.html +4 -0
  31. data/unittests/html/images/button.jpg +0 -0
  32. data/unittests/html/pass.html +10 -0
  33. data/unittests/html/phrase_elements.html +15 -0
  34. data/unittests/html/select_lists.html +18 -0
  35. data/unittests/html/utf8.html +12 -0
  36. data/unittests/html/visibility.html +90 -0
  37. data/unittests/html/watir_unit_tests.css +64 -0
  38. data/unittests/html/whitespace.html +29 -0
  39. data/unittests/inspect_test.rb +29 -0
  40. data/unittests/options.yml.example +13 -0
  41. data/unittests/select_list_test.rb +19 -0
  42. data/unittests/setup.rb +17 -0
  43. data/unittests/setup/browser.rb +14 -0
  44. data/unittests/setup/capture_io_helper.rb +17 -0
  45. data/unittests/setup/filter.rb +24 -0
  46. data/unittests/setup/lib.rb +22 -0
  47. data/unittests/setup/options.rb +29 -0
  48. data/unittests/setup/testUnitAddons.rb +8 -0
  49. data/unittests/setup/watir-unittest.rb +74 -0
  50. data/unittests/strong_test.rb +32 -0
  51. data/unittests/utf8_test.rb +24 -0
  52. data/unittests/visibility_test.rb +47 -0
  53. data/unittests/whitespace_test.rb +40 -0
  54. metadata +121 -39
  55. data/History.txt +0 -5
  56. data/Manifest.txt +0 -14
@@ -1,12 +1,13 @@
1
- # watir/browsers
2
- # Define browsers supported by Watir
3
-
4
- Watir::Browser.support :name => 'ie', :class => 'Watir::IE',
5
- :library => 'watir/ie', :gem => 'watir',
6
- :options => [:speed, :visible]
7
-
8
- Watir::Browser.support :name => 'firefox', :class => 'FireWatir::Firefox',
9
- :library => 'firewatir'
10
-
11
- Watir::Browser.support :name => 'safari', :class => 'Watir::Safari',
12
- :library => 'safariwatir'
1
+ #--
2
+ # watir/browsers
3
+ # Define browsers supported by Watir
4
+
5
+ Watir::Browser.support :name => 'ie', :class => 'Watir::IE',
6
+ :library => 'watir/ie', :gem => 'watir',
7
+ :options => [:speed, :visible]
8
+
9
+ Watir::Browser.support :name => 'firefox', :class => 'FireWatir::Firefox',
10
+ :library => 'firewatir'
11
+
12
+ Watir::Browser.support :name => 'safari', :class => 'Watir::Safari',
13
+ :library => 'safariwatir'
@@ -1,48 +1,48 @@
1
- module Watir
2
- module Exception
3
-
4
- # Root class for all Watir Exceptions
5
- class WatirException < RuntimeError
6
- def initialize(message="")
7
- super(message)
8
- end
9
- end
10
-
11
- # This exception is thrown if an attempt is made to access an object that doesn't exist
12
- class UnknownObjectException < WatirException; end
13
- # This exception is thrown if an attempt is made to access an object that is in a disabled state
14
- class ObjectDisabledException < WatirException; end
15
- # This exception is thrown if an attempt is made to access a frame that cannot be found
16
- class UnknownFrameException< WatirException; end
17
- # This exception is thrown if an attempt is made to access a form that cannot be found
18
- class UnknownFormException< WatirException; end
19
- # This exception is thrown if an attempt is made to access an object that is in a read only state
20
- class ObjectReadOnlyException < WatirException; end
21
- # This exception is thrown if an attempt is made to access an object when the specified value cannot be found
22
- class NoValueFoundException < WatirException; end
23
- # This exception gets raised if part of finding an object is missing
24
- class MissingWayOfFindingObjectException < WatirException; end
25
- # this exception is raised if an attempt is made to access a table cell that doesnt exist
26
- class UnknownCellException < WatirException; end
27
- # This exception is thrown if the window cannot be found
28
- class NoMatchingWindowFoundException < WatirException; end
29
- # This exception is thrown if an attemp is made to acces the status bar of the browser when it doesnt exist
30
- class NoStatusBarException < WatirException; end
31
- # This exception is thrown if an http error, such as a 404, 500 etc is encountered while navigating
32
- class NavigationException < WatirException; end
33
- # This exception is raised if a timeout is exceeded
34
- class TimeOutException < WatirException
35
- def initialize(duration, timeout)
36
- @duration, @timeout = duration, timeout
37
- end
38
- attr_reader :duration, :timeout
39
- end
40
-
41
- # Return an error message for when unable to locate the element
42
- def self.message_for_unable_to_locate(how, what)
43
- result = "using #{how.inspect}"
44
- result << ", #{what.inspect}" if what
45
- "Unable to locate element, #{result}"
46
- end
47
- end
1
+ module Watir
2
+ module Exception
3
+
4
+ # Root class for all Watir Exceptions
5
+ class WatirException < RuntimeError
6
+ def initialize(message="")
7
+ super(message)
8
+ end
9
+ end
10
+
11
+ # This exception is raised if an attempt is made to access an object that doesn't exist
12
+ class UnknownObjectException < WatirException; end
13
+ # This exception is raised if an attempt is made to access an object that is in a disabled state
14
+ class ObjectDisabledException < WatirException; end
15
+ # This exception is raised if an attempt is made to access a frame that cannot be found
16
+ class UnknownFrameException< WatirException; end
17
+ # This exception is raised if an attempt is made to access a form that cannot be found
18
+ class UnknownFormException< WatirException; end
19
+ # This exception is raised if an attempt is made to access an object that is in a read only state
20
+ class ObjectReadOnlyException < WatirException; end
21
+ # This exception is raised if an attempt is made to access an object when the specified value cannot be found
22
+ class NoValueFoundException < WatirException; end
23
+ # This exception gets raised if part of finding an object is missing
24
+ class MissingWayOfFindingObjectException < WatirException; end
25
+ # this exception is raised if an attempt is made to access a table cell that doesnt exist
26
+ class UnknownCellException < WatirException; end
27
+ # This exception is raised if the window cannot be found
28
+ class NoMatchingWindowFoundException < WatirException; end
29
+ # This exception is raised if an attemp is made to acces the status bar of the browser when it doesnt exist
30
+ class NoStatusBarException < WatirException; end
31
+ # This exception is raised if an http error, such as a 404, 500 etc is encountered while navigating
32
+ class NavigationException < WatirException; end
33
+ # This exception is raised if a timeout is exceeded
34
+ class TimeOutException < WatirException
35
+ def initialize(duration, timeout)
36
+ @duration, @timeout = duration, timeout
37
+ end
38
+ attr_reader :duration, :timeout
39
+ end
40
+
41
+ # Return an error message for when unable to locate the element
42
+ def self.message_for_unable_to_locate(how, what)
43
+ result = "using #{how.inspect}"
44
+ result << ", #{what.inspect}" if what
45
+ "Unable to locate element, #{result}"
46
+ end
47
+ end
48
48
  end
@@ -1,17 +1,17 @@
1
- class String
2
- def matches(x)
3
- return self == x
4
- end
5
- end
6
-
7
- class Regexp
8
- def matches(x)
9
- return self.match(x)
10
- end
11
- end
12
-
13
- class Integer
14
- def matches(x)
15
- return self == x
16
- end
17
- end
1
+ class String
2
+ def matches(x)
3
+ return self == x
4
+ end
5
+ end
6
+
7
+ class Regexp
8
+ def matches(x)
9
+ return self.match(x)
10
+ end
11
+ end
12
+
13
+ class Integer
14
+ def matches(x)
15
+ return self == x
16
+ end
17
+ end
@@ -1,52 +1,53 @@
1
- # watir/options
2
- require 'rubygems'
3
-
4
- require 'user-choices'
5
-
6
- module Watir
7
- @@options_file = nil
8
- @@options = nil
9
- class << self
10
- # Specify the location of a yaml file containing Watir options. Must be
11
- # specified before the options are parsed.
12
- def options_file= file
13
- @@options_file = file
14
- end
15
- def options_file
16
- @@options_file
17
- end
18
- def options= x
19
- @@options = x
20
- end
21
- # Return the Watir options, as a hash. If they haven't been parsed yet,
22
- # they will be now.
23
- def options
24
- @@options ||= Watir::Options.new.execute
25
- end
26
- end
27
-
28
- class Options < UserChoices::Command
29
- include UserChoices
30
- def add_sources builder
31
- builder.add_source EnvironmentSource, :with_prefix, 'watir_'
32
- if Watir.options_file
33
- builder.add_source YamlConfigFileSource, :from_complete_path,
34
- Watir.options_file
35
- end
36
- end
37
- def add_choices builder
38
- builder.add_choice :browser,
39
- :type => Watir::Browser.browser_names,
40
- :default => Watir::Browser.default
41
- builder.add_choice :speed,
42
- :type => ['slow', 'fast', 'zippy'],
43
- :default => 'fast'
44
- builder.add_choice :visible,
45
- :type => :boolean
46
- end
47
- def execute
48
- @user_choices[:speed] = @user_choices[:speed].to_sym
49
- @user_choices
50
- end
51
- end
52
- end
1
+ #--
2
+ # watir/options
3
+ require 'rubygems'
4
+
5
+ require 'user-choices'
6
+
7
+ module Watir
8
+ @@options_file = nil
9
+ @@options = nil
10
+ class << self
11
+ # Specify the location of a yaml file containing Watir options. Must be
12
+ # specified before the options are parsed.
13
+ def options_file= file
14
+ @@options_file = file
15
+ end
16
+ def options_file
17
+ @@options_file
18
+ end
19
+ def options= x
20
+ @@options = x
21
+ end
22
+ # Return the Watir options, as a hash. If they haven't been parsed yet,
23
+ # they will be now.
24
+ def options
25
+ @@options ||= Watir::Options.new.execute
26
+ end
27
+ end
28
+
29
+ class Options < UserChoices::Command
30
+ include UserChoices
31
+ def add_sources builder
32
+ builder.add_source EnvironmentSource, :with_prefix, 'watir_'
33
+ if Watir.options_file
34
+ builder.add_source YamlConfigFileSource, :from_complete_path,
35
+ Watir.options_file
36
+ end
37
+ end
38
+ def add_choices builder
39
+ builder.add_choice :browser,
40
+ :type => Watir::Browser.browser_names,
41
+ :default => Watir::Browser.default
42
+ builder.add_choice :speed,
43
+ :type => ['slow', 'fast', 'zippy'],
44
+ :default => 'fast'
45
+ builder.add_choice :visible,
46
+ :type => :boolean
47
+ end
48
+ def execute
49
+ @user_choices[:speed] = @user_choices[:speed].to_sym
50
+ @user_choices
51
+ end
52
+ end
53
+ end
@@ -1,58 +1,97 @@
1
- require 'test/unit'
2
- require 'watir/assertions'
3
-
4
- module Watir
5
-
6
- class TestCase < Test::Unit::TestCase
7
- include Watir::Assertions
8
- @@order = :sequentially
9
- def initialize name
10
- throw :invalid_test if name == :default_test && self.class == Watir::TestCase
11
- super
12
- end
13
- class << self
14
- attr_accessor :test_methods, :order
15
- def test_methods
16
- @test_methods ||= []
17
- end
18
- def order
19
- @order || @@order
20
- end
21
- def default_order= order
22
- @@order = order
23
- end
24
- def sorted_test_methods
25
- case order
26
- when :alphabetically then test_methods.sort
27
- when :sequentially then test_methods
28
- when :reversed_sequentially then test_methods.reverse
29
- when :reversed_alphabetically then test_methods.sort.reverse
30
- else raise ArgumentError, "Execute option not supported: #{@order}"
31
- end
32
- end
33
- def suite
34
- suite = Test::Unit::TestSuite.new(name)
35
- sorted_test_methods.each do |test|
36
- catch :invalid_test do
37
- suite << new(test)
38
- end
39
- end
40
- if (suite.empty?)
41
- catch :invalid_test do
42
- suite << new(:default_test)
43
- end
44
- end
45
- return suite
46
- end
47
- def method_added id
48
- name = id.id2name
49
- test_methods << name if name =~ /^test./
50
- end
51
- def execute order
52
- @order = order
53
- end
54
- end
55
- public :add_assertion
56
- end
57
-
58
- end
1
+ require 'test/unit'
2
+ require 'watir/assertions'
3
+
4
+ module Watir
5
+
6
+ # This is a 'test/unit' testcase customized to exeucte test methods sequentially by default
7
+ # and extra assertions
8
+ #
9
+ # Example Usage
10
+ #
11
+ # require 'watir/testcase'
12
+ #
13
+ # class MyTestCase < Watir::TestCase
14
+ #
15
+ # # some helpers
16
+ # @@browser = nil
17
+ # def browser
18
+ # @browser ||= Watir::IE.start(:url, 'http://watir.com/")
19
+ # end
20
+ #
21
+ # # TESTS
22
+ # def test_text
23
+ # browser.goto "http://watir.com/"
24
+ # verify_match "Web Application Testing in Ruby", browser.text
25
+ # end
26
+ #
27
+ # def test_title
28
+ # verify browser.title == 'Watir'
29
+ # end
30
+ #
31
+ # def test_link
32
+ # verify_match 'watir.com', browser.link(:text, 'Home').href
33
+ # end
34
+ #
35
+ # def test_navigate_to_examples
36
+ # browser.div(:id, 'nav').link(:text, 'Examples').click
37
+ # end
38
+ #
39
+ # def test_url
40
+ # verify_equal browser.url, 'http://watir.com/examples/'
41
+ # end
42
+ #
43
+ # end
44
+ #
45
+ class TestCase < Test::Unit::TestCase
46
+ include Watir::Assertions
47
+ @@order = :sequentially
48
+ def initialize name
49
+ throw :invalid_test if name == :default_test && self.class == Watir::TestCase
50
+ super
51
+ end
52
+ class << self
53
+ attr_accessor :test_methods, :order
54
+ def test_methods
55
+ @test_methods ||= []
56
+ end
57
+ def order
58
+ @order || @@order
59
+ end
60
+ def default_order= order
61
+ @@order = order
62
+ end
63
+ def sorted_test_methods
64
+ case order
65
+ when :alphabetically then test_methods.sort
66
+ when :sequentially then test_methods
67
+ when :reversed_sequentially then test_methods.reverse
68
+ when :reversed_alphabetically then test_methods.sort.reverse
69
+ else raise ArgumentError, "Execute option not supported: #{@order}"
70
+ end
71
+ end
72
+ def suite
73
+ suite = Test::Unit::TestSuite.new(name)
74
+ sorted_test_methods.each do |test|
75
+ catch :invalid_test do
76
+ suite << new(test)
77
+ end
78
+ end
79
+ if (suite.empty?)
80
+ catch :invalid_test do
81
+ suite << new(:default_test)
82
+ end
83
+ end
84
+ return suite
85
+ end
86
+ def method_added id
87
+ name = id.id2name
88
+ test_methods << name if name =~ /^test./
89
+ end
90
+ def execute order
91
+ @order = order
92
+ end
93
+ end
94
+ public :add_assertion
95
+ end
96
+
97
+ end
@@ -1,92 +1,92 @@
1
- require 'watir/exceptions'
2
-
3
- module Watir
4
-
5
- def wait_until(*args)
6
- Waiter.wait_until(*args) {yield}
7
- end
8
-
9
- class TimeKeeper
10
- attr_reader :sleep_time
11
- def initialize
12
- @sleep_time = 0.0
13
- end
14
- def sleep seconds
15
- @sleep_time += Kernel.sleep seconds
16
- end
17
- def now
18
- Time.now
19
- end
20
- end
21
-
22
- class Waiter
23
- # This is an interface to a TimeKeeper which proxies
24
- # calls to "sleep" and "Time.now".
25
- # Useful for unit testing Waiter.
26
- attr_accessor :timer
27
-
28
- # How long to wait between each iteration through the wait_until
29
- # loop. In seconds.
30
- attr_accessor :polling_interval
31
-
32
- # Timeout for wait_until.
33
- attr_accessor :timeout
34
-
35
- @@default_polling_interval = 0.5
36
- @@default_timeout = 60.0
37
-
38
- def initialize(timeout=@@default_timeout,
39
- polling_interval=@@default_polling_interval)
40
- @timeout = timeout
41
- @polling_interval = polling_interval
42
- @timer = TimeKeeper.new
43
- end
44
-
45
- # Execute the provided block until either (1) it returns true, or
46
- # (2) the timeout (in seconds) has been reached. If the timeout is reached,
47
- # a TimeOutException will be raised. The block will always
48
- # execute at least once.
49
- #
50
- # waiter = Waiter.new(5)
51
- # waiter.wait_until {puts 'hello'}
52
- #
53
- # This code will print out "hello" for five seconds, and then raise a
54
- # Watir::TimeOutException.
55
- def wait_until # block
56
- start_time = now
57
- until yield do
58
- if (duration = now - start_time) > @timeout
59
- raise Watir::Exception::TimeOutException.new(duration, @timeout),
60
- "Timed out after #{duration} seconds."
61
- end
62
- sleep @polling_interval
63
- end
64
- end
65
-
66
- # Execute the provided block until either (1) it returns true, or
67
- # (2) the timeout (in seconds) has been reached. If the timeout is reached,
68
- # a TimeOutException will be raised. The block will always
69
- # execute at least once.
70
- #
71
- # Waiter.wait_until(5) {puts 'hello'}
72
- #
73
- # This code will print out "hello" for five seconds, and then raise a
74
- # Watir::TimeOutException.
75
-
76
- # IDEA: wait_until: remove defaults from Waiter.wait_until
77
- def self.wait_until(timeout=@@default_timeout,
78
- polling_interval=@@default_polling_interval)
79
- waiter = new(timeout, polling_interval)
80
- waiter.wait_until { yield }
81
- end
82
-
83
- private
84
- def sleep seconds
85
- @timer.sleep seconds
86
- end
87
- def now
88
- @timer.now
89
- end
90
- end
91
-
1
+ require 'watir/exceptions'
2
+
3
+ module Watir
4
+
5
+ def wait_until(*args)
6
+ Waiter.wait_until(*args) {yield}
7
+ end
8
+
9
+ class TimeKeeper
10
+ attr_reader :sleep_time
11
+ def initialize
12
+ @sleep_time = 0.0
13
+ end
14
+ def sleep seconds
15
+ @sleep_time += Kernel.sleep seconds
16
+ end
17
+ def now
18
+ Time.now
19
+ end
20
+ end
21
+
22
+ class Waiter
23
+ # This is an interface to a TimeKeeper which proxies
24
+ # calls to "sleep" and "Time.now".
25
+ # Useful for unit testing Waiter.
26
+ attr_accessor :timer
27
+
28
+ # How long to wait between each iteration through the wait_until
29
+ # loop. In seconds.
30
+ attr_accessor :polling_interval
31
+
32
+ # Timeout for wait_until.
33
+ attr_accessor :timeout
34
+
35
+ @@default_polling_interval = 0.5
36
+ @@default_timeout = 60.0
37
+
38
+ def initialize(timeout=@@default_timeout,
39
+ polling_interval=@@default_polling_interval)
40
+ @timeout = timeout
41
+ @polling_interval = polling_interval
42
+ @timer = TimeKeeper.new
43
+ end
44
+
45
+ # Execute the provided block until either (1) it returns true, or
46
+ # (2) the timeout (in seconds) has been reached. If the timeout is reached,
47
+ # a TimeOutException will be raised. The block will always
48
+ # execute at least once.
49
+ #
50
+ # waiter = Waiter.new(5)
51
+ # waiter.wait_until {puts 'hello'}
52
+ #
53
+ # This code will print out "hello" for five seconds, and then raise a
54
+ # Watir::TimeOutException.
55
+ def wait_until # block
56
+ start_time = now
57
+ until yield do
58
+ if (duration = now - start_time) > @timeout
59
+ raise Watir::Exception::TimeOutException.new(duration, @timeout),
60
+ "Timed out after #{duration} seconds."
61
+ end
62
+ sleep @polling_interval
63
+ end
64
+ end
65
+
66
+ # Execute the provided block until either (1) it returns true, or
67
+ # (2) the timeout (in seconds) has been reached. If the timeout is reached,
68
+ # a TimeOutException will be raised. The block will always
69
+ # execute at least once.
70
+ #
71
+ # Waiter.wait_until(5) {puts 'hello'}
72
+ #
73
+ # This code will print out "hello" for five seconds, and then raise a
74
+ # Watir::TimeOutException.
75
+
76
+ # IDEA: wait_until: remove defaults from Waiter.wait_until
77
+ def self.wait_until(timeout=@@default_timeout,
78
+ polling_interval=@@default_polling_interval)
79
+ waiter = new(timeout, polling_interval)
80
+ waiter.wait_until { yield }
81
+ end
82
+
83
+ private
84
+ def sleep seconds
85
+ @timer.sleep seconds
86
+ end
87
+ def now
88
+ @timer.now
89
+ end
90
+ end
91
+
92
92
  end # module