watigiri 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: '0573759dcdc508e0d1445e64121d8dff494644d5'
4
- data.tar.gz: 0d6a2fd88afc9a12c41feae7734a48f481fba322
3
+ metadata.gz: da263e5f7d120b61e288323b90693c26727443db
4
+ data.tar.gz: 269323c23f8984029d65ab06111ca5ad229592cf
5
5
  SHA512:
6
- metadata.gz: 7163363a5f37d845a95afa02321fbf1c4a744cd047688cf006f0de0a9e2bf336fd8e633070b46cb50768606d34521bf3fdcebb19cde3d950da379617345473a0
7
- data.tar.gz: 3655a22870d163bc7d93bd691127cec5eab639f4173e5559d977dc83dbee68b6c996c0b3af6d91da7d12d02ac6cd87a3c8f1bb87521fbe2bf319937319a37201
6
+ metadata.gz: f556b15ed2568fc2522ae72d0cbf661d3c72968675a1ac74709c234a74dcea78d53e95798c0c624aa4cacd1a5e428365f46aa2fd31318307689387e836089889
7
+ data.tar.gz: 4841c01d4994f8b1994ce634d6162b6341cb77dc69126aa9589aa267e3ad575568c29ded15732a9308c77cbb1f75badbddc87b4122b0bf2c2b3d22527d20734b
@@ -1,39 +1,36 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3.7
2
+ TargetRubyVersion: 2.3.8
3
+
4
+ #
5
+ # Default Preferences
6
+ #
3
7
 
4
- # Cop supports --auto-correct.
5
- # Configuration parameters: EnforcedStyle.
6
- # SupportedStyles: when_needed, always, never
7
8
  Style/FrozenStringLiteralComment:
8
9
  Enabled: false
9
10
 
10
- # Cop supports --auto-correct.
11
- # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces.
12
- # SupportedStyles: space, no_space, compact
13
- # SupportedStylesForEmptyBraces: space, no_space
14
11
  Layout/SpaceInsideHashLiteralBraces:
15
12
  EnforcedStyle: no_space
16
13
 
17
14
  Style/CommentedKeyword:
18
15
  Enabled: false
19
16
 
20
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
21
- # URISchemes: http, https
22
17
  Metrics/LineLength:
23
18
  Max: 120
24
19
 
25
- # Configuration parameters: CountComments, ExcludedMethods.
26
- # ExcludedMethods: refine
20
+ Style/Documentation:
21
+ Enabled: false
22
+
27
23
  Metrics/BlockLength:
28
24
  Exclude:
29
25
  - 'spec/**/*'
30
26
 
31
- Style/Documentation:
32
- Enabled: false
27
+ #
28
+ # Adjustable Parameters
29
+ #
33
30
 
34
- # Configuration parameters: CountComments.
35
- Metrics/MethodLength:
36
- Max: 13
31
+ Metrics/AbcSize:
32
+ Exclude:
33
+ - 'spec/locator_spec_helper.rb'
37
34
 
38
- Metrics/CyclomaticComplexity:
39
- Max: 10
35
+ Metrics/MethodLength:
36
+ Max: 11
data/Gemfile CHANGED
@@ -2,5 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
+ gem 'watir', path: File.expand_path('../watir/') if ENV['LOCAL_WATIR']
6
+
5
7
  # Specify your gem's dependencies in watigiri.gemspec
6
8
  gemspec
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Watigiri
2
2
 
3
- Watigiri is an add-on to Watir that attempts to make it seamless for actions to be taken using Nokogiri
3
+ Watigiri is an extension gem to Watir that attempts to make it seamless for actions to be taken using Nokogiri
4
4
  instead of Selenium in the places it makes sense to do so.
5
5
 
6
6
  The advantage of Nokogiri is that it parses the DOM very quickly. This provides two primary opportunities for speeding
@@ -11,8 +11,8 @@ The advantage of Nokogiri is that it parses the DOM very quickly. This provides
11
11
  dozen wire calls to locate and obtain text information from each, you can make one wire call to obtain the DOM and then
12
12
  quickly locate and obtain all of the information necessary at each element location.
13
13
 
14
- 2. Iterating over a collection of elements. One of the times this happens is when locating elements using Regular
15
- Expressions. Watir implements this by locating a subset of elements that might match and then making wire calls
14
+ 2. Iterating over a collection of elements to match a regular expression.
15
+ Watir implements this by locating a subset of elements that might match and then making wire calls
16
16
  on each to check if they actually match the provided regular expression.
