watir 3.0.0.rc2 → 3.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/CHANGES +19 -0
  2. data/VERSION +1 -1
  3. data/lib/watir/close_all.rb +2 -2
  4. data/lib/watir/container.rb +6 -4
  5. data/lib/watir/cookies.rb +80 -0
  6. data/lib/watir/core.rb +7 -3
  7. data/lib/watir/dialogs/file_field.rb +0 -4
  8. data/lib/watir/drag_and_drop_helper.rb +68 -0
  9. data/lib/watir/element.rb +58 -156
  10. data/lib/watir/element_collection.rb +109 -0
  11. data/lib/watir/form.rb +7 -14
  12. data/lib/watir/frame.rb +11 -26
  13. data/lib/watir/ie-class.rb +17 -307
  14. data/lib/watir/ie.rb +0 -9
  15. data/lib/watir/image.rb +8 -25
  16. data/lib/watir/input_elements.rb +32 -81
  17. data/lib/watir/link.rb +2 -17
  18. data/lib/watir/locator.rb +29 -25
  19. data/lib/watir/modal_dialog.rb +26 -40
  20. data/lib/watir/non_control_elements.rb +111 -79
  21. data/lib/watir/page-container.rb +12 -1
  22. data/lib/watir/supported_elements.rb +172 -0
  23. data/lib/watir/table.rb +61 -89
  24. data/lib/watir/win32ole.rb +2 -3
  25. data/lib/watir/win32ole/1.9.3/win32ole.so +0 -0
  26. data/lib/watir/xpath_locator.rb +52 -0
  27. data/rakefile.rb +1 -1
  28. data/unittests/checkbox_test.rb +22 -32
  29. data/unittests/css_selector_test.rb +1 -6
  30. data/unittests/css_test.rb +1 -4
  31. data/unittests/div_test.rb +3 -21
  32. data/unittests/document_standards.rb +0 -4
  33. data/unittests/element_collections_test.rb +2 -2
  34. data/unittests/element_test.rb +1 -1
  35. data/unittests/form_test.rb +0 -30
  36. data/unittests/frame_test.rb +8 -49
  37. data/unittests/ie_test.rb +5 -9
  38. data/unittests/images_test.rb +6 -6
  39. data/unittests/index_specifier_test.rb +0 -1
  40. data/unittests/js_events_test.rb +1 -1
  41. data/unittests/links_multi_test.rb +0 -14
  42. data/unittests/links_test.rb +8 -51
  43. data/unittests/lists_test.rb +0 -9
  44. data/unittests/navigate_test.rb +1 -1
  45. data/unittests/nbsp_xpath_test.rb +1 -1
  46. data/unittests/no_wait_test.rb +3 -3
  47. data/unittests/parent_child_test.rb +0 -17
  48. data/unittests/pre_test.rb +0 -3
  49. data/unittests/radios_test.rb +31 -42
  50. data/unittests/selectbox_test.rb +18 -21
  51. data/unittests/selectbox_xpath_test.rb +11 -26
  52. data/unittests/table_test.rb +14 -79
  53. data/unittests/textfields_test.rb +8 -47
  54. data/unittests/windows/attach_to_new_window_test.rb +0 -8
  55. data/unittests/windows/frame_links_test.rb +5 -5
  56. data/unittests/windows/ie-each_test.rb +1 -1
  57. data/unittests/windows/modal_dialog_test.rb +2 -2
  58. data/watir.gemspec +3 -3
  59. metadata +81 -126
  60. data/lib/watir/camel_case.rb +0 -67
  61. data/lib/watir/collections.rb +0 -48
  62. data/lib/watir/cookiemanager.rb +0 -56
  63. data/lib/watir/element_collections.rb +0 -81
  64. data/lib/watir/html_element.rb +0 -30
  65. data/unittests/defer_test.rb +0 -47
  66. data/unittests/multiple_specifiers_test.rb +0 -29
  67. data/unittests/table_and_tablerow_to_a_test.rb +0 -117
  68. data/unittests/windows/iedialog_test.rb +0 -53
