watir-classic 3.3.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/CHANGES +17 -0
  2. data/Gemfile.lock +9 -8
  3. data/LICENSE +1 -0
  4. data/README.rdoc +6 -7
  5. data/Rakefile +3 -1
  6. data/VERSION +1 -1
  7. data/lib/watir-classic.rb +0 -5
  8. data/lib/watir-classic/browser.rb +58 -35
  9. data/lib/watir-classic/browsers.rb +1 -1
  10. data/lib/watir-classic/container.rb +39 -33
  11. data/lib/watir-classic/cookies.rb +32 -2
  12. data/lib/watir-classic/core.rb +0 -1
  13. data/lib/watir-classic/dialogs/alert.rb +12 -0
  14. data/lib/watir-classic/dialogs/file_field.rb +11 -0
  15. data/lib/watir-classic/drag_and_drop_helper.rb +14 -0
  16. data/lib/watir-classic/element.rb +292 -257
  17. data/lib/watir-classic/element_collection.rb +26 -8
  18. data/lib/watir-classic/element_extensions.rb +22 -16
  19. data/lib/watir-classic/exceptions.rb +4 -4
  20. data/lib/watir-classic/form.rb +52 -49
  21. data/lib/watir-classic/frame.rb +23 -14
  22. data/lib/watir-classic/ie-class.rb +363 -315
  23. data/lib/watir-classic/ie-process.rb +1 -0
  24. data/lib/watir-classic/ie.rb +0 -17
  25. data/lib/watir-classic/image.rb +58 -64
  26. data/lib/watir-classic/input_elements.rb +224 -219
  27. data/lib/watir-classic/link.rb +14 -15
  28. data/lib/watir-classic/locator.rb +12 -7
  29. data/lib/watir-classic/matches.rb +7 -3
  30. data/lib/watir-classic/modal_dialog.rb +38 -26
  31. data/lib/watir-classic/non_control_elements.rb +29 -0
  32. data/lib/watir-classic/options.rb +10 -15
  33. data/lib/watir-classic/page-container.rb +30 -48
  34. data/lib/watir-classic/process.rb +4 -2
  35. data/lib/watir-classic/screenshot.rb +6 -0
  36. data/lib/watir-classic/supported_elements.rb +36 -14
  37. data/lib/watir-classic/table.rb +81 -71
  38. data/lib/watir-classic/util.rb +9 -11
  39. data/lib/watir-classic/wait.rb +17 -4
  40. data/lib/watir-classic/wait_helper.rb +15 -2
  41. data/lib/watir-classic/win32.rb +2 -1
  42. data/lib/watir-classic/window.rb +35 -7
  43. data/lib/watir-classic/xpath_locator.rb +1 -0
  44. data/lib/watir-classic/yard/global_macros.rb +7 -0
  45. data/spec/frame_spec.rb +17 -0
  46. metadata +5 -7
  47. data/lib/watir-classic/close_all.rb +0 -31
  48. data/lib/watir-classic/contrib/enabled_popup.rb +0 -21
  49. data/lib/watir-classic/contrib/ie-new-process.rb +0 -27
  50. data/lib/watir-classic/contrib/page_checker.rb +0 -29
  51. data/watir.gif +0 -0
@@ -1,25 +1,23 @@
1
1
  module Watir
2
2
  class Util
3
3
  class << self
4
- #
5
- # "Watir::Span" => "Span"
6
- #
4
+
5
+ # @example
6
+ # Watir::Util.demodulize("Watir::Span") # => "Span"
7
7
  def demodulize(str)
8
8
  str.gsub(/^.*::/, '')
9
9
  end
10
10
 
11
- #
12
- # "FooBar" => "foo_bar"
13
- #
11
+ # @example
12
+ # Watir::Util.underscore("FooBar") # => "foo_bar"
14
13
  def underscore(str)
15
14
  str.gsub(/\B[A-Z][^A-Z]/, '_\&').downcase.gsub(' ', '_')
16
15
  end
17
16
 
18
- #
19
- # "Checkboxes" => "Checkbox"
20
- # "Bodies" => "Body"
21
- # "Buttons" => "Button"
22
- #
17
+ # @example
18
+ # Watir::Util.singularize("Checkboxes") # => "Checkbox"
19
+ # Watir::Util.singularize("Bodies") # => "Body"
20
+ # Watir::Util.singularize("Buttons") # => "Button"
23
21
  def singularize(str)
24
22
  case str.downcase
25
23
  when "checkboxes"