17
17
  If the number of elements to be checked is large, using Nokogiri can show a significant performance improvement.
18
18
 
@@ -40,10 +40,13 @@ require 'watigiri'
40
40
  ```
41
41
 
42
42
  Once required, Watigiri will automatically speed up the location of elements using regular expression values.
43
+ If you would like to turn this feature off, you can set: `Watigiri.match_regexp = false`
43
44
 
44
45
  To speed up the gathering of text values, use the text-bang method (`Element#text!` instead of `Element#text`).
45
- Watigiri flushes the cached DOM whenever a user takes an action that might have changed the DOM (clicks, navigations, etc).
46
- So the performance improvement will come with the number of successive calls of `#text!` before taking other actions.
46
+ Watigiri flushes the cached DOM whenever a user takes an action that might have changed the DOM
47
+ (clicks, navigations, etc).
48
+ So the performance improvement will be based on the number of successive calls of `#text!`
49
+ before taking other actions.
47
50
 
48
51
  ## Contributing
49
52
 
@@ -19,16 +19,6 @@ module Watir
19
19
  after_hooks.delete(@reset_doc_hook)
20
20
  end
21
21
 
22
- #
23
- # Uses Nokogiri to return the text of page body.
24
- #
25
- # @return [String]
26
- #
27
-
28
- def text!
29
- body.text!
30
- end
31
-
32
22
  def locator_namespace
33
23
  @locator_namespace ||= Watigiri::Locators
34
24
  end
@@ -10,7 +10,7 @@ module Watir
10
10
  @doc = html
11
11
  return if html.nil?
12
12
 
13
- @reset_doc_hook = ->(element) { element.reset_doc }
13
+ @reset_doc_hook = ->(*) { reset_doc }
14
14
  browser.after_hooks.add(@reset_doc_hook)
15
15
  end
16
16
 
@@ -19,8 +19,6 @@ module Watir
19
19
  browser.after_hooks.delete(@reset_doc_hook)
20
20
  end
21
21
 
22
- #
23
- # TODO - reimplement with Watir Executor when available
24
22
  #
25
23
  # Uses Nokogiri to return the text of the element.
26
24
  #
@@ -28,7 +26,7 @@ module Watir
28
26
  #
29
27
 
30
28
  def text!
31
- @selector[:nokogiri] = true
29
+ selector_builder.built[:nokogiri] = true
32
30
  text.strip
33
31
  end
34
32
 
@@ -3,7 +3,18 @@ require 'nokogiri'
3
3
 
4
4
  require 'extensions/watir/browser'
5
5
  require 'extensions/watir/element'
6
- require 'extensions/watir/iframe'
7
6
 
8
7
  require 'watigiri/locators/element/locator'
9
- require 'watigiri/locators/element/selector_builder'
8
+ require 'watigiri/locators/element/matcher'
9
+
10
+ module Watigiri
11
+ @match_regexp = true
12
+
13
+ class << self
14
+ attr_writer :match_regexp
15
+
16
+ def match_regexp?
17
+ @match_regexp
18
+ end
19
+ end
20
+ end
@@ -1,192 +1,98 @@
1
1
  module Watigiri
2
- class Element
3
- attr_reader :element, :selector
4
-
5
- def initialize(element:, selector:)
6
- @element = element
7
- @selector = selector
8
- end
2
+ module Locators
3
+ class Element
4
+ class Locator < Watir::Locators::Element::Locator
5
+ private
9
6
 
10
- def tag_name
11
- element.name.downcase
12
- end
13
- end
7
+ def matching_elements
8
+ return super unless use_nokogiri?
14
9
 
15
- module Locators
16
- module LocatorHelpers
17
- def locate
18
- @nokogiri = @selector.delete(:nokogiri)
19
- return super unless @nokogiri || regex?
20
-
21
- set_nokogiri
22
-
23
- element = using_watir(:first)
24
- return if element.nil?
25
- @nokogiri ? element.element : nokogiri_to_selenium(element)
26
- rescue Selenium::WebDriver::Error::NoSuchElementError, Selenium::WebDriver::Error::StaleElementReferenceError
27
- nil
28
- end
10
+ # Element should be using `#fragment` instead of `#inner_html`, but can't because of
11
+ # https://github.com/sparklemotion/nokogiri/issues/572
12
+ command = locator_scope.is_a?(Watir::Browser) ? :html : :inner_html
29
13
 