@@ -1,48 +0,0 @@
1
- module Watir
2
- class InputElementCollections < ElementCollections
3
- def each
4
- @container.locator_for(InputElementLocator, element_class::INPUT_TYPES, @how, @what, element_class).each {|element| yield element}
5
- end
6
- end
7
-
8
- class HTMLElements < ElementCollections
9
- def each
10
- @container.locator_for(TaggedElementLocator, ["*"], @how, @what, Element).each { |element| yield element }
11
- end
12
- end
13
-
14
- # this class accesses the check boxes in the document as a collection
15
- # Normally a user would not need to create this object as it is returned by the Watir::Container#checkboxes method
16
- class CheckBoxes < InputElementCollections
17
- def element_class; CheckBox; end
18
- end
19
-
20
- # this class accesses the select boxes in the document as a collection
21
- # Normally a user would not need to create this object as it is returned by the Watir::Container#select_lists method
22
- class SelectLists < InputElementCollections
23
- def element_tag; 'SELECT'; end
24
- end
25
-
26
- %w[Button FileField Radio TextField TextArea Hidden].each do |element|
27
- module_eval %Q{
28
- class #{element}s < InputElementCollections; end
29
- }
30
- end
31
-
32
- class Inses < ElementCollections
33
- def element_class; Ins; end
34
- end
35
-
36
- class TableSectionCollection < ElementCollections
37
- def element_class; TableSection; end
38
- end
39
-
40
- %w[Form Frame Link Li Map Area Image Table TableRow TableCell TableHeader TableFooter TableBody
41
- Label Pre P Span Div Dl Dt Dd Strong Em Del
42
- Font H1 H2 H3 H4 H5 H6 Meta Ol Ul FieldSet Option].each do |element|
43
- module_eval %Q{
44
- class #{element}s < ElementCollections; end
45
- }
46
- end
47
-
48
- end
@@ -1,56 +0,0 @@
1
- # should be moved to watir/contrib
2
- # use of modules here is ugly
3
-
4
- require 'find'
5
- module Watir
6
- module CookieManager
7
-
8
- class Dir
9
- def Dir.visit(dir = '.', files_first = false, &block)
10
- if files_first
11
- paths = []
12
- Find.find(dir) { |path| paths << path }
13
- paths.reverse_each {|path| yield path}
14
- else
15
- Find.find(dir, &block)
16
- end
17
- end
18
- # simulates unix rm -rf command
19
- def Dir.rm_rf(dir)
20
- Dir.visit(dir, true) do |path|
21
- if FileTest.directory?(path)
22
- begin
23
- Dir.unlink(path)
24
- rescue # Security Exception for Content.IE
25
- end
26
- else
27
- begin
28
- File.unlink(path)
29
- rescue #Security exception index.dat etc.
30
- end
31
- end
32
- end
33
- end
34
- end
35
-
36
- class WatirHelper
37
- #taken from shlObj.h used in win32 SHGetSpecialFolderLocation
38
- #define CSIDL_INTERNET_CACHE 0x0020
39
- #define CSIDL_COOKIES 0x0021
40
- #define CSIDL_HISTORY 0x0022
41
- COOKIES = 0x0021
42
- INTERNET_CACHE = 0x0020
43
-
44
- def WatirHelper.getSpecialFolderLocation(specFolderName)
45
- shell = WIN32OLE.new('Shell.Application')
46
- folder = shell.Namespace(specFolderName)
47
- folderItem = folder.Self
48
- folderPath = folderItem.Path
49
- end
50
- def WatirHelper.deleteSpecialFolderContents(specFolderName)
51
- Dir.rm_rf(self.getSpecialFolderLocation(specFolderName))
52
- end
53
-
54
- end
55
- end
56
- end
@@ -1,81 +0,0 @@
1
- module Watir
2
- # this class is the super class for the iterator classes (buttons, links, spans etc
3
- # it would normally only be accessed by the iterator methods (spans, links etc) of IE
4
- class ElementCollections
5
- include Enumerable
6
-
7
- # Super class for all the iterator classes
8
- # * container - an instance of an IE object
9
- def initialize(container, how, what)
10
- if how == :index || (how.is_a?(Hash) && how[:index])
11
- _how = what ? "#{how.inspect}, #{what.inspect}" : "#{how.inspect}"
12
- raise Exception::MissingWayOfFindingObjectException,
13
- "#{self.class} does not support attribute :index in #{_how}"
14
- end
15
-
16
- @container = container
17
- @how = how
18
- @what = what
19
- @length = length
20
- @page_container = container.page_container
21
- end
22
-
23
- def length
24
- count = 0
25
- each {|element| count += 1 }
26
- count
27
- end
28
-
29
- alias_method :size, :length
30
-
31
- # iterate through each of the elements in the collection in turn
32
- def each
33
- @container.locator_for(TaggedElementLocator, element_tags, @how, @what, element_class).each {|element| yield element}
34
- end
35
-
36
- # allows access to a specific item in the collection
37
- def [](n)
38
- number = n - Watir::IE.base_index
39
- offset = Watir::IE.zero_based_indexing ? (length - 1) : length
40
- iterator_object(number) || element_class.new(@container, :index, n)
41
- end
42
-
43
- def first
44
- iterator_object(0)
45
- end
46
-
47
- def last
48
- iterator_object(length - 1)
49
- end
50
-
51
- def to_s
52
- map { |e| e.to_s }.join("\n")
53
- end
54
-
55
- def inspect
56
- '#<%s:0x%x length=%s container=%s>' % [self.class, hash*2, @length.inspect, @container.inspect]
57
- end
58
-
59
- private
60
-
61
- def iterator_object(i)
62
- count = 0
63
- each do |e|
64
- return e if (i >= 0 && count == i) || (i < 0 && count == length + i)
65
- count += 1
66
- end
67
- end
68
-
69
- def element_class
70
- Watir.const_get self.class.name.split("::").last.chop
71
- end
72
-
73
- def element_tags
74
- tags = @how.is_a?(Hash) && @how[:tag_name] ? [@how[:tag_name].upcase] :
75
- element_class.const_defined?(:TAG) ? [element_class::TAG] :
76
- element_class.const_defined?(:TAGS) ? element_class::TAGS :
77
- [element_class.name.split("::").last.upcase]
78
- tags
79
- end
80
- end
81
- end
@@ -1,30 +0,0 @@
1
- # This is a generic HTML Element that is used to
2
- # locate all elements that share an attribute. The
3
- # most common example would be finding elements that
4
- # all share the same class.
5
- module Watir
6
- class HTMLElement < Element
7
- TAG = "*"
8
-
9
- def initialize(container, how, what)
10
- set_container container
11
- @how = how
12
- @what = what
13
- if how == :index
14
- raise MissingWayOfFindingObjectException,
15
- "#{self.class} does not support attribute #{@how}"
16
- end
17
- super nil
18
- end
19
-
20
- Watir::Container.module_eval do
21
- def element(how={}, what=nil)
22
- HTMLElement.new(self, how, what)
23
- end
24
-
25
- def elements(how={}, what=nil)
26
- HTMLElements.new(self, how, what)
27
- end
28
- end
29
- end
30
- end
@@ -1,47 +0,0 @@
1
- # tests of deferring when a Watir object is bound to a com object (lazy evaluation)
2
-
3
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') unless $SETUP_LOADED
4
- require 'unittests/setup'
5
-
6
- class TC_Defer < Test::Unit::TestCase
7
- def teardown
8
- @new_browser.close if defined?(@new_browser)
9
- browser.goto('about:blank')
10
- end
11
- tag_method :test_binding_to_newly_loaded_page, :fails_on_firefox, :fails_on_ie, :attach
12
- def test_binding_to_newly_loaded_page
13
- @new_browser = Watir::Browser.new
14
- text_field = @new_browser.text_field(:name, 'text1')
15
- button = @new_browser.button(:value, 'Clear Events Box')
16
- div = @new_browser.div(:name, 'divvy')
17
- @new_browser.goto($htmlRoot + "textfields1.html")
18
- assert_equal('Hello World', text_field.value)
19
- assert_equal('Clear Events Box', button.value)
20
- assert_equal('Div Text', div.text)
21
- end
22
- tag_method :test_binding_to_refreshed_page, :fails_on_ie
23
- def test_binding_to_refreshed_page
24
- goto_page "textfields1.html"
25
- text_field = browser.text_field(:name, 'text1')
26
- button = browser.button(:value, 'Clear Events Box')
27
- div = browser.div(:name, 'divvy')
28
- browser.refresh
29
- assert_equal('Hello World', text_field.value)
30
- assert(text_field.enabled?)
31
- assert_equal('Clear Events Box', button.value)
32
- assert_equal('Div Text', div.text)
33
- end
34
- tag_method :test_exists, :fails_on_firefox, :fails_on_ie, :attach
35
- def test_exists
36
- @new_browser = Watir::Browser.new
37
- text_field = @new_browser.text_field(:name, 'text1')
38
- button = @new_browser.button(:value, 'Clear Events Box')
39
- div = @new_browser.div(:name, 'divvy')
40
- assert_false(text_field.exists?)
41
- assert_false(button.exists?)
42
- @new_browser.goto($htmlRoot + "textfields1.html")
43
- assert(text_field.exists?)
44
- assert(button.exists?)
45
- assert(div.exists?)
46
- end
47
- end
@@ -1,29 +0,0 @@
1
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') unless $SETUP_LOADED
2
- require 'unittests/setup'
3
-
4
- class TC_MultipleSpecifiers < Test::Unit::TestCase
5
- include Watir::Exception
6
-
7
- def setup
8
- goto_page "multiple_specifiers.html"
9
- end
10
-
11
- %w[form table cell row button file_field text_field
12
- hidden select_list checkbox radio link image element div].each do |element|
13
- class_eval %Q{
14
- def test_#{element}
15
- assert "one", browser.#{element}(:name => "test#{element}", :class => "one").class_name
16
- assert "two", browser.#{element}(:name => "test#{element}", :class => "two").class_name
17
- assert_raises(UnknownObjectException) {browser.#{element}(:name => "nonexistent", :class => "one").class_name}
18
- end
19
- }
20
- end
21
-
22
- def test_frame
23
- goto_page "frame_buttons.html"
24
- assert "buttons1.html", browser.frame(:name => /buttonFrame/, :src => "buttons1.html").src
25
- assert "blankpage.html", browser.frame(:name => /buttonFrame/, :src => "blankpage.html").src
26
- assert_raises(UnknownObjectException) {browser.frame(:name => "nonexistent", :src => "buttons1.html").src}
27
- end
28
-
29
- end
@@ -1,117 +0,0 @@
1
- # feature tests for Watir::Table#to_a and Watir::TableRow#to_a
2
-
3
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') unless $SETUP_LOADED
4
- require 'unittests/setup'
5
-
6
- class TC_Table_TableRow_to_a < Test::Unit::TestCase
7
-
8
- def setup
9
- goto_page "table_and_tablerow_to_a.html"
10
- end
11
-
12
- def test_table_to_a_works_with_regular_table
13
- expected_table = [
14
- ["1", "2", "3"],
15
- ["4", "5", "6"],
16
- ["7", "8", "9"]
17
- ]
18
- assert_equal(expected_table, browser.table(:id => "normal").to_a)
19
- end
20
-
21
- def test_table_to_a_works_with_table_with_headers
22
- expected_table = [
23
- ["1", "2", "3", "4"],
24
- ["5", "6", "7", "8"],
25
- ["9", "10", "11", "12"]
26
- ]
27
- assert_equal(expected_table, browser.table(:id => "headers").to_a)
28
- end
29
-
30
- def test_table_to_a_works_with_nested_tables
31
- expected_table =
32
- [
33
- ["1", "2"],
34
- [[["11", "12"],
35
- ["13", "14"]], "3"]
36
- ]
37
- assert_equal(expected_table, browser.table(:id => "nested").to_a(2))
38
- end
39
-
40
- def test_table_to_a_works_with_nested_table_with_non_direct_child
41
- expected_table =
42
- [
43
- ["1", "2"],
44
- [[["11", "12"],
45
- ["13", "14"]], "3"]
46
- ]
47
-
48
- assert_equal(expected_table, browser.table(:id => "nestednondirectchild").to_a(2))
49
- end
50
-
51
- def test_table_to_a_works_with_deep_nested_tables
52
- expected_table =
53
- [
54
- ["1", "2"],
55
- [[["11", "12"],
56
- [[["404", "405"],
57
- ["406", "407"]], "14"]], "3"]
58
- ]
59
- assert_equal(expected_table, browser.table(:id => "deepnested").to_a(3))
60
- end
61
-
62
- def test_table_to_a_works_with_colspan
63
- expected_table =
64
- [
65
- ["1", "2"],
66
- ["3"]
67
- ]
68
- assert_equal(expected_table, browser.table(:id => "colspan").to_a)
69
- end
70
-
71
- def test_table_to_a_works_with_rowspan
72
- expected_table =
73
- [
74
- ["1", "2"],
75
- ["3", "4"],
76
- ["5"]
77
- ]
78
- assert_equal(expected_table, browser.table(:id => "rowspan").to_a)
79
- end
80
-
81
- def test_tablerow_to_a_works_with_regular_row
82
- first_row = browser.table(:id => "normal")[0]
83
- assert_equal(["1", "2", "3"], first_row.to_a)
84
- end
85
-
86
- def test_tablerow_to_a_works_with_headers_in_row
87
- first_row = browser.table(:id => "headers")[0]
88
- assert_equal(["1", "2", "3", "4"], first_row.to_a)
89
- end
90
-
91
- def test_tablerow_to_a_works_with_nested_tables
92
- second_row = browser.table(:id => "nested")[1]
93
- assert_equal([[["11", "12"], ["13", "14"]], "3"], second_row.to_a(2))
94
- end
95
-
96
- def test_tablerow_to_a_works_with_deep_nested_tables
97
- second_row = browser.table(:id => "deepnested")[1]
98
- expected_row = [[["11", "12"],
99
- [[["404", "405"], ["406", "407"]], "14"]], "3"]
100
- assert_equal(expected_row, second_row.to_a(3))
101
- end
102
-
103
- def test_tablerow_to_a_works_with_colspan
104
- second_row = browser.table(:id => "colspan")[1]
105
- assert_equal(["3"], second_row.to_a)
106
- end
107
-
108
- def test_tablerow_to_a_works_with_rowspan
109
- t = browser.table(:id => "rowspan")
110
- second_row = t[1]
111
- assert_equal(["3", "4"], second_row.to_a)
112
-
113
- third_row = t[2]
114
- assert_equal(["5"], third_row.to_a)
115
- end
116
- end
117
-
@@ -1,53 +0,0 @@
1
- # unit tests for iedialog.dll and customized win32ole.so
2
-
3
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..') unless $SETUP_LOADED
4
- require 'unittests/setup'
5
- require 'Win32API'
6
-
7
- class TC_IEDialog < Test::Unit::TestCase
8
- include Watir
9
-
10
- # this will find the IEDialog.dll file in its build location
11
- @@iedialog_file = (File.expand_path(File.dirname(__FILE__)) + "/../../lib/watir/IEDialog/Release/IEDialog.dll").gsub('/', '\\')
12
-
13
- # commented out because it currently requires a manual click
14
- # a better idea would be to automate the click...
15
- def xtest_connect_to_iedialog
16
- # make sure we can connect to the IEDialog.dll
17
- fnShowString = Win32API.new(@@iedialog_file, 'ShowString', ['p'], 'v')
18
- fnShowString.call("from ruby!") # blocks
19
- end
20
-
21
- def test_find_window
22
- goto_page "pass.html"
23
- fnFindWindow = Win32API.new('user32.dll', 'FindWindow', ['p', 'p'], 'l')
24
- hwnd = fnFindWindow.call(nil, "Pass Page - Microsoft Internet Explorer")
25
- assert(hwnd != 0)
26
- end
27
-
28
- def test_all
29
- goto_page "pass.html"
30
-
31
- fnFindWindow = Win32API.new('user32.dll', 'FindWindow', ['p', 'p'], 'l')
32
- hwnd = fnFindWindow.call(nil, "Pass Page - Microsoft Internet Explorer")
33
-
34
- fnGetUnknown = Win32API.new(@@iedialog_file, 'GetUnknown', ['l', 'p'], 'v')
35
- intPointer = " " * 4 # will contain the int value of the IUnknown*
36
- fnGetUnknown.call(hwnd, intPointer)
37
-
38
- intArray = intPointer.unpack('L')
39
- intUnknown = intArray.first
40
-
41
- assert(intUnknown > 0)
42
-
43
- htmlDoc = nil
44
- assert_nothing_raised{htmlDoc = WIN32OLE.connect_unknown(intUnknown)}
45
- scriptEngine = htmlDoc.Script
46
-
47
- # now we get the HTML DOM object!
48
- doc2 = scriptEngine.document
49
- body = doc2.body
50
- assert_match(/^PASS/, body.innerHTML.strip)
51
- end
52
- end
53
-