@@ -7,10 +7,16 @@ module Watir
7
7
  class TimeoutError < StandardError
8
8
  end
9
9
 
10
- #
11
10
  # Wait until the block evaluates to true or times out.
12
11
  #
13
-
12
+ # @example
13
+ # Watir::Wait.until(5) { browser.text_field.exists? }
14
+ #
15
+ # @param [Fixnum] timeout timeout to wait until block returns true.
16
+ # @yieldparam [self] instance instance of self.
17
+ # @raise [TimeoutError] when timeout exceeds.
18
+ # @see WaitHelper
19
+ # @see ElementExtensions
14
20
  def until(timeout = 60, &block)
15
21
  end_time = ::Time.now + timeout
16
22
 
@@ -23,9 +29,16 @@ module Watir
23
29
  raise TimeoutError, "timed out after #{timeout} seconds"
24
30
  end
25
31
 
26
- #
27
32
  # Wait while the block evaluates to true or times out.
28
33
  #
34
+ # @example
35
+ # Watir::Wait.while(5) { browser.text_field.exists? }
36
+ #
37
+ # @param [Fixnum] timeout timeout to wait while block returns true.
38
+ # @yieldparam [self] instance instance of self.
39
+ # @raise [TimeoutError] when timeout exceeds.
40
+ # @see WaitHelper
41
+ # @see ElementExtensions
29
42
  def while(timeout = 60, &block)
30
43
  end_time = ::Time.now + timeout
31
44
 
@@ -38,4 +51,4 @@ module Watir
38
51
  end
39
52
 
40
53
  end # Wait
41
- end # Watir
54
+ end # Watir
@@ -1,12 +1,25 @@
1
- # include this module if there's a need to have wait_until and wait_while methods in some different scope
2
1
  module Watir
3
2
  module WaitHelper
3
+ # Wait until block evaluates to true or times out.
4
+ #
5
+ # @example
6
+ # browser.wait_until(5) { browser.text_field.exists? }
7
+ #
8
+ # @see Wait
9
+ # @see ElementExtensions
4
10
  def wait_until(*args, &blk)
5
11
  Wait.until(*args, &blk)
6
12
  end
7
13
 
14
+ # Wait while block evaluates to true or times out.
15
+ #
16
+ # @example
17
+ # browser.wait_while(5) { browser.text_field.exists? }
18
+ #
19
+ # @see Wait
20
+ # @see ElementExtensions
8
21
  def wait_while(*args, &blk)
9
22
  Wait.while(*args, &blk)
10
23
  end
11
24
  end
12
- end
25
+ end
@@ -3,6 +3,7 @@ require 'dl/struct'
3
3
  require 'Win32API'
4
4
 
5
5
  module Watir
6
+ # @private
6
7
  module Win32
7
8
  # this will find the IEDialog.dll file in its build location
8
9
  @@iedialog_file = (File.expand_path(File.dirname(__FILE__) + '/..') + "/watir-classic/IEDialog/Release/IEDialog.dll").gsub('/', '\\')
@@ -37,4 +38,4 @@ module Watir
37
38
  rtn == 1
38
39
  end
39
40
  end
40
- end
41
+ end
@@ -1,11 +1,14 @@
1
1
  module Watir
2
+ # Returned by {IE#window}.
2
3
  class Window
3
4
  include ElementExtensions
4
5
 
5
6
  class << self
7
+ # @private
6
8
  attr_accessor :__main_ie
7
9
 
8
- def wrap *meths
10
+ # @private
11
+ def wrap(*meths)
9
12
  meths.each do |meth|
10
13
  define_method meth do
11
14
  result = nil
@@ -16,7 +19,7 @@ module Watir
16
19
  end
17
20
  end
18
21
 
19
- def initialize(main_browser, locators, browser=nil, &blk)
22
+ def initialize(main_browser, locators, browser=nil)
20
23
  valid_locators = [:title, :url, :hwnd, :index]
21
24
  locators.each_pair do |k, v|
22
25
  raise ArgumentError, "Valid locators are #{valid_locators.join(", ")}" unless valid_locators.include?(k)
@@ -27,14 +30,36 @@ module Watir
27
30
  @browser = browser
28
31
  end
29
32
 
33
+ # @!method url
34
+ # @return [String] url of the {Window}.
35
+ # @!method title
36
+ # @return [String] title of the {Window}.
37
+ # @!method hwnd
38
+ # @return [Fixnum] handle of the {Window}.
39
+ # @!method close
40
+ # Close the {Window}.
30
41
  wrap :url, :title, :hwnd, :close