30
- def locate_all
31
- @nokogiri = @selector.delete(:nokogiri)
32
- return super unless @nokogiri || regex?
14
+ args = wd_locator.to_a.flatten
15
+ args[0] = "at_#{args[0]}" unless match_regexp?
33
16
 
34
- set_nokogiri
17
+ result = populate_doc command, *args
18
+ match_regexp? ? filter_elements(result) : result
19
+ end
35
20
 
36
- elements = using_watir(:all)
37
- @nokogiri ? elements.map(&:element) : elements.map { |el| nokogiri_to_selenium(el) }
38
- end
21
+ def filter_elements(elements)
22
+ element_matcher.nokogiri = true
23
+ found = [element_matcher.match(elements, match_values, @filter)].flatten.compact
39
24
 
40
- # Is only used when there is no regex, index or visibility locators
41
- def locate_element(how, what, _driver_scope = @query_scope.wd)
42
- return super unless @nokogiri
25
+ se_elements = nokogiri_to_selenium(elements, found)
26
+ @filter == :first ? se_elements.first : se_elements
27
+ end
43
28
 
44
- el = @query_scope.doc.send("at_#{how}", what)
45
- Watigiri::Element.new element: el, selector: {how => what}
46
- end
29
+ def use_nokogiri?
30
+ @nokogiri = @built.delete(:nokogiri)
47
31
 
48
- # "how" can only be :css or :xpath
49
- def locate_elements(how, what, _scope = @query_scope.wd)
50
- return super unless @nokogiri || regex?
32
+ # Neither CSS nor XPath locator found
33
+ return false if wd_locator.empty? || @selector.key?(:adjacent)
51
34
 
52
- @query_scope.doc.send(how, what).map do |el|
53
- Watigiri::Element.new element: el, selector: {how => what}
35
+ @nokogiri && match_values.empty? || match_regexp?
54
36
  end
55
- end
56
37
 
57
- def fetch_value(element, how)
58
- noko_element = noko_element(element)
59
- return super if noko_element.nil?
60
-
61
- case how
62
- when :text
63
- noko_element.inner_text
64
- when :tag_name
65
- noko_element.name.downcase
66
- else
67
- noko_element.attribute(how.to_s.tr('_', '-')).to_s.strip
38
+ def populate_doc(command, key, value)
39
+ @query_scope.doc ||= Nokogiri::HTML(locator_scope.send(command)).tap { |d| d.css('script').remove }
40
+ @query_scope.doc.send(key, value)
68
41
  end
69
- end
70
-
71
- def nokogiri_to_selenium(element)
72
- return element if element.is_a?(Selenium::WebDriver::Element)
73
- tag = element.tag_name
74
- index = @query_scope.doc.xpath(".//#{tag}").find_index { |el| el == element.element }
75
- Watir::Element.new(@query_scope, index: index, tag_name: tag).wd
76
- end
77
42
 
78
- def regex?
79
- return @regex unless @regex.nil?
43
+ def wd_locator
44
+ @wd_locator ||= @built.select { |k, _v| %i[css xpath].include?(k) }
45
+ end
80
46
 
81
- return false unless (@selector.keys & %i[adjacent visible label text visible_text visible_label]).empty?
82
- @regex = @selector.values.any? { |v| v.is_a?(Regexp) }
83
- end
47
+ def match_regexp?
48
+ @match_regexp ||= Watigiri.match_regexp? && match_values.all? do |k, v|
49
+ v.is_a?(Regexp) && !k.to_s.include?('visible') && !k.to_s.include?('label')
50
+ end &&
51
+ !match_values.empty?
52
+ end
84
53
 
85
- def noko_element(element)
86
- if !(@nokogiri || regex?) || element.is_a?(Selenium::WebDriver::Element)
87
- nil
88
- elsif element.is_a?(Watigiri::Element)
89
- element.element
90
- else
91
- element
54
+ def nokogiri_to_selenium(elements, found)
55
+ locator_scope.elements(wd_locator).map.each_with_index do |el, idx|
56
+ el.wd if found&.include? elements[idx]
57
+ end.compact
92
58
  end
93
59
  end
60
+ end
94
61
 
