xpath 0.1.3 → 0.1.4
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.
- data/lib/xpath/html.rb +2 -2
- data/lib/xpath/union.rb +4 -0
- data/lib/xpath/version.rb +1 -1
- data/spec/fixtures/form.html +60 -0
- data/spec/html_spec.rb +72 -37
- metadata +6 -7
data/lib/xpath/html.rb
CHANGED
@@ -14,8 +14,8 @@ module XPath
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def button(locator)
|
17
|
-
button = descendant(:input)[attr(:type).one_of('submit', 'image', 'button')][attr(:id).equals(locator) | attr(:value).is(locator)]
|
18
|
-
button += descendant(:button)[attr(:id).equals(locator) | attr(:value).is(locator) | string.n.is(locator)]
|
17
|
+
button = descendant(:input)[attr(:type).one_of('submit', 'image', 'button')][attr(:id).equals(locator) | attr(:value).is(locator) | attr(:title).is(locator)]
|
18
|
+
button += descendant(:button)[attr(:id).equals(locator) | attr(:value).is(locator) | string.n.is(locator) | attr(:title).is(locator)]
|
19
19
|
button += descendant(:input)[attr(:type).equals('image')][attr(:alt).is(locator)]
|
20
20
|
end
|
21
21
|
|
data/lib/xpath/union.rb
CHANGED
data/lib/xpath/version.rb
CHANGED
data/spec/fixtures/form.html
CHANGED
@@ -25,17 +25,26 @@
|
|
25
25
|
<input type="submit" value="submit-with-value" data="value-submit"/>
|
26
26
|
<input type="submit" value="not exact value submit" data="not-exact-value-submit"/>
|
27
27
|
<input type="submit" value="exact value submit" data="exact-value-submit"/>
|
28
|
+
<input type="submit" title="My submit title" value="submit-with-title" data="title-submit">
|
29
|
+
<input type="submit" title="Exact submit title" value="exact title submit" data="exact-title-submit">
|
30
|
+
<input type="submit" title="Not Exact submit title" value="exact title submit" data="not-exact-title-submit">
|
28
31
|
|
29
32
|
<input type="button" id="button-with-id" data="id-button" value="Has ID"/>
|
30
33
|
<input type="button" value="button-with-value" data="value-button"/>
|
31
34
|
<input type="button" value="not exact value button" data="not-exact-value-button"/>
|
32
35
|
<input type="button" value="exact value button" data="exact-value-button"/>
|
36
|
+
<input type="button" title="My button title" value="button-with-title" data="title-button">
|
37
|
+
<input type="button" title="Not Exact button title" value="not exact title button" data="not-exact-title-button">
|
38
|
+
<input type="button" title="Exact button title" value="exact title button" data="exact-title-button">
|
33
39
|
|
34
40
|
<input type="image" id="imgbut-with-id" data="id-imgbut" value="Has ID"/>
|
35
41
|
<input type="image" value="imgbut-with-value" data="value-imgbut"/>
|
36
42
|
<input type="image" alt="imgbut-with-alt" data="alt-imgbut"/>
|
37
43
|
<input type="image" value="not exact value imgbut" data="not-exact-value-imgbut"/>
|
38
44
|
<input type="image" value="exact value imgbut" data="exact-value-imgbut"/>
|
45
|
+
<input type="image" title="My imgbut title" value="imgbut-with-title" data="title-imgbut">
|
46
|
+
<input type="image" title="Not Exact imgbut title" value="not exact title imgbut" data="not-exact-title-imgbut">
|
47
|
+
<input type="image" title="Exact imgbut title" value="exact title imgbut" data="exact-title-imgbut">
|
39
48
|
|
40
49
|
<button id="btag-with-id" data="id-btag" value="Has ID"/>
|
41
50
|
<button value="btag-with-value" data="value-btag"/>
|
@@ -45,6 +54,9 @@
|
|
45
54
|
<button data="text-btag">btag-with-text</button>
|
46
55
|
<button data="not-exact-text-btag">not exact text btag</button>
|
47
56
|
<button data="exact-text-btag">exact text btag</button>
|
57
|
+
<button title="My btag title" data="title-btag">btag-with-title</button>
|
58
|
+
<button title="Not Exact btag title" data="not-exact-title-btag">not exact title btag</button>
|
59
|
+
<button title="Exact btag title" data="exact-title-btag">exact title btag</button>
|
48
60
|
|
49
61
|
<button data="btag-with-whitespace"> My
|
50
62
|
|
@@ -84,3 +96,51 @@
|
|
84
96
|
</tr>
|
85
97
|
</table>
|
86
98
|
</p>
|
99
|
+
|
100
|
+
<p>
|
101
|
+
<h2>Fields</h2>
|
102
|
+
|
103
|
+
<h4>With id</h4>
|
104
|
+
<input id="input-with-id" value="correct-value" data="input-with-id-data"/>
|
105
|
+
<input type="text" id="input-text-with-id" data="input-text-with-id-data"/>
|
106
|
+
<input type="password" id="input-password-with-id" data="input-password-with-id-data"/>
|
107
|
+
<input type="custom" id="input-custom-with-id" data="input-custom-with-id-data"/>
|
108
|
+
<textarea id="textarea-with-id" data="textarea-with-id-data">Correct value</textarea>
|
109
|
+
<select id="select-with-id" data="select-with-id-data"></select>
|
110
|
+
<input type="submit" id="input-submit-with-id" data="input-submit-with-id-data"/>
|
111
|
+
<input type="image" id="input-image-with-id" data="input-image-with-id-data"/>
|
112
|
+
<input type="hidden" id="input-hidden-with-id" data="input-hidden-with-id-data"/>
|
113
|
+
|
114
|
+
<h4>With name</h4>
|
115
|
+
<input name="input-with-name" data="input-with-name-data"/>
|
116
|
+
<input type="text" name="input-text-with-name" data="input-text-with-name-data"/>
|
117
|
+
<input type="password" name="input-password-with-name" data="input-password-with-name-data"/>
|
118
|
+
<input type="custom" name="input-custom-with-name" data="input-custom-with-name-data"/>
|
119
|
+
<textarea name="textarea-with-name" data="textarea-with-name-data"></textarea>
|
120
|
+
<select name="select-with-name" data="select-with-name-data"></select>
|
121
|
+
<input type="submit" name="input-submit-with-name" data="input-submit-with-name-data"/>
|
122
|
+
<input type="image" name="input-image-with-name" data="input-image-with-name-data"/>
|
123
|
+
<input type="hidden" name="input-hidden-with-name" data="input-hidden-with-name-data"/>
|
124
|
+
|
125
|
+
<h4>With referenced label</h4>
|
126
|
+
<label for="input-with-label">Input with label</label><input id="input-with-label" data="input-with-label-data"/>
|
127
|
+
<label for="input-text-with-label">Input text with label</label><input type="text" id="input-text-with-label" data="input-text-with-label-data"/>
|
128
|
+
<label for="input-password-with-label">Input password with label</label><input type="password" id="input-password-with-label" data="input-password-with-label-data"/>
|
129
|
+
<label for="input-custom-with-label">Input custom with label</label><input type="custom" id="input-custom-with-label" data="input-custom-with-label-data"/>
|
130
|
+
<label for="textarea-with-label">Textarea with label</label><textarea id="textarea-with-label" data="textarea-with-label-data"></textarea>
|
131
|
+
<label for="select-with-label">Select with label</label><select id="select-with-label" data="select-with-label-data"></select>
|
132
|
+
<label for="input-submit-with-label">Input submit with label</label><input type="submit" id="input-submit-with-label" data="input-submit-with-label-data"/>
|
133
|
+
<label for="input-image-with-label">Input image with label</label><input type="image" id="input-image-with-label" data="input-image-with-label-data"/>
|
134
|
+
<label for="input-hidden-with-label">Input hidden with label</label><input type="hidden" id="input-hidden-with-label" data="input-hidden-with-label-data"/>
|
135
|
+
|
136
|
+
<h4>With parent label</h4>
|
137
|
+
<label>Input with parent label<input data="input-with-parent-label-data"/></label>
|
138
|
+
<label>Input text with parent label<input type="text" data="input-text-with-parent-label-data"/></label>
|
139
|
+
<label>Input password with parent label<input type="password" data="input-password-with-parent-label-data"/></label>
|
140
|
+
<label>Input custom with parent label<input type="custom" data="input-custom-with-parent-label-data"/></label>
|
141
|
+
<label>Textarea with parent label<textarea data="textarea-with-parent-label-data"></textarea></label>
|
142
|
+
<label>Select with parent label<select data="select-with-parent-label-data"></select></label>
|
143
|
+
<label>Input submit with parent label<input type="submit" data="input-submit-with-parent-label-data"/></label>
|
144
|
+
<label>Input image with parent label<input type="image" data="input-image-with-parent-label-data"/></label>
|
145
|
+
<label>Input hidden with parent label<input type="hidden" data="input-hidden-with-parent-label-data"/></label>
|
146
|
+
</p>
|
data/spec/html_spec.rb
CHANGED
@@ -45,6 +45,9 @@ describe XPath::HTML do
|
|
45
45
|
it("finds buttons by value") { get('submit-with-value').should == 'value-submit' }
|
46
46
|
it("finds buttons by approximate value") { get('mit-with-val').should == 'value-submit' }
|
47
47
|
it("prefers buttons with exact value") { all('exact value submit').should == ['exact-value-submit', 'not-exact-value-submit'] }
|
48
|
+
it("finds buttons by title") { get('My submit title').should == 'title-submit' }
|
49
|
+
it("finds buttons by approximate title") { get('submit title').should == 'title-submit' }
|
50
|
+
it("prefers exact matches of title") { all('Exact submit title').should == ['exact-title-submit', 'not-exact-title-submit'] }
|
48
51
|
end
|
49
52
|
|
50
53
|
context "with button type" do
|
@@ -52,6 +55,9 @@ describe XPath::HTML do
|
|
52
55
|
it("finds buttons by value") { get('button-with-value').should == 'value-button' }
|
53
56
|
it("finds buttons by approximate value") { get('ton-with-val').should == 'value-button' }
|
54
57
|
it("prefers buttons with exact value") { all('exact value button').should == ['exact-value-button', 'not-exact-value-button'] }
|
58
|
+
it("finds buttons by title") { get('My button title').should == 'title-button' }
|
59
|
+
it("finds buttons by approximate title") { get('button title').should == 'title-button' }
|
60
|
+
it("prefers exact matches of title") { all('Exact button title').should == ['exact-title-button', 'not-exact-title-button'] }
|
55
61
|
end
|
56
62
|
|
57
63
|
context "with image type" do
|
@@ -60,6 +66,9 @@ describe XPath::HTML do
|
|
60
66
|
it("finds buttons by approximate value") { get('gbut-with-val').should == 'value-imgbut' }
|
61
67
|
it("finds buttons by alt attribute") { get('imgbut-with-alt').should == 'alt-imgbut' }
|
62
68
|
it("prefers buttons with exact value") { all('exact value imgbut').should == ['exact-value-imgbut', 'not-exact-value-imgbut'] }
|
69
|
+
it("finds buttons by title") { get('My imgbut title').should == 'title-imgbut' }
|
70
|
+
it("finds buttons by approximate title") { get('imgbut title').should == 'title-imgbut' }
|
71
|
+
it("prefers exact matches of title") { all('Exact imgbut title').should == ['exact-title-imgbut', 'not-exact-title-imgbut'] }
|
63
72
|
end
|
64
73
|
|
65
74
|
context "with button tag" do
|
@@ -73,6 +82,9 @@ describe XPath::HTML do
|
|
73
82
|
it("finds buttons with child tags by text") { get('An emphatic button').should == 'btag-with-children' }
|
74
83
|
it("finds buttons by text of their children") { get('emphatic').should == 'btag-with-children' }
|
75
84
|
it("prefers buttons with exact text") { all('exact text btag').should == ['exact-text-btag', 'not-exact-text-btag'] }
|
85
|
+
it("finds buttons by title") { get('My btag title').should == 'title-btag' }
|
86
|
+
it("finds buttons by approximate title") { get('btag title').should == 'title-btag' }
|
87
|
+
it("prefers exact matches of title") { all('Exact btag title').should == ['exact-title-btag', 'not-exact-title-btag'] }
|
76
88
|
end
|
77
89
|
|
78
90
|
context "with unkown type" do
|
@@ -94,55 +106,58 @@ describe XPath::HTML do
|
|
94
106
|
subject { :field }
|
95
107
|
|
96
108
|
context "by id" do
|
97
|
-
it("finds inputs with
|
98
|
-
it("finds inputs with
|
99
|
-
it("finds inputs with
|
100
|
-
it("finds
|
101
|
-
it("finds
|
102
|
-
it("
|
103
|
-
it("does not find
|
104
|
-
it("does not find
|
109
|
+
it("finds inputs with no type") { get('input-with-id').should == 'input-with-id-data' }
|
110
|
+
it("finds inputs with text type") { get('input-text-with-id').should == 'input-text-with-id-data' }
|
111
|
+
it("finds inputs with password type") { get('input-password-with-id').should == 'input-password-with-id-data' }
|
112
|
+
it("finds inputs with custom type") { get('input-custom-with-id').should == 'input-custom-with-id-data' }
|
113
|
+
it("finds textareas") { get('textarea-with-id').should == 'textarea-with-id-data' }
|
114
|
+
it("finds select boxes") { get('select-with-id').should == 'select-with-id-data' }
|
115
|
+
it("does not find submit buttons") { get('input-submit-with-id').should be_nil }
|
116
|
+
it("does not find image buttons") { get('input-image-with-id').should be_nil }
|
117
|
+
it("does not find hidden fields") { get('input-hidden-with-id').should be_nil }
|
105
118
|
end
|
106
119
|
|
107
120
|
context "by name" do
|
108
|
-
it("finds inputs with
|
109
|
-
it("finds inputs with
|
110
|
-
it("finds inputs with
|
111
|
-
it("finds
|
112
|
-
it("finds
|
113
|
-
it("
|
114
|
-
it("does not find
|
115
|
-
it("does not find
|
121
|
+
it("finds inputs with no type") { get('input-with-name').should == 'input-with-name-data' }
|
122
|
+
it("finds inputs with text type") { get('input-text-with-name').should == 'input-text-with-name-data' }
|
123
|
+
it("finds inputs with password type") { get('input-password-with-name').should == 'input-password-with-name-data' }
|
124
|
+
it("finds inputs with custom type") { get('input-custom-with-name').should == 'input-custom-with-name-data' }
|
125
|
+
it("finds textareas") { get('textarea-with-name').should == 'textarea-with-name-data' }
|
126
|
+
it("finds select boxes") { get('select-with-name').should == 'select-with-name-data' }
|
127
|
+
it("does not find submit buttons") { get('input-submit-with-name').should be_nil }
|
128
|
+
it("does not find image buttons") { get('input-image-with-name').should be_nil }
|
129
|
+
it("does not find hidden fields") { get('input-hidden-with-name').should be_nil }
|
116
130
|
end
|
117
131
|
|
118
132
|
context "by referenced label" do
|
119
|
-
it("finds inputs with
|
120
|
-
it("finds inputs with
|
121
|
-
it("finds inputs with
|
122
|
-
it("finds
|
123
|
-
it("finds
|
124
|
-
it("
|
125
|
-
it("does not find
|
126
|
-
it("does not find
|
133
|
+
it("finds inputs with no type") { get('Input with label').should == 'input-with-label-data' }
|
134
|
+
it("finds inputs with text type") { get('Input text with label').should == 'input-text-with-label-data' }
|
135
|
+
it("finds inputs with password type") { get('Input password with label').should == 'input-password-with-label-data' }
|
136
|
+
it("finds inputs with custom type") { get('Input custom with label').should == 'input-custom-with-label-data' }
|
137
|
+
it("finds textareas") { get('Textarea with label').should == 'textarea-with-label-data' }
|
138
|
+
it("finds select boxes") { get('Select with label').should == 'select-with-label-data' }
|
139
|
+
it("does not find submit buttons") { get('Input submit with label').should be_nil }
|
140
|
+
it("does not find image buttons") { get('Input image with label').should be_nil }
|
141
|
+
it("does not find hidden fields") { get('Input hidden with label').should be_nil }
|
127
142
|
end
|
128
143
|
|
129
144
|
context "by parent label" do
|
130
|
-
it("finds inputs with
|
131
|
-
it("finds inputs
|
132
|
-
it("finds inputs with password type")
|
133
|
-
it("finds inputs with custom type")
|
134
|
-
it("finds textareas")
|
135
|
-
it("finds select boxes")
|
136
|
-
it("does not find submit buttons")
|
137
|
-
it("does not find image buttons")
|
138
|
-
it("does not find hidden fields")
|
145
|
+
it("finds inputs with no type") { get('Input with parent label').should == 'input-with-parent-label-data' }
|
146
|
+
it("finds inputs with text type") { get('Input text with parent label').should == 'input-text-with-parent-label-data' }
|
147
|
+
it("finds inputs with password type") { get('Input password with parent label').should == 'input-password-with-parent-label-data' }
|
148
|
+
it("finds inputs with custom type") { get('Input custom with parent label').should == 'input-custom-with-parent-label-data' }
|
149
|
+
it("finds textareas") { get('Textarea with parent label').should == 'textarea-with-parent-label-data' }
|
150
|
+
it("finds select boxes") { get('Select with parent label').should == 'select-with-parent-label-data' }
|
151
|
+
it("does not find submit buttons") { get('Input submit with parent label').should be_nil }
|
152
|
+
it("does not find image buttons") { get('Input image with parent label').should be_nil }
|
153
|
+
it("does not find hidden fields") { get('Input hidden with parent label').should be_nil }
|
139
154
|
end
|
140
155
|
|
141
156
|
context "with :with option" do
|
142
|
-
it("finds inputs that match option") {}
|
143
|
-
it("omits inputs that don't match option") {}
|
144
|
-
it("finds textareas that match option") {}
|
145
|
-
it("omits textareas that don't match option") {}
|
157
|
+
it("finds inputs that match option") { get('input-with-id', :with => 'correct-value').should == 'input-with-id-data' }
|
158
|
+
it("omits inputs that don't match option") { get('input-with-id', :with => 'wrong-value').should be_nil }
|
159
|
+
it("finds textareas that match option") { get('textarea-with-id', :with => 'Correct value').should == 'textarea-with-id-data' }
|
160
|
+
it("omits textareas that don't match option") { get('textarea-with-id', :with => 'Wrong value').should be_nil }
|
146
161
|
end
|
147
162
|
|
148
163
|
context "with :checked option" do
|
@@ -170,6 +185,26 @@ describe XPath::HTML do
|
|
170
185
|
|
171
186
|
end
|
172
187
|
|
188
|
+
describe '#select' do
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
describe '#checkbox' do
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
describe '#radio_button' do
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
describe '#file_field' do
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
describe '#option' do
|
205
|
+
|
206
|
+
end
|
207
|
+
|
173
208
|
describe "#optgroup" do
|
174
209
|
subject { :optgroup }
|
175
210
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 4
|
9
|
+
version: 0.1.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jonas Nicklas
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-04-25 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -37,13 +37,12 @@ dependencies:
|
|
37
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
38
|
none: false
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - ~>
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
segments:
|
43
|
-
- 1
|
44
43
|
- 2
|
45
|
-
-
|
46
|
-
version:
|
44
|
+
- 0
|
45
|
+
version: "2.0"
|
47
46
|
type: :development
|
48
47
|
version_requirements: *id002
|
49
48
|
- !ruby/object:Gem::Dependency
|