31
42
 
43
+ # @return [Browser] browser of the window.
32
44
  def browser
33
45
  @browser ||= begin
34
46
  IE.find(@locators.keys.first, @locators.values.first)
35
47
  end
36
48
  end
37
49
 
50
+ # Use the window.
51
+ #
52
+ # @example Change current window:
53
+ # browser.window(:title => /foo/).use
54
+ # browser.title # => "foo"
55
+ #
56
+ # @example Execute code in the other window:
57
+ # browser.window(:title => /foo/).use do
58
+ # browser.title # => "foo"
59
+ # end
60
+ # browser.title # => "current window title"
61
+ #
62
+ # @yield optional block in the context of new {Window}.
38
63
  def use(&blk)
39
64
  @main_browser.ie = browser.ie
40
65
  if blk
@@ -49,20 +74,23 @@ module Watir
49
74
  self
50
75
  end
51
76
 
77
+ # @return [Boolean] true when {Window} is the active {Browser} instance,
78
+ # false otherwise
52
79
  def current?
53
80
  @main_browser.hwnd == browser.hwnd && @main_browser.html == browser.html
54
81
  end
55
82
 
83
+ # @return [Boolean] true when {Window} browser exists, false otherwise.
84
+ def present?
85
+ @browser = nil
86
+ browser && browser.exists?
87
+ end
88
+
56
89
  def ==(other)
57
90
  browser.hwnd == other.hwnd && browser.html == other.browser.html
58
91
  end
59
92
 
60
93
  alias_method :eql?, :==
61
94
 
62
- def present?
63
- @browser = nil
64
- browser && browser.exists?
65
- end
66
-
67
95
  end
68
96
  end
@@ -1,4 +1,5 @@
1
1
  module Watir
2
+ # @private
2
3
  module XpathLocator
3
4
 
4
5
  def xmlparser_document_object
@@ -0,0 +1,7 @@
1
+ # @!macro exists
2
+ # @raise [UnknownObjectException] when element does not exist.
3
+ # @raise [UnknownFrameException] when element is inside of a frame and
4
+ # that frame does not exist.
5
+
6
+ # @!macro enabled
7
+ # @raise [ObjectDisabledException] when element is disabled.
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+ require File.expand_path("watirspec/spec_helper", File.dirname(__FILE__))
3
+
4
+ describe "Frame" do
5
+ before :each do
6
+ browser.goto(WatirSpec.url_for("frames.html"))
7
+ end
8
+
9
+ it "handles clicking elements without waiting" do
10
+ browser.frame(:id, "frame_1").text_field(:name, 'senderElement').value.should == 'send_this_value'
11
+ browser.frame(:id, "frame_2").text_field(:name, 'recieverElement').value.should == 'old_value'
12
+ browser.frame(:id, "frame_1").button(:id, 'send').click_no_wait
13
+ browser.frame(:id, "frame_2").text_field(:name, 'recieverElement').value.should == 'old_value'
14
+ browser.frame(:id, "frame_2").text_field(:name => 'recieverElement', :text => 'send_this_value').wait_until_present(10).should_not raise_error(Watir::Wait::TimeoutError)
15
+ end
16
+
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watir-classic
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-27 00:00:00.000000000 Z
12
+ date: 2013-01-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: win32-process
@@ -254,11 +254,7 @@ files:
254
254
  - lib/watir-classic/IEDialog/stdafx.h
255
255
  - lib/watir-classic/browser.rb
256
256
  - lib/watir-classic/browsers.rb
257
- - lib/watir-classic/close_all.rb
258
257
  - lib/watir-classic/container.rb
259
- - lib/watir-classic/contrib/enabled_popup.rb
260
- - lib/watir-classic/contrib/ie-new-process.rb
261
- - lib/watir-classic/contrib/page_checker.rb
262
258
  - lib/watir-classic/cookies.rb
263
259
  - lib/watir-classic/core.rb
264
260
  - lib/watir-classic/dialogs/alert.rb
@@ -302,13 +298,14 @@ files:
302
298
  - lib/watir-classic/win32ole/history.txt
303
299
  - lib/watir-classic/window.rb
304
300
  - lib/watir-classic/xpath_locator.rb
301
+ - lib/watir-classic/yard/global_macros.rb
305
302
  - spec/browser_spec.rb
306
303
  - spec/element_spec.rb
304
+ - spec/frame_spec.rb
307
305
  - spec/implementation.rb
308
306
  - spec/link_spec.rb
309
307
  - spec/select_list_spec.rb
