bauxite 0.6.18 → 0.6.19
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.
- checksums.yaml +4 -4
- data/LICENSE +21 -21
- data/README.md +293 -293
- data/Rakefile +128 -128
- data/bin/bauxite +27 -27
- data/doc/Bauxite.html +6 -9
- data/doc/Bauxite/Action.html +298 -315
- data/doc/Bauxite/ActionModule.html +23 -26
- data/doc/Bauxite/Application.html +36 -38
- data/doc/Bauxite/Context.html +303 -303
- data/doc/Bauxite/Errors.html +6 -9
- data/doc/Bauxite/Errors/AssertionError.html +6 -9
- data/doc/Bauxite/Errors/FileNotFoundError.html +6 -9
- data/doc/Bauxite/Errors/FormatError.html +6 -9
- data/doc/Bauxite/Loggers.html +6 -9
- data/doc/Bauxite/Loggers/CompositeLogger.html +29 -32
- data/doc/Bauxite/Loggers/EchoLogger.html +10 -13
- data/doc/Bauxite/Loggers/FileLogger.html +25 -28
- data/doc/Bauxite/Loggers/HtmlLogger.html +99 -102
- data/doc/Bauxite/Loggers/NullLogger.html +16 -19
- data/doc/Bauxite/Loggers/ReportLogger.html +43 -46
- data/doc/Bauxite/Loggers/TerminalLogger.html +76 -79
- data/doc/Bauxite/Loggers/XtermLogger.html +28 -31
- data/doc/Bauxite/Parser.html +87 -89
- data/doc/Bauxite/ParserModule.html +19 -22
- data/doc/Bauxite/Selector.html +99 -105
- data/doc/Bauxite/SelectorModule.html +27 -30
- data/doc/README_md.html +117 -103
- data/doc/created.rid +58 -58
- data/doc/fonts.css +167 -167
- data/doc/fonts/Lato-Light.ttf +0 -0
- data/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/doc/fonts/Lato-Regular.ttf +0 -0
- data/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +117 -103
- data/doc/js/darkfish.js +32 -11
- data/doc/js/jquery.js +0 -0
- data/doc/js/navigation.js +0 -0
- data/doc/js/search.js +0 -0
- data/doc/js/search_index.js +1 -1
- data/doc/js/searcher.js +0 -0
- data/doc/rdoc.css +580 -580
- data/doc/table_of_contents.html +69 -72
- data/lib/bauxite.rb +28 -28
- data/lib/bauxite/actions/alias.rb +51 -51
- data/lib/bauxite/actions/assert.rb +49 -49
- data/lib/bauxite/actions/asserth.rb +60 -60
- data/lib/bauxite/actions/assertm.rb +49 -49
- data/lib/bauxite/actions/assertv.rb +40 -40
- data/lib/bauxite/actions/assertw.rb +47 -47
- data/lib/bauxite/actions/break.rb +39 -39
- data/lib/bauxite/actions/capture.rb +61 -61
- data/lib/bauxite/actions/click.rb +36 -36
- data/lib/bauxite/actions/debug.rb +103 -103
- data/lib/bauxite/actions/doif.rb +43 -43
- data/lib/bauxite/actions/dounless.rb +43 -43
- data/lib/bauxite/actions/echo.rb +36 -36
- data/lib/bauxite/actions/exec.rb +46 -46
- data/lib/bauxite/actions/exit.rb +35 -35
- data/lib/bauxite/actions/failif.rb +52 -52
- data/lib/bauxite/actions/js.rb +41 -41
- data/lib/bauxite/actions/load.rb +49 -49
- data/lib/bauxite/actions/open.rb +35 -35
- data/lib/bauxite/actions/params.rb +40 -40
- data/lib/bauxite/actions/replace.rb +37 -37
- data/lib/bauxite/actions/reset.rb +38 -38
- data/lib/bauxite/actions/return.rb +68 -68
- data/lib/bauxite/actions/ruby.rb +58 -58
- data/lib/bauxite/actions/select.rb +48 -48
- data/lib/bauxite/actions/set.rb +39 -39
- data/lib/bauxite/actions/setif.rb +44 -44
- data/lib/bauxite/actions/source.rb +44 -44
- data/lib/bauxite/actions/store.rb +38 -38
- data/lib/bauxite/actions/submit.rb +37 -37
- data/lib/bauxite/actions/test.rb +67 -67
- data/lib/bauxite/actions/tryload.rb +71 -71
- data/lib/bauxite/actions/wait.rb +38 -38
- data/lib/bauxite/actions/write.rb +44 -44
- data/lib/bauxite/application.rb +349 -349
- data/lib/bauxite/core/action.rb +199 -199
- data/lib/bauxite/core/context.rb +791 -791
- data/lib/bauxite/core/errors.rb +41 -41
- data/lib/bauxite/core/logger.rb +169 -169
- data/lib/bauxite/core/parser.rb +85 -85
- data/lib/bauxite/core/selector.rb +152 -152
- data/lib/bauxite/loggers/composite.rb +91 -91
- data/lib/bauxite/loggers/echo.rb +36 -36
- data/lib/bauxite/loggers/file.rb +68 -68
- data/lib/bauxite/loggers/html.rb +154 -154
- data/lib/bauxite/loggers/terminal.rb +134 -134
- data/lib/bauxite/loggers/xterm.rb +101 -101
- data/lib/bauxite/parsers/csv.rb +43 -43
- data/lib/bauxite/parsers/default.rb +42 -42
- data/lib/bauxite/parsers/html.rb +79 -79
- data/lib/bauxite/selectors/attr.rb +39 -39
- data/lib/bauxite/selectors/frame.rb +60 -60
- data/lib/bauxite/selectors/json.rb +88 -88
- data/lib/bauxite/selectors/sid.rb +38 -38
- data/lib/bauxite/selectors/smart.rb +80 -80
- data/lib/bauxite/selectors/window.rb +77 -77
- data/test/alert.bxt +3 -3
- data/test/alert/page.html +4 -4
- data/test/alias.bxt +9 -9
- data/test/asserth.bxt +2 -2
- data/test/assertv.bxt +1 -1
- data/test/assertw.bxt +7 -7
- data/test/broken.bxt.manual +0 -0
- data/test/bug_load_path.bxt.manual +0 -0
- data/test/bug_load_path/broken.bxt.manual +0 -0
- data/test/bug_load_path/test.bxt +0 -0
- data/test/capture.bxt.manual +20 -20
- data/test/capture/my_test.bxt +1 -1
- data/test/capture/page.html +6 -6
- data/test/capture_on_error.bxt.manual +3 -3
- data/test/capture_on_error/my_test.bxt +1 -1
- data/test/capture_on_error/page.html +2 -2
- data/test/debug.bxt.manual +0 -0
- data/test/default_selector.bxt.manual +7 -7
- data/test/default_selector/page.html +10 -10
- data/test/default_selector_var.bxt +1 -1
- data/test/delay.bxt +2 -2
- data/test/delay/page.html +4 -4
- data/test/doif.bxt +6 -6
- data/test/dounless.bxt +6 -6
- data/test/exec.bxt +6 -6
- data/test/exit.bxt +3 -3
- data/test/exit/test.bxt +3 -3
- data/test/extension.bxt.manual +4 -4
- data/test/extension/custom.rb +12 -12
- data/test/extension/page.html +4 -4
- data/test/failif.bxt +7 -7
- data/test/failif/page.html +5 -5
- data/test/format.bxt +17 -17
- data/test/format/page.html +6 -6
- data/test/frame.bxt +6 -6
- data/test/frame/child_frame.html +6 -6
- data/test/frame/grandchild_frame.html +4 -4
- data/test/frame/page.html +4 -4
- data/test/js.bxt +4 -4
- data/test/json.bxt +19 -19
- data/test/json/array.json +3 -3
- data/test/json/object.json +13 -13
- data/test/load.bxt +18 -18
- data/test/load/child.bxt +12 -12
- data/test/parsers.bxt +1 -1
- data/test/parsers.csv +7 -7
- data/test/parsers.html +32 -32
- data/test/parsers/page.html +6 -6
- data/test/return.bxt +1 -1
- data/test/return/f1.bxt +1 -1
- data/test/return/f2.bxt +1 -1
- data/test/return/f3.bxt +1 -1
- data/test/return/f4.bxt +2 -2
- data/test/ruby.bxt +1 -1
- data/test/ruby/custom.rb +5 -5
- data/test/select.bxt +9 -9
- data/test/select/page.html +8 -8
- data/test/selectors.bxt +7 -7
- data/test/selectors/page.html +6 -6
- data/test/set_builtin.bxt +5 -0
- data/test/set_builtin/page.html +5 -0
- data/test/setif.bxt +3 -3
- data/test/smart_selector.bxt +17 -17
- data/test/smart_selector/page.html +17 -17
- data/test/stdin.bxt +0 -0
- data/test/submit.bxt +4 -4
- data/test/submit/page.html +6 -6
- data/test/submit/page2.html +4 -4
- data/test/test.bxt.manual +6 -6
- data/test/test/test1.bxt +2 -2
- data/test/test/test2.bxt +3 -3
- data/test/test/test3.bxt +2 -2
- data/test/test/test4.bxt +1 -1
- data/test/test/test5.bxt +1 -1
- data/test/window.bxt +14 -14
- data/test/window/page.html +5 -5
- data/test/window/popup.html +4 -4
- metadata +5 -3
@@ -1,153 +1,153 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright (c) 2014 Patricio Zavolinsky
|
3
|
-
#
|
4
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
-
# of this software and associated documentation files (the "Software"), to deal
|
6
|
-
# in the Software without restriction, including without limitation the rights
|
7
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
-
# copies of the Software, and to permit persons to whom the Software is
|
9
|
-
# furnished to do so, subject to the following conditions:
|
10
|
-
#
|
11
|
-
# The above copyright notice and this permission notice shall be included in
|
12
|
-
# all copies or substantial portions of the Software.
|
13
|
-
#
|
14
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
20
|
-
# SOFTWARE.
|
21
|
-
#++
|
22
|
-
|
23
|
-
module Bauxite
|
24
|
-
# Selector common state and behavior.
|
25
|
-
module SelectorModule
|
26
|
-
|
27
|
-
# Constructs a new test selector instance.
|
28
|
-
def initialize(ctx, default_selector)
|
29
|
-
@ctx = ctx
|
30
|
-
@default = default_selector
|
31
|
-
end
|
32
|
-
|
33
|
-
# Searches for elements using the specified selector string.
|
34
|
-
#
|
35
|
-
# For more information see Context#find.
|
36
|
-
#
|
37
|
-
# Selectors calling this method should forward their block as well.
|
38
|
-
#
|
39
|
-
# For example:
|
40
|
-
# # === selectors/example.rb ======= #
|
41
|
-
# class Selector
|
42
|
-
# # :category: Selector Methods
|
43
|
-
# def example(arg, &block)
|
44
|
-
# find(arg, &block)
|
45
|
-
# end
|
46
|
-
# end
|
47
|
-
# # === end selectors/example.rb === #
|
48
|
-
#
|
49
|
-
def find(selector, &block)
|
50
|
-
data = selector.split('=', 2)
|
51
|
-
type = data[0]
|
52
|
-
arg = data[-1]
|
53
|
-
unless data.length == 2 and type =~ /^[a-z_]+$/i
|
54
|
-
type = @default
|
55
|
-
arg = selector
|
56
|
-
end
|
57
|
-
raise ArgumentError, "Invalid selector type '#{type}'" unless Context::selectors.include? type
|
58
|
-
|
59
|
-
custom_selectors = Context::selectors(false)
|
60
|
-
return send(type , arg, &block) if custom_selectors.include? type
|
61
|
-
return send(type+'_selector', arg, &block) if custom_selectors.include? type+'_selector'
|
62
|
-
selenium_find(type, arg, &block)
|
63
|
-
end
|
64
|
-
|
65
|
-
protected
|
66
|
-
# Searches for elements using standard Selenium selectors.
|
67
|
-
#
|
68
|
-
# Selectors calling this method should forward their block as well.
|
69
|
-
#
|
70
|
-
# # === selectors/data.rb ======= #
|
71
|
-
# class Selector
|
72
|
-
# # :category: Selector Methods
|
73
|
-
# def data(arg, &block)
|
74
|
-
# # selector code goes here, for example:
|
75
|
-
# selenium_find(:css, "[data='#{arg}']", &block)
|
76
|
-
# end
|
77
|
-
# end
|
78
|
-
# # === end selectors/data.rb === #
|
79
|
-
#
|
80
|
-
def selenium_find(type, selector)
|
81
|
-
element = @ctx.driver.find_element(type, selector)
|
82
|
-
yield element if block_given?
|
83
|
-
element
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
# Selector class.
|
88
|
-
#
|
89
|
-
# Selectors represent different strategies for finding elements. Selenium
|
90
|
-
# provides a list of standard selectors (e.g. by id, by css expression, etc).
|
91
|
-
#
|
92
|
-
# Additional selectors can be specified by defining custom methods in the
|
93
|
-
# Selector class.
|
94
|
-
#
|
95
|
-
# Each custom selector is defined in a separate file in the 'selectors/'
|
96
|
-
# directory.
|
97
|
-
# The name of the file must match the name of the selector. These files should
|
98
|
-
# avoid adding public methods other than the selector method itself.
|
99
|
-
# Also, no +attr_accessors+ should be added.
|
100
|
-
#
|
101
|
-
# Selector methods can use the +ctx+ attribute to refer to the current test
|
102
|
-
# Context. The protected method #selenium_find can also be used to locate elements
|
103
|
-
# using standard Selenium selectors.
|
104
|
-
#
|
105
|
-
# Selector methods should always take a block and forward that block to a call
|
106
|
-
# to either #find or #selenium_find.
|
107
|
-
#
|
108
|
-
# For example (new selector template):
|
109
|
-
# # === selectors/data.rb ======= #
|
110
|
-
# class Selector
|
111
|
-
# # :category: Selector Methods
|
112
|
-
# def data(arg, &block)
|
113
|
-
# # selector code goes here, for example:
|
114
|
-
# selenium_find(:css, "[data='#{arg}']", &block)
|
115
|
-
# end
|
116
|
-
# end
|
117
|
-
# # === end selectors/data.rb === #
|
118
|
-
#
|
119
|
-
# Context::selectors.include? 'data' # => true
|
120
|
-
#
|
121
|
-
# To avoid name clashing with Ruby reserved words, the '_selector' suffix can
|
122
|
-
# be included in the selector method name (this suffix will not be considered
|
123
|
-
# part of the selector name).
|
124
|
-
#
|
125
|
-
# For example (_selector suffix):
|
126
|
-
# # === selectors/end.rb ======= #
|
127
|
-
# class Selector
|
128
|
-
# # :category: Selector Methods
|
129
|
-
# def end_selector
|
130
|
-
# # do something
|
131
|
-
# end
|
132
|
-
# end
|
133
|
-
# # === end selector/end.rb === #
|
134
|
-
#
|
135
|
-
# Context::selectors.include? 'end' # => true
|
136
|
-
#
|
137
|
-
# ---
|
138
|
-
#
|
139
|
-
# === Standard Selenium Selectors
|
140
|
-
#
|
141
|
-
# [id=+targetValue+] {Locate elements whose +id+ attribute matches +targetValue+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-id]
|
142
|
-
# [name=+targetValue+] {Locate elements whose +name+ attribute matches +targetValue+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-name]
|
143
|
-
# [css=+cssSelectorSyntax+] {Locate elements using CSS selector syntax.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-css]
|
144
|
-
# [partial_link_text=+textFragment+] {Locate A elements whose text includes +textFragment+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-partial-link-text]
|
145
|
-
# [class=+className+ and class_name=+className+] {Locate elements whose +class+ attribute matches +className+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-class-name]
|
146
|
-
# [link=+exactText+ and link_text=+exactText+] {Locate A elements whose text is exactly +exactText+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-link-text]
|
147
|
-
# [tag_name=+targetValue+] {Locate elements whose tag name matches +targetValue+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-tag-name]
|
148
|
-
# [xpath=+xpathExpression+] {Locate elements using XPATH expressions.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-xpath]
|
149
|
-
#
|
150
|
-
class Selector
|
151
|
-
include Bauxite::SelectorModule
|
152
|
-
end
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2014 Patricio Zavolinsky
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
20
|
+
# SOFTWARE.
|
21
|
+
#++
|
22
|
+
|
23
|
+
module Bauxite
|
24
|
+
# Selector common state and behavior.
|
25
|
+
module SelectorModule
|
26
|
+
|
27
|
+
# Constructs a new test selector instance.
|
28
|
+
def initialize(ctx, default_selector)
|
29
|
+
@ctx = ctx
|
30
|
+
@default = default_selector
|
31
|
+
end
|
32
|
+
|
33
|
+
# Searches for elements using the specified selector string.
|
34
|
+
#
|
35
|
+
# For more information see Context#find.
|
36
|
+
#
|
37
|
+
# Selectors calling this method should forward their block as well.
|
38
|
+
#
|
39
|
+
# For example:
|
40
|
+
# # === selectors/example.rb ======= #
|
41
|
+
# class Selector
|
42
|
+
# # :category: Selector Methods
|
43
|
+
# def example(arg, &block)
|
44
|
+
# find(arg, &block)
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
# # === end selectors/example.rb === #
|
48
|
+
#
|
49
|
+
def find(selector, &block)
|
50
|
+
data = selector.split('=', 2)
|
51
|
+
type = data[0]
|
52
|
+
arg = data[-1]
|
53
|
+
unless data.length == 2 and type =~ /^[a-z_]+$/i
|
54
|
+
type = @default
|
55
|
+
arg = selector
|
56
|
+
end
|
57
|
+
raise ArgumentError, "Invalid selector type '#{type}'" unless Context::selectors.include? type
|
58
|
+
|
59
|
+
custom_selectors = Context::selectors(false)
|
60
|
+
return send(type , arg, &block) if custom_selectors.include? type
|
61
|
+
return send(type+'_selector', arg, &block) if custom_selectors.include? type+'_selector'
|
62
|
+
selenium_find(type, arg, &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
protected
|
66
|
+
# Searches for elements using standard Selenium selectors.
|
67
|
+
#
|
68
|
+
# Selectors calling this method should forward their block as well.
|
69
|
+
#
|
70
|
+
# # === selectors/data.rb ======= #
|
71
|
+
# class Selector
|
72
|
+
# # :category: Selector Methods
|
73
|
+
# def data(arg, &block)
|
74
|
+
# # selector code goes here, for example:
|
75
|
+
# selenium_find(:css, "[data='#{arg}']", &block)
|
76
|
+
# end
|
77
|
+
# end
|
78
|
+
# # === end selectors/data.rb === #
|
79
|
+
#
|
80
|
+
def selenium_find(type, selector)
|
81
|
+
element = @ctx.driver.find_element(type, selector)
|
82
|
+
yield element if block_given?
|
83
|
+
element
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Selector class.
|
88
|
+
#
|
89
|
+
# Selectors represent different strategies for finding elements. Selenium
|
90
|
+
# provides a list of standard selectors (e.g. by id, by css expression, etc).
|
91
|
+
#
|
92
|
+
# Additional selectors can be specified by defining custom methods in the
|
93
|
+
# Selector class.
|
94
|
+
#
|
95
|
+
# Each custom selector is defined in a separate file in the 'selectors/'
|
96
|
+
# directory.
|
97
|
+
# The name of the file must match the name of the selector. These files should
|
98
|
+
# avoid adding public methods other than the selector method itself.
|
99
|
+
# Also, no +attr_accessors+ should be added.
|
100
|
+
#
|
101
|
+
# Selector methods can use the +ctx+ attribute to refer to the current test
|
102
|
+
# Context. The protected method #selenium_find can also be used to locate elements
|
103
|
+
# using standard Selenium selectors.
|
104
|
+
#
|
105
|
+
# Selector methods should always take a block and forward that block to a call
|
106
|
+
# to either #find or #selenium_find.
|
107
|
+
#
|
108
|
+
# For example (new selector template):
|
109
|
+
# # === selectors/data.rb ======= #
|
110
|
+
# class Selector
|
111
|
+
# # :category: Selector Methods
|
112
|
+
# def data(arg, &block)
|
113
|
+
# # selector code goes here, for example:
|
114
|
+
# selenium_find(:css, "[data='#{arg}']", &block)
|
115
|
+
# end
|
116
|
+
# end
|
117
|
+
# # === end selectors/data.rb === #
|
118
|
+
#
|
119
|
+
# Context::selectors.include? 'data' # => true
|
120
|
+
#
|
121
|
+
# To avoid name clashing with Ruby reserved words, the '_selector' suffix can
|
122
|
+
# be included in the selector method name (this suffix will not be considered
|
123
|
+
# part of the selector name).
|
124
|
+
#
|
125
|
+
# For example (_selector suffix):
|
126
|
+
# # === selectors/end.rb ======= #
|
127
|
+
# class Selector
|
128
|
+
# # :category: Selector Methods
|
129
|
+
# def end_selector
|
130
|
+
# # do something
|
131
|
+
# end
|
132
|
+
# end
|
133
|
+
# # === end selector/end.rb === #
|
134
|
+
#
|
135
|
+
# Context::selectors.include? 'end' # => true
|
136
|
+
#
|
137
|
+
# ---
|
138
|
+
#
|
139
|
+
# === Standard Selenium Selectors
|
140
|
+
#
|
141
|
+
# [id=+targetValue+] {Locate elements whose +id+ attribute matches +targetValue+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-id]
|
142
|
+
# [name=+targetValue+] {Locate elements whose +name+ attribute matches +targetValue+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-name]
|
143
|
+
# [css=+cssSelectorSyntax+] {Locate elements using CSS selector syntax.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-css]
|
144
|
+
# [partial_link_text=+textFragment+] {Locate A elements whose text includes +textFragment+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-partial-link-text]
|
145
|
+
# [class=+className+ and class_name=+className+] {Locate elements whose +class+ attribute matches +className+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-class-name]
|
146
|
+
# [link=+exactText+ and link_text=+exactText+] {Locate A elements whose text is exactly +exactText+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-link-text]
|
147
|
+
# [tag_name=+targetValue+] {Locate elements whose tag name matches +targetValue+.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-tag-name]
|
148
|
+
# [xpath=+xpathExpression+] {Locate elements using XPATH expressions.}[http://docs.seleniumhq.org/docs/03_webdriver.jsp#by-xpath]
|
149
|
+
#
|
150
|
+
class Selector
|
151
|
+
include Bauxite::SelectorModule
|
152
|
+
end
|
153
153
|
end
|
@@ -1,92 +1,92 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright (c) 2014 Patricio Zavolinsky
|
3
|
-
#
|
4
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
-
# of this software and associated documentation files (the "Software"), to deal
|
6
|
-
# in the Software without restriction, including without limitation the rights
|
7
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
-
# copies of the Software, and to permit persons to whom the Software is
|
9
|
-
# furnished to do so, subject to the following conditions:
|
10
|
-
#
|
11
|
-
# The above copyright notice and this permission notice shall be included in
|
12
|
-
# all copies or substantial portions of the Software.
|
13
|
-
#
|
14
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
20
|
-
# SOFTWARE.
|
21
|
-
#++
|
22
|
-
|
23
|
-
# Composite logger.
|
24
|
-
#
|
25
|
-
# This composite logger forwards logging calls to each of its children.
|
26
|
-
#
|
27
|
-
# Composite logger options include:
|
28
|
-
# [<tt>loggers</tt>] A comma-separated list of logger names.
|
29
|
-
#
|
30
|
-
class Bauxite::Loggers::CompositeLogger
|
31
|
-
|
32
|
-
# Constructs a new composite logger instance.
|
33
|
-
def initialize(options, loggers = nil)
|
34
|
-
unless loggers
|
35
|
-
unless options[:loggers]
|
36
|
-
raise ArgumentError, "Missing required logger option 'loggers'. "+
|
37
|
-
"The value of this option is a comma-separated list of valid loggers. "+
|
38
|
-
"For example loggers=xterm,file."
|
39
|
-
end
|
40
|
-
loggers = options[:loggers].split(',')
|
41
|
-
end
|
42
|
-
|
43
|
-
@loggers = loggers.map do |l|
|
44
|
-
Bauxite::Context::load_logger(l, options)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Pretty prints action information and status.
|
49
|
-
#
|
50
|
-
# This implementation only yileds in the first logger.
|
51
|
-
#
|
52
|
-
# Additional loggers are called after the block completed.
|
53
|
-
#
|
54
|
-
def log_cmd(action, &block)
|
55
|
-
_log_cmd_block(@loggers, action, &block)
|
56
|
-
end
|
57
|
-
|
58
|
-
# Returns a colorized debug prompt.
|
59
|
-
#
|
60
|
-
# This implementation returns the debug_prompt of the first logger.
|
61
|
-
#
|
62
|
-
def debug_prompt
|
63
|
-
@loggers[0].debug_prompt
|
64
|
-
end
|
65
|
-
|
66
|
-
# Updates action progress.
|
67
|
-
def progress(value)
|
68
|
-
@loggers.each { |l| l.progress(value) }
|
69
|
-
end
|
70
|
-
|
71
|
-
# Prints the specified string.
|
72
|
-
#
|
73
|
-
# See Bauxite::Loggers::NullLogger#print
|
74
|
-
#
|
75
|
-
def log(s, type = :info)
|
76
|
-
@loggers.each { |l| l.log(s, type) }
|
77
|
-
end
|
78
|
-
|
79
|
-
# Completes the log execution.
|
80
|
-
#
|
81
|
-
def finalize(ctx)
|
82
|
-
@loggers.each { |l| l.finalize(ctx) }
|
83
|
-
end
|
84
|
-
|
85
|
-
private
|
86
|
-
def _log_cmd_block(loggers, action, &block)
|
87
|
-
return yield if loggers.size == 0
|
88
|
-
return loggers[0].log_cmd(action, &block) if loggers.size == 1
|
89
|
-
loggers[0].log_cmd(action) { _log_cmd_block(loggers[1..-1], action, &block) }
|
90
|
-
end
|
91
|
-
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2014 Patricio Zavolinsky
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
20
|
+
# SOFTWARE.
|
21
|
+
#++
|
22
|
+
|
23
|
+
# Composite logger.
|
24
|
+
#
|
25
|
+
# This composite logger forwards logging calls to each of its children.
|
26
|
+
#
|
27
|
+
# Composite logger options include:
|
28
|
+
# [<tt>loggers</tt>] A comma-separated list of logger names.
|
29
|
+
#
|
30
|
+
class Bauxite::Loggers::CompositeLogger
|
31
|
+
|
32
|
+
# Constructs a new composite logger instance.
|
33
|
+
def initialize(options, loggers = nil)
|
34
|
+
unless loggers
|
35
|
+
unless options[:loggers]
|
36
|
+
raise ArgumentError, "Missing required logger option 'loggers'. "+
|
37
|
+
"The value of this option is a comma-separated list of valid loggers. "+
|
38
|
+
"For example loggers=xterm,file."
|
39
|
+
end
|
40
|
+
loggers = options[:loggers].split(',')
|
41
|
+
end
|
42
|
+
|
43
|
+
@loggers = loggers.map do |l|
|
44
|
+
Bauxite::Context::load_logger(l, options)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Pretty prints action information and status.
|
49
|
+
#
|
50
|
+
# This implementation only yileds in the first logger.
|
51
|
+
#
|
52
|
+
# Additional loggers are called after the block completed.
|
53
|
+
#
|
54
|
+
def log_cmd(action, &block)
|
55
|
+
_log_cmd_block(@loggers, action, &block)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns a colorized debug prompt.
|
59
|
+
#
|
60
|
+
# This implementation returns the debug_prompt of the first logger.
|
61
|
+
#
|
62
|
+
def debug_prompt
|
63
|
+
@loggers[0].debug_prompt
|
64
|
+
end
|
65
|
+
|
66
|
+
# Updates action progress.
|
67
|
+
def progress(value)
|
68
|
+
@loggers.each { |l| l.progress(value) }
|
69
|
+
end
|
70
|
+
|
71
|
+
# Prints the specified string.
|
72
|
+
#
|
73
|
+
# See Bauxite::Loggers::NullLogger#print
|
74
|
+
#
|
75
|
+
def log(s, type = :info)
|
76
|
+
@loggers.each { |l| l.log(s, type) }
|
77
|
+
end
|
78
|
+
|
79
|
+
# Completes the log execution.
|
80
|
+
#
|
81
|
+
def finalize(ctx)
|
82
|
+
@loggers.each { |l| l.finalize(ctx) }
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
def _log_cmd_block(loggers, action, &block)
|
87
|
+
return yield if loggers.size == 0
|
88
|
+
return loggers[0].log_cmd(action, &block) if loggers.size == 1
|
89
|
+
loggers[0].log_cmd(action) { _log_cmd_block(loggers[1..-1], action, &block) }
|
90
|
+
end
|
91
|
+
|
92
92
|
end
|