95
- def set_nokogiri
96
- return if @query_scope.doc
97
-
98
- # should be using `#fragment` instead of `#inner_html`, but can't because of
99
- # https://github.com/sparklemotion/nokogiri/issues/572
100
- doc = if @query_scope.is_a?(Watir::Browser)
101
- Nokogiri::HTML(@query_scope.html)
102
- else
103
- Nokogiri::HTML(@query_scope.inner_html)
104
- end
105
-
106
- @query_scope.doc = doc.tap { |d| d.css('script').remove }
107
- end
62
+ class TextField
63
+ class Locator < Element::Locator
64
+ def use_nokogiri?
65
+ return false if @built.key?(:text)
108
66
 
109
- def text_regexp_deprecation(*)
110
- # Nokogiri can not determine visible text so no need to check
67
+ super
68
+ end
111
69
  end
112
70
  end
113
71
 
114
- class Element
115
- class Locator < Watir::Locators::Element::Locator
116
- include LocatorHelpers
117
- end
118
- end
72
+ class TextArea
73
+ class Locator < Element::Locator
74
+ def use_nokogiri?
75
+ return false if @built.key?(:value)
119
76
 
120
- class Button
121
- class Locator < Watir::Locators::Button::Locator
122
- include LocatorHelpers
77
+ super
78
+ end
123
79
  end
124
80
  end
125
81
 
126
82
  class Cell
127
- class Locator < Watir::Locators::Cell::Locator
128
- include LocatorHelpers
129
-
130
- # Don't use for rows
131
- def regex?
83
+ class Locator < Element::Locator
84
+ def use_nokogiri?
132
85
  false
133
86
  end
134
87
  end
135
88
  end
136
89
 
137
90
  class Row
138
- class Locator < Watir::Locators::Row::Locator
139
- include LocatorHelpers
140
-
141
- # Don't use for rows
142
- def regex?
91
+ class Locator < Element::Locator
92
+ def use_nokogiri?
143
93
  false
144
94
  end
145
95
  end
146
96
  end
147
-
148
- class TextArea
149
- class Locator < Watir::Locators::Element::Locator
150
- include LocatorHelpers
151
-
152
- def regex?
153
- return @regex unless @regex.nil?
154
-
155
- return false unless (@selector.keys & %i[adjacent visible label text visible_text visible_label]).empty?
156
- @regex = @selector.any? { |k, v| v.is_a?(Regexp) && k != :value }
157
- end
158
- end
159
- end
160
-
161
- class TextField
162
- class Locator < Watir::Locators::TextField::Locator
163
- include LocatorHelpers
164
-
165
- def matches_selector?(element, rx_selector)
166
- return super if element.is_a? Selenium::WebDriver::Element
167
- rx_selector = rx_selector.dup
168
-
169
- tag_name = element.tag_name
170
-
171
- %i[text value label].each do |key|
172
- next unless rx_selector.key?(key)
173
- correct_key = tag_name == 'input' ? :value : :text
174
- rx_selector[correct_key] = rx_selector.delete(key)
175
- end
176
-
177
- rx_selector.all? do |how, what|
178
- val = fetch_value(element, how)
179
- what == val || val =~ /#{what}/
180
- end
181
- end
182
-
183
- def regex?
184
- return @regex unless @regex.nil?
185
-
186
- return false unless (@selector.keys & %i[adjacent visible label text visible_text visible_label]).empty?
187
- @regex = @selector.any? { |k, v| v.is_a?(Regexp) && k != :value }
188
- end
189
- end
190
- end
191
97
  end
192
98
  end
@@ -0,0 +1,48 @@
1
+ module Watigiri
2
+ module Locators
3
+ module MatcherHelpers
4
+ attr_accessor :nokogiri
5
+
6
+ def matching_labels(elements, *)
7
+ nokogiri ? elements : super
8
+ end
9
+
10
+ def fetch_value(element, how)
11
+ return super unless nokogiri
12
+
13
+ case how
14
+ when :text
15
+ element.inner_text
16
+ when :href
17
+ element.attribute('href')&.to_s&.strip
18
+ when :tag_name
19
+ element.name.downcase
20
+ else
21
+ super.to_s
22
+ end
23
+ end
24
+
25
+ def deprecate_text_regexp(*)
26
+ # not applicable to Watigiri
27
+ end
28
+ end
29
+
30
+ class Button
31
+ class Matcher < Watir::Locators::Button::Matcher
32
+ include MatcherHelpers
33
+ end
34
+ end
35
+
36
+ class Element
37
+ class Matcher < Watir::Locators::Element::Matcher
38
+ include MatcherHelpers
39
+ end
40
+ end
41
+
42
+ class TextField
43
+ class Matcher < Watir::Locators::TextField::Matcher
44
+ include MatcherHelpers
45
+ end
46
+ end
47
+ end
48
+ end
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = 'watigiri'
6
- spec.version = '0.6.3'
6
+ spec.version = '0.7.0'
7
7
  spec.authors = ['Titus Fortner']