310
308
  - watir-classic.gemspec
311
- - watir.gif
312
309
  homepage: http://watir.com/
313
310
  licenses: []
314
311
  post_install_message:
@@ -337,6 +334,7 @@ summary: Automated testing tool for web applications.
337
334
  test_files:
338
335
  - spec/browser_spec.rb
339
336
  - spec/element_spec.rb
337
+ - spec/frame_spec.rb
340
338
  - spec/implementation.rb
341
339
  - spec/link_spec.rb
342
340
  - spec/select_list_spec.rb
@@ -1,31 +0,0 @@
1
- require 'watir-classic/ie'
2
-
3
- module Watir
4
- class IE
5
- # close all ie browser windows
6
- def self.close_all
7
- close_all_but nil
8
- end
9
- # find other ie browser windows and close them
10
- def close_others
11
- IE.close_all_but self
12
- end
13
- private
14
- def self.close_all_but(except=nil)
15
- Watir::IE.each do |ie|
16
- ie.close_modal
17
- ie.close unless except and except.hwnd == ie.hwnd
18
- end
19
- sleep 1.0 # replace with polling for window count to be zero?
20
- end
21
- public
22
- # close modal dialog. unlike IE#modal_dialog.close, does not wait for dialog
23
- # to appear and does not raise exception if no window is found.
24
- # returns true if modal was found and close, otherwise false
25
- def close_modal
26
- while self.modal_dialog.exists? do
27
- self.modal_dialog.close
28
- end
29
- end
30
- end
31
- end
@@ -1,21 +0,0 @@
1
- # http://www.vbcity.com/forums/topic.asp?tid=108859
2
- require 'watir-classic/ie'
3
- module Watir
4
- module PageContainer
5
- include Win32
6
- def enabled_popup(timeout=4)
7
- # Use handle of our parent window to see if we have any currently
8
- # enabled popup.
9
- hwnd_modal = 0
10
- Wait.until(timeout) do
11
- hwnd_modal, arr = GetWindow.call(hwnd, GW_ENABLEDPOPUP)
12
- hwnd_modal > 0
13
- end
14
- # use hwnd() method to find the IE or Container hwnd (overriden by IE)
15
- if hwnd_modal == hwnd() || 0 == hwnd_modal
16
- hwnd_modal = nil
17
- end
18
- hwnd_modal
19
- end
20
- end
21
- end
@@ -1,27 +0,0 @@
1
- # based on http://svn.instiki.org/instiki/trunk/test/watir/e2e.rb
2
- # and http://rubyforge.org/pipermail/wtr-general/2005-November/004108.html
3
-
4
- require 'watir-classic/ie-process'
5
-
6
- class IEProcess < Watir::IE::Process
7
- def stop
8
- right_to_terminate_process = 1
9
- handle = Win32API.new('kernel32.dll', 'OpenProcess', 'lil', 'l').
10
- call(right_to_terminate_process, 0, @process_id)
11
- Win32API.new('kernel32.dll', 'TerminateProcess', 'll', 'l').call(handle, 0)
12
- end
13
-
14
- end
15
-
16
- module Watir
17
- class IE
18
- def process_id
19
- @process_id ||= IEProcess.process_id_from_hwnd @ie.hwnd
20
- end
21
- attr_writer :process_id
22
- def kill
23
- iep = IEProcess.new process_id
24
- iep.stop
25
- end
26
- end
27
- end
@@ -1,29 +0,0 @@
1
- # This module includes checkers which are run on every page load
2
- #
3
- # In order to use this module, add a require to one of your test scripts:
4
- # require 'watir-classic/contrib/page_checker'
5
- # To add checkers, call the ie.add_checker method
6
- #
7
- # ie.add_checker(PageCheckers::NAVIGATION_CHECKER)
8
- #
9
- # Checkers are Ruby proc objects which are called within Watir::IE and passed
10
- # the current instance of ie.
11
-
12
- module PageCheckers
13
-
14
- # This checker iterates through the current document including any frames
15
- # and checks for http errors, 404, 500 etc
16
- NAVIGATION_CHECKER = lambda do |ie|
17
- if ie.document.frames.length > 1
18
- 1.upto ie.document.frames.length do |i|
19
- begin
20
- ie.frame(:index, i).check_for_http_error
21
- rescue Watir::Exception::UnknownFrameException
22
- # frame can be already destroyed
23
- end
24
- end
25
- else
26
- ie.check_for_http_error
27
- end
28
- end
29
- end
data/watir.gif DELETED
Binary file