8
8
  spec.email = ['titusfortner@gmail.com']
9
9
 
@@ -22,12 +22,12 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
24
 
25
- spec.add_development_dependency 'bundler', '~> 1.15'
26
- spec.add_development_dependency 'rake', '~> 10.0'
27
- spec.add_development_dependency 'rspec', '~> 3.0'
25
+ spec.add_development_dependency 'bundler'
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'rspec'
28
28
  spec.add_development_dependency 'rubocop'
29
29
  spec.add_development_dependency 'webdrivers', '~> 3.3', '>= 3.3.3'
30
30
 
31
31
  spec.add_runtime_dependency 'nokogiri'
32
- spec.add_runtime_dependency 'watir', '~> 6.15', '< 6.16'
32
+ spec.add_runtime_dependency 'watir', '~> 6.16.4'
33
33
  end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watigiri
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Titus Fortner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-12-16 00:00:00.000000000 Z
11
+ date: 2018-12-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.15'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.15'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -106,20 +106,14 @@ dependencies:
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: '6.15'
110
- - - "<"
111
- - !ruby/object:Gem::Version
112
- version: '6.16'
109
+ version: 6.16.4
113
110
  type: :runtime
114
111
  prerelease: false
115
112
  version_requirements: !ruby/object:Gem::Requirement
116
113
  requirements:
117
114
  - - "~>"
118
115
  - !ruby/object:Gem::Version
119
- version: '6.15'
120
- - - "<"
121
- - !ruby/object:Gem::Version
122
- version: '6.16'
116
+ version: 6.16.4
123
117
  description: |
124
118
  By default Watir locates elements with Selenium; this gem will replace Selenium calls
125
119
  with Nokogiri calls where designated.
@@ -139,10 +133,9 @@ files:
139
133
  - Rakefile
140
134
  - lib/extensions/watir/browser.rb
141
135
  - lib/extensions/watir/element.rb
142
- - lib/extensions/watir/iframe.rb
143
136
  - lib/watigiri.rb
144
137
  - lib/watigiri/locators/element/locator.rb
145
- - lib/watigiri/locators/element/selector_builder.rb
138
+ - lib/watigiri/locators/element/matcher.rb
146
139
  - support/travis.sh
147
140
  - watigiri.gemspec
148
141
  homepage: http://github.com/titusfortner/watigiri
@@ -1,21 +0,0 @@
1
- module Watir
2
- class IFrame < HTMLElement
3
- #
4
- # Uses Nokogiri to return the text of iframe body.
5
- #
6
- # @return [String]
7
- #
8
-
9
- def text!
10
- body.text!
11
- end
12
- end
13
-
14
- class FramedDriver
15
- alias watir_switch! switch!
16
- def switch!
17
- @browser.doc = nil
18
- watir_switch!
19
- end
20
- end # FramedDriver
21
- end # Watir
@@ -1,46 +0,0 @@
1
- module Watigiri
2
- module Locators
3
- module SelectorHelpers
4
- def normalized_selector
5
- @selector.delete(:nokogiri)
6
- super
7
- end
8
- end
9
-
10
- class Element
11
- class SelectorBuilder < Watir::Locators::Element::SelectorBuilder
12
- include SelectorHelpers
13
- end
14
- end
15
-
16
- class Button
17
- class SelectorBuilder < Watir::Locators::Button::SelectorBuilder
18
- include SelectorHelpers
19
- end
20
- end
21
-
22
- class Cell
23
- class SelectorBuilder < Watir::Locators::Cell::SelectorBuilder
24
- include SelectorHelpers
25
- end
26
- end
27
-
28
- class Row
29
- class SelectorBuilder < Watir::Locators::Row::SelectorBuilder
30
- include SelectorHelpers
31
- end
32
- end
33
-
34
- class TextArea
35
- class SelectorBuilder < Watir::Locators::TextArea::SelectorBuilder
36
- include SelectorHelpers
37
- end
38
- end
39
-
40
- class TextField
41
- class SelectorBuilder < Watir::Locators::TextField::SelectorBuilder
42
- include SelectorHelpers
43
- end
44
- end
45
- end
46
- end