marta 0.37396 → 0.41245
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +42 -19
- data/example_project/p_object/test_page.rb +2 -1
- data/example_project/project_itself/iframe.html +5 -0
- data/{lib/marta/data/test.html → example_project/project_itself/index.html} +1 -1
- data/example_project/spec/p_object/pageobjects/MartaTestPage.json +707 -124
- data/example_project/spec/p_object/pageobjects/TheIframe.json +70 -14
- data/example_project/spec/spec_helper.rb +3 -1
- data/lib/marta/black_magic.rb +59 -13
- data/lib/marta/data/element.html +4 -15
- data/lib/marta/data/element.js +25 -226
- data/lib/marta/data/style.css +2 -2
- data/lib/marta/dialogs.rb +52 -4
- data/lib/marta/element_information.rb +86 -0
- data/lib/marta/injector.rb +2 -2
- data/lib/marta/json_2_class.rb +1 -1
- data/lib/marta/lightning.rb +1 -0
- data/lib/marta/marta_app/content.js +8 -0
- data/lib/marta/marta_app/devtools.html +1 -0
- data/lib/marta/marta_app/devtools.js +5 -0
- data/lib/marta/marta_app/manifest.json +3 -2
- data/lib/marta/options_and_paths.rb +1 -10
- data/lib/marta/page_arithmetic.rb +85 -97
- data/lib/marta/public_methods.rb +5 -4
- data/lib/marta/read_write.rb +50 -1
- data/lib/marta/server.rb +0 -18
- data/lib/marta/simple_element_finder.rb +0 -19
- data/lib/marta/version.rb +1 -1
- data/lib/marta/x_path.rb +154 -139
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8beee45c271c89a12e79a698eb47a90950a2ad0
|
4
|
+
data.tar.gz: be20dd4c88cfdce89c87b828b2230d0c30db9e19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd005959f827838be1424b933cfedac56f15523cf785bf8be86e5654e6565041e878bd5b81ac7e26c01efb75648339469b88c485b3c8d129052822ce7e8b4af4
|
7
|
+
data.tar.gz: 155842d7fb91435f72b2bfeca5bc13ffa21901c4832157197d1aae522249f00f7aaf45458df1e04408ae17bd52c386c0791090d82ba5e24b1857f922cd90a266
|
data/README.md
CHANGED
@@ -4,6 +4,10 @@ Marta was planned as an element locating tool for Watir tests. But now Marta is
|
|
4
4
|
|
5
5
|
Also Marta is providing a little more stability when locating elements on the page.
|
6
6
|
|
7
|
+
## Refactoring notification.
|
8
|
+
|
9
|
+
Version 0.41245 (that one) is the version with new structure of data storing. Marta will try to convert old pajeobject json files to the new format automatically. But manual redefining is the safest way.
|
10
|
+
|
7
11
|
## Installation
|
8
12
|
|
9
13
|
Add this line to your application's Gemfile:
|
@@ -64,28 +68,45 @@ your_page.your_element.click
|
|
64
68
|
## FAQ
|
65
69
|
**Q: What if some attributes of elements will be changed?**
|
66
70
|
|
67
|
-
*A:
|
68
|
-
|
69
|
-
*NOTE: Exclude attributes with empty values as well. In later versions Marta will filter them out automatically.*
|
71
|
+
*A: Marta has her special Black Magic algorithm that will try to find the most similar element anyway.*
|
70
72
|
|
71
73
|
**Q: What if I can locate element only by dynamic attributes like account_id?**
|
72
74
|
|
73
|
-
*A: For example you
|
75
|
+
*A: For example you've got an element:*
|
76
|
+
|
77
|
+
```html
|
78
|
+
<span account_id="(notimportantpart)_2132">Account</span>
|
79
|
+
```
|
80
|
+
|
81
|
+
*where 2132 is a dynamic value that is not known at the begining of the test.*
|
74
82
|
|
75
|
-
*First at the stage of page defining create a class variable
|
83
|
+
*First at the stage of page defining create a class variable account_id = "anything".*
|
76
84
|
|
77
|
-
![Dynamic attributes - 1](readme_files/
|
85
|
+
![Dynamic attributes - 1](readme_files/account_id.png)
|
78
86
|
|
79
87
|
*After that you can dynamically change it in your code like*
|
80
88
|
```ruby
|
81
|
-
your_page.
|
82
|
-
your_page.
|
89
|
+
your_page.account_id # will be "anything" by default
|
90
|
+
your_page.account_id = "2132"
|
83
91
|
```
|
84
|
-
*
|
92
|
+
*At the stage of element defining you should be sure that your_page.account_id has your right value, just the same as in account_id attribute of your span. Just click on your span and Marta will remember that attribute automatically as an attribute with a dynamic part. Next time it will automatically change dynamic part of an attribute to your_page.account_id value.*
|
85
93
|
|
86
|
-
|
94
|
+
*If there are two dynamic attributes that are containing the same dynamic part. Like:*
|
95
|
+
```html
|
96
|
+
<span account_id="(notimportantpart)_2132" value="2132">Account</span>
|
97
|
+
```
|
98
|
+
*You can use variable with name containing both. Like:*
|
99
|
+
```ruby
|
100
|
+
your_page.account_id_and_value #=> whatever was set by default at the page defining stage.
|
101
|
+
your_page.account_id_and_value = "2132"
|
102
|
+
```
|
103
|
+
*Marta will understand it.*
|
87
104
|
|
88
|
-
*
|
105
|
+
*You can see an example of it in exapmle_project. Page variable id_and_value_for_radio is related to attributes id and value of the radio buttons*
|
106
|
+
|
107
|
+
**Q: And what about dynamic text?**
|
108
|
+
|
109
|
+
*The same story. Your page variable name should include 'text'*
|
89
110
|
|
90
111
|
**Q: I want to turn learning mode on\off in the code. How?**
|
91
112
|
|
@@ -142,6 +163,8 @@ TestPage.open_page("smthing.com") # Will navigate you to http://smthing.com
|
|
142
163
|
*Predefined url way:*
|
143
164
|
|
144
165
|
*At the step of the page defining set variable url = smthing.com*
|
166
|
+
![Url way - 1](readme_files/urlway.png)
|
167
|
+
*And in the code:*
|
145
168
|
```ruby
|
146
169
|
dance_with
|
147
170
|
test_page = TestPage.open_page # Will navigate you to http://smthing.com
|
@@ -151,6 +174,8 @@ test_page.url #=> "smthing.com"
|
|
151
174
|
*The most flexible way:*
|
152
175
|
|
153
176
|
*At the step of the page defining you set path = testpath*
|
177
|
+
![Path way - 1](readme_files/pathway.png)
|
178
|
+
*And in the code:*
|
154
179
|
```ruby
|
155
180
|
dance_with base_url: "smthing.com"
|
156
181
|
test_page = TestPage.open_page # Navigating you to http://smthing.com/testpath
|
@@ -177,9 +202,9 @@ test_page.method_edit("magic_button")
|
|
177
202
|
|
178
203
|
*A: You can set tolerancy parameter. Larger = longer*
|
179
204
|
```ruby
|
180
|
-
dance_with tolerancy:
|
205
|
+
dance_with tolerancy: 100000# is the default value
|
181
206
|
```
|
182
|
-
*
|
207
|
+
*The amount = 100000 means that Marta will look for element 3 times (with different settings) trying up to 100000 xpaths each iteration. She will generate all possible combinations at first. When she's getting closer to the limit she's starting to try more random xpaths*
|
183
208
|
|
184
209
|
**Q: Marta is trying to find the lost element after pretty long time. Why?**
|
185
210
|
|
@@ -213,9 +238,7 @@ engine.element(id: 'will_be_located_without_Marta')
|
|
213
238
|
|
214
239
|
**Q: How can I find an invisible element? Or hardly clickable element with 1px size?**
|
215
240
|
|
216
|
-
*A: At the stage of element defining you can
|
217
|
-
|
218
|
-
![HTML](readme_files/html.png)
|
241
|
+
*A: At the stage of element defining you can open devtools. Just find the element you want to find and click Import from Devtools button*
|
219
242
|
|
220
243
|
**Q: How can I find not just an element but a Watir::Radio for example?**
|
221
244
|
|
@@ -292,16 +315,16 @@ g_page.search "I am in love with selenium."
|
|
292
315
|
|
293
316
|
**Q: What about an example?**
|
294
317
|
|
295
|
-
*A: It is placed in example_project folder. All elements are defined already
|
318
|
+
*A: It is placed in example_project folder. All elements are defined already. For a tour do*
|
296
319
|
|
297
320
|
$ cd example_project
|
298
321
|
$ ./tests_with_learning.sh
|
299
322
|
|
300
|
-
*Take a look at elements defining
|
323
|
+
*Take a look at elements defining. Try to redefine elements. Also take a look at the ruby code. There are some comments.*
|
301
324
|
|
302
325
|
**Q: What else?**
|
303
326
|
|
304
|
-
*A: Nothing. Marta is under development. Her version is 0.
|
327
|
+
*A: Nothing. Marta is under development. Her version is 0.41245. All the necessary features are working already but there are tons of things that should be done. And I am not a professional developer.*
|
305
328
|
|
306
329
|
## Internal Design
|
307
330
|
|
@@ -8,7 +8,8 @@ class MyTestPage < MartaTestPage
|
|
8
8
|
some_field.set some
|
9
9
|
# We will choose radio dynamically. Note:
|
10
10
|
# the variable @r_select is defined at the page creation stage
|
11
|
-
@
|
11
|
+
@id_and_value_for_radio = r_selection
|
12
|
+
warn "r_select = #{@id_and_value_for_radio}"
|
12
13
|
dynamic_radio.set
|
13
14
|
dropbox.select selection
|
14
15
|
dummy_checkbox.set if confirmed
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<title>Example page</title>
|
3
3
|
<body>
|
4
4
|
<h1 id='Title'>Test page</h1>
|
5
|
-
<iframe src="
|
5
|
+
<iframe src="iframe.html" width=300 height=300></iframe>
|
6
6
|
<form>
|
7
7
|
<input type='text' class='some' placeholder='utka'>
|
8
8
|
<select custom='custom'>
|
@@ -1,182 +1,765 @@
|
|
1
1
|
{
|
2
|
-
"vars": {
|
3
|
-
"path": "test",
|
4
|
-
"r_select": "notdefined",
|
5
|
-
"url": ""
|
6
|
-
},
|
7
2
|
"meths": {
|
8
3
|
"numbers": {
|
9
4
|
"options": {
|
10
|
-
"collection": true
|
11
|
-
|
12
|
-
|
13
|
-
"
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
5
|
+
"collection": true
|
6
|
+
},
|
7
|
+
"positive": {
|
8
|
+
"self": {
|
9
|
+
"text": [
|
10
|
+
|
11
|
+
],
|
12
|
+
"tag": [
|
13
|
+
"LI"
|
14
|
+
],
|
15
|
+
"attributes": {
|
16
|
+
"class": [
|
17
|
+
"collection"
|
18
|
+
]
|
19
|
+
}
|
20
|
+
},
|
21
|
+
"pappy": {
|
22
|
+
"text": [
|
23
|
+
|
24
|
+
],
|
25
|
+
"tag": [
|
26
|
+
"UL"
|
27
|
+
],
|
28
|
+
"attributes": {
|
29
|
+
}
|
30
|
+
},
|
31
|
+
"granny": {
|
32
|
+
"text": [
|
33
|
+
|
34
|
+
],
|
35
|
+
"tag": [
|
36
|
+
"FORM"
|
37
|
+
],
|
38
|
+
"attributes": {
|
39
|
+
}
|
40
|
+
}
|
41
|
+
},
|
42
|
+
"negative": {
|
43
|
+
"self": {
|
44
|
+
"text": [
|
45
|
+
|
46
|
+
],
|
47
|
+
"tag": [
|
48
|
+
|
49
|
+
],
|
50
|
+
"attributes": {
|
51
|
+
}
|
52
|
+
},
|
53
|
+
"pappy": {
|
54
|
+
"text": [
|
55
|
+
|
56
|
+
],
|
57
|
+
"tag": [
|
58
|
+
|
59
|
+
],
|
60
|
+
"attributes": {
|
61
|
+
}
|
62
|
+
},
|
63
|
+
"granny": {
|
64
|
+
"text": [
|
65
|
+
|
66
|
+
],
|
67
|
+
"tag": [
|
68
|
+
|
69
|
+
],
|
70
|
+
"attributes": {
|
71
|
+
}
|
72
|
+
}
|
29
73
|
}
|
30
74
|
},
|
31
75
|
"some_field": {
|
32
|
-
"granny": {
|
33
|
-
},
|
34
76
|
"options": {
|
35
|
-
"collection": false
|
36
|
-
|
37
|
-
|
38
|
-
"self":
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
77
|
+
"collection": false
|
78
|
+
},
|
79
|
+
"positive": {
|
80
|
+
"self": {
|
81
|
+
"tag": [
|
82
|
+
"INPUT"
|
83
|
+
],
|
84
|
+
"text": [
|
85
|
+
|
86
|
+
],
|
87
|
+
"attributes": {
|
88
|
+
"class": [
|
89
|
+
"some"
|
90
|
+
],
|
91
|
+
"placeholder": [
|
92
|
+
"utka"
|
93
|
+
],
|
94
|
+
"type": [
|
95
|
+
"text"
|
96
|
+
]
|
97
|
+
}
|
98
|
+
},
|
99
|
+
"pappy": {
|
100
|
+
"tag": [
|
101
|
+
"FORM"
|
102
|
+
],
|
103
|
+
"text": [
|
104
|
+
|
105
|
+
],
|
106
|
+
"attributes": {
|
107
|
+
}
|
108
|
+
},
|
109
|
+
"granny": {
|
110
|
+
"tag": [
|
111
|
+
"BODY"
|
112
|
+
],
|
113
|
+
"text": [
|
114
|
+
|
115
|
+
],
|
116
|
+
"attributes": {
|
117
|
+
}
|
118
|
+
}
|
119
|
+
},
|
120
|
+
"negative": {
|
121
|
+
"self": {
|
122
|
+
"text": [
|
123
|
+
|
124
|
+
],
|
125
|
+
"tag": [
|
126
|
+
|
127
|
+
],
|
128
|
+
"attributes": {
|
129
|
+
}
|
130
|
+
},
|
131
|
+
"pappy": {
|
132
|
+
"text": [
|
133
|
+
|
134
|
+
],
|
135
|
+
"tag": [
|
136
|
+
|
137
|
+
],
|
138
|
+
"attributes": {
|
139
|
+
}
|
140
|
+
},
|
141
|
+
"granny": {
|
142
|
+
"text": [
|
143
|
+
|
144
|
+
],
|
145
|
+
"tag": [
|
146
|
+
|
147
|
+
],
|
148
|
+
"attributes": {
|
149
|
+
}
|
150
|
+
}
|
48
151
|
}
|
49
152
|
},
|
50
153
|
"dynamic_radio": {
|
51
|
-
"granny": {
|
52
|
-
},
|
53
154
|
"options": {
|
54
|
-
"collection": false
|
55
|
-
|
56
|
-
|
57
|
-
"self":
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
155
|
+
"collection": false
|
156
|
+
},
|
157
|
+
"positive": {
|
158
|
+
"self": {
|
159
|
+
"tag": [
|
160
|
+
"INPUT"
|
161
|
+
],
|
162
|
+
"text": [
|
163
|
+
|
164
|
+
],
|
165
|
+
"attributes": {
|
166
|
+
"id": [
|
167
|
+
"choice1"
|
168
|
+
],
|
169
|
+
"name": [
|
170
|
+
"contact"
|
171
|
+
],
|
172
|
+
"type": [
|
173
|
+
"radio"
|
174
|
+
],
|
175
|
+
"value": [
|
176
|
+
"1"
|
177
|
+
]
|
178
|
+
}
|
179
|
+
},
|
180
|
+
"pappy": {
|
181
|
+
"tag": [
|
182
|
+
"DIV"
|
183
|
+
],
|
184
|
+
"text": [
|
185
|
+
|
186
|
+
],
|
187
|
+
"attributes": {
|
188
|
+
}
|
189
|
+
},
|
190
|
+
"granny": {
|
191
|
+
"tag": [
|
192
|
+
"FORM"
|
193
|
+
],
|
194
|
+
"text": [
|
195
|
+
|
196
|
+
],
|
197
|
+
"attributes": {
|
198
|
+
}
|
199
|
+
}
|
200
|
+
},
|
201
|
+
"negative": {
|
202
|
+
"self": {
|
203
|
+
"text": [
|
204
|
+
|
205
|
+
],
|
206
|
+
"tag": [
|
207
|
+
|
208
|
+
],
|
209
|
+
"attributes": {
|
210
|
+
}
|
211
|
+
},
|
212
|
+
"pappy": {
|
213
|
+
"text": [
|
214
|
+
|
215
|
+
],
|
216
|
+
"tag": [
|
217
|
+
|
218
|
+
],
|
219
|
+
"attributes": {
|
220
|
+
}
|
221
|
+
},
|
222
|
+
"granny": {
|
223
|
+
"text": [
|
224
|
+
|
225
|
+
],
|
226
|
+
"tag": [
|
227
|
+
|
228
|
+
],
|
229
|
+
"attributes": {
|
230
|
+
}
|
231
|
+
}
|
66
232
|
}
|
67
233
|
},
|
68
234
|
"dropbox": {
|
69
|
-
"granny": {
|
70
|
-
},
|
71
235
|
"options": {
|
72
|
-
"collection": false
|
73
|
-
"granny": "BODY",
|
74
|
-
"pappy": "FORM",
|
75
|
-
"self": "SELECT"
|
236
|
+
"collection": false
|
76
237
|
},
|
77
|
-
"
|
238
|
+
"positive": {
|
239
|
+
"self": {
|
240
|
+
"tag": [
|
241
|
+
"SELECT"
|
242
|
+
],
|
243
|
+
"text": [
|
244
|
+
|
245
|
+
],
|
246
|
+
"attributes": {
|
247
|
+
"custom": [
|
248
|
+
"custom"
|
249
|
+
]
|
250
|
+
}
|
251
|
+
},
|
252
|
+
"pappy": {
|
253
|
+
"tag": [
|
254
|
+
"FORM"
|
255
|
+
],
|
256
|
+
"text": [
|
257
|
+
|
258
|
+
],
|
259
|
+
"attributes": {
|
260
|
+
}
|
261
|
+
},
|
262
|
+
"granny": {
|
263
|
+
"tag": [
|
264
|
+
"BODY"
|
265
|
+
],
|
266
|
+
"text": [
|
267
|
+
|
268
|
+
],
|
269
|
+
"attributes": {
|
270
|
+
}
|
271
|
+
}
|
78
272
|
},
|
79
|
-
"
|
80
|
-
"
|
81
|
-
|
273
|
+
"negative": {
|
274
|
+
"self": {
|
275
|
+
"text": [
|
276
|
+
|
277
|
+
],
|
278
|
+
"tag": [
|
279
|
+
|
280
|
+
],
|
281
|
+
"attributes": {
|
282
|
+
}
|
283
|
+
},
|
284
|
+
"pappy": {
|
285
|
+
"text": [
|
286
|
+
|
287
|
+
],
|
288
|
+
"tag": [
|
289
|
+
|
290
|
+
],
|
291
|
+
"attributes": {
|
292
|
+
}
|
293
|
+
},
|
294
|
+
"granny": {
|
295
|
+
"text": [
|
296
|
+
|
297
|
+
],
|
298
|
+
"tag": [
|
299
|
+
|
300
|
+
],
|
301
|
+
"attributes": {
|
302
|
+
}
|
303
|
+
}
|
82
304
|
}
|
83
305
|
},
|
84
306
|
"dummy_checkbox": {
|
85
|
-
"granny": {
|
86
|
-
},
|
87
307
|
"options": {
|
88
|
-
"collection": false
|
89
|
-
"granny": "FORM",
|
90
|
-
"pappy": "DIV",
|
91
|
-
"self": "INPUT"
|
308
|
+
"collection": false
|
92
309
|
},
|
93
|
-
"
|
310
|
+
"positive": {
|
311
|
+
"self": {
|
312
|
+
"tag": [
|
313
|
+
"INPUT"
|
314
|
+
],
|
315
|
+
"text": [
|
316
|
+
|
317
|
+
],
|
318
|
+
"attributes": {
|
319
|
+
"name": [
|
320
|
+
"checkbox"
|
321
|
+
],
|
322
|
+
"type": [
|
323
|
+
"checkbox"
|
324
|
+
],
|
325
|
+
"value": [
|
326
|
+
"checkbox"
|
327
|
+
]
|
328
|
+
}
|
329
|
+
},
|
330
|
+
"pappy": {
|
331
|
+
"tag": [
|
332
|
+
"DIV"
|
333
|
+
],
|
334
|
+
"text": [
|
335
|
+
|
336
|
+
],
|
337
|
+
"attributes": {
|
338
|
+
}
|
339
|
+
},
|
340
|
+
"granny": {
|
341
|
+
"tag": [
|
342
|
+
"FORM"
|
343
|
+
],
|
344
|
+
"text": [
|
345
|
+
|
346
|
+
],
|
347
|
+
"attributes": {
|
348
|
+
}
|
349
|
+
}
|
94
350
|
},
|
95
|
-
"
|
96
|
-
"
|
97
|
-
|
98
|
-
|
351
|
+
"negative": {
|
352
|
+
"self": {
|
353
|
+
"text": [
|
354
|
+
|
355
|
+
],
|
356
|
+
"tag": [
|
357
|
+
|
358
|
+
],
|
359
|
+
"attributes": {
|
360
|
+
}
|
361
|
+
},
|
362
|
+
"pappy": {
|
363
|
+
"text": [
|
364
|
+
|
365
|
+
],
|
366
|
+
"tag": [
|
367
|
+
|
368
|
+
],
|
369
|
+
"attributes": {
|
370
|
+
}
|
371
|
+
},
|
372
|
+
"granny": {
|
373
|
+
"text": [
|
374
|
+
|
375
|
+
],
|
376
|
+
"tag": [
|
377
|
+
|
378
|
+
],
|
379
|
+
"attributes": {
|
380
|
+
}
|
381
|
+
}
|
99
382
|
}
|
100
383
|
},
|
101
384
|
"confirmation_message": {
|
102
|
-
"granny": {
|
103
|
-
},
|
104
385
|
"options": {
|
105
|
-
"collection": false
|
106
|
-
"granny": "HTML",
|
107
|
-
"pappy": "BODY",
|
108
|
-
"self": "H1"
|
386
|
+
"collection": false
|
109
387
|
},
|
110
|
-
"
|
388
|
+
"positive": {
|
389
|
+
"self": {
|
390
|
+
"text": [
|
391
|
+
"1st button was clicked"
|
392
|
+
],
|
393
|
+
"tag": [
|
394
|
+
"H1"
|
395
|
+
],
|
396
|
+
"attributes": {
|
397
|
+
"id": [
|
398
|
+
"Title"
|
399
|
+
]
|
400
|
+
}
|
401
|
+
},
|
402
|
+
"pappy": {
|
403
|
+
"text": [
|
404
|
+
|
405
|
+
],
|
406
|
+
"tag": [
|
407
|
+
"BODY"
|
408
|
+
],
|
409
|
+
"attributes": {
|
410
|
+
}
|
411
|
+
},
|
412
|
+
"granny": {
|
413
|
+
"text": [
|
414
|
+
|
415
|
+
],
|
416
|
+
"tag": [
|
417
|
+
"HTML"
|
418
|
+
],
|
419
|
+
"attributes": {
|
420
|
+
}
|
421
|
+
}
|
111
422
|
},
|
112
|
-
"
|
113
|
-
"
|
114
|
-
|
423
|
+
"negative": {
|
424
|
+
"self": {
|
425
|
+
"text": [
|
426
|
+
|
427
|
+
],
|
428
|
+
"tag": [
|
429
|
+
|
430
|
+
],
|
431
|
+
"attributes": {
|
432
|
+
}
|
433
|
+
},
|
434
|
+
"pappy": {
|
435
|
+
"text": [
|
436
|
+
|
437
|
+
],
|
438
|
+
"tag": [
|
439
|
+
|
440
|
+
],
|
441
|
+
"attributes": {
|
442
|
+
}
|
443
|
+
},
|
444
|
+
"granny": {
|
445
|
+
"text": [
|
446
|
+
|
447
|
+
],
|
448
|
+
"tag": [
|
449
|
+
|
450
|
+
],
|
451
|
+
"attributes": {
|
452
|
+
}
|
453
|
+
}
|
115
454
|
}
|
116
455
|
},
|
117
456
|
"second_button": {
|
118
|
-
"granny": {
|
119
|
-
},
|
120
457
|
"options": {
|
121
|
-
"collection": false
|
122
|
-
"granny": "BODY",
|
123
|
-
"pappy": "FORM",
|
124
|
-
"self": "BUTTON"
|
458
|
+
"collection": false
|
125
459
|
},
|
126
|
-
"
|
460
|
+
"positive": {
|
461
|
+
"self": {
|
462
|
+
"tag": [
|
463
|
+
"BUTTON"
|
464
|
+
],
|
465
|
+
"text": [
|
466
|
+
"Second button"
|
467
|
+
],
|
468
|
+
"attributes": {
|
469
|
+
}
|
470
|
+
},
|
471
|
+
"pappy": {
|
472
|
+
"tag": [
|
473
|
+
"FORM"
|
474
|
+
],
|
475
|
+
"text": [
|
476
|
+
|
477
|
+
],
|
478
|
+
"attributes": {
|
479
|
+
}
|
480
|
+
},
|
481
|
+
"granny": {
|
482
|
+
"tag": [
|
483
|
+
"BODY"
|
484
|
+
],
|
485
|
+
"text": [
|
486
|
+
|
487
|
+
],
|
488
|
+
"attributes": {
|
489
|
+
}
|
490
|
+
}
|
127
491
|
},
|
128
|
-
"
|
129
|
-
"
|
492
|
+
"negative": {
|
493
|
+
"self": {
|
494
|
+
"text": [
|
495
|
+
|
496
|
+
],
|
497
|
+
"tag": [
|
498
|
+
|
499
|
+
],
|
500
|
+
"attributes": {
|
501
|
+
}
|
502
|
+
},
|
503
|
+
"pappy": {
|
504
|
+
"text": [
|
505
|
+
|
506
|
+
],
|
507
|
+
"tag": [
|
508
|
+
|
509
|
+
],
|
510
|
+
"attributes": {
|
511
|
+
}
|
512
|
+
},
|
513
|
+
"granny": {
|
514
|
+
"text": [
|
515
|
+
|
516
|
+
],
|
517
|
+
"tag": [
|
518
|
+
|
519
|
+
],
|
520
|
+
"attributes": {
|
521
|
+
}
|
522
|
+
}
|
130
523
|
}
|
131
524
|
},
|
132
525
|
"title": {
|
133
|
-
"granny": {
|
134
|
-
},
|
135
526
|
"options": {
|
136
|
-
"collection": false
|
137
|
-
"granny": "HTML",
|
138
|
-
"pappy": "BODY",
|
139
|
-
"self": "H1"
|
527
|
+
"collection": false
|
140
528
|
},
|
141
|
-
"
|
529
|
+
"positive": {
|
530
|
+
"self": {
|
531
|
+
"text": [
|
532
|
+
"Test page"
|
533
|
+
],
|
534
|
+
"tag": [
|
535
|
+
"H1"
|
536
|
+
],
|
537
|
+
"attributes": {
|
538
|
+
"id": [
|
539
|
+
"Title"
|
540
|
+
]
|
541
|
+
}
|
542
|
+
},
|
543
|
+
"pappy": {
|
544
|
+
"text": [
|
545
|
+
|
546
|
+
],
|
547
|
+
"tag": [
|
548
|
+
"BODY"
|
549
|
+
],
|
550
|
+
"attributes": {
|
551
|
+
}
|
552
|
+
},
|
553
|
+
"granny": {
|
554
|
+
"text": [
|
555
|
+
|
556
|
+
],
|
557
|
+
"tag": [
|
558
|
+
"HTML"
|
559
|
+
],
|
560
|
+
"attributes": {
|
561
|
+
}
|
562
|
+
}
|
142
563
|
},
|
143
|
-
"
|
144
|
-
"
|
145
|
-
|
564
|
+
"negative": {
|
565
|
+
"self": {
|
566
|
+
"text": [
|
567
|
+
|
568
|
+
],
|
569
|
+
"tag": [
|
570
|
+
|
571
|
+
],
|
572
|
+
"attributes": {
|
573
|
+
}
|
574
|
+
},
|
575
|
+
"pappy": {
|
576
|
+
"text": [
|
577
|
+
|
578
|
+
],
|
579
|
+
"tag": [
|
580
|
+
|
581
|
+
],
|
582
|
+
"attributes": {
|
583
|
+
}
|
584
|
+
},
|
585
|
+
"granny": {
|
586
|
+
"text": [
|
587
|
+
|
588
|
+
],
|
589
|
+
"tag": [
|
590
|
+
|
591
|
+
],
|
592
|
+
"attributes": {
|
593
|
+
}
|
594
|
+
}
|
146
595
|
}
|
147
596
|
},
|
148
597
|
"first_button": {
|
149
|
-
"granny": {
|
150
|
-
},
|
151
598
|
"options": {
|
152
|
-
"collection": false
|
153
|
-
"granny": "BODY",
|
154
|
-
"pappy": "FORM",
|
155
|
-
"self": "INPUT"
|
599
|
+
"collection": false
|
156
600
|
},
|
157
|
-
"
|
601
|
+
"positive": {
|
602
|
+
"self": {
|
603
|
+
"tag": [
|
604
|
+
"INPUT"
|
605
|
+
],
|
606
|
+
"text": [
|
607
|
+
|
608
|
+
],
|
609
|
+
"attributes": {
|
610
|
+
"onclick": [
|
611
|
+
"document.getElementById(\"Title\").innerHTML",
|
612
|
+
"=",
|
613
|
+
"\"1st",
|
614
|
+
"button",
|
615
|
+
"was",
|
616
|
+
"clicked\""
|
617
|
+
],
|
618
|
+
"type": [
|
619
|
+
"button"
|
620
|
+
],
|
621
|
+
"value": [
|
622
|
+
"First",
|
623
|
+
"button"
|
624
|
+
]
|
625
|
+
}
|
626
|
+
},
|
627
|
+
"pappy": {
|
628
|
+
"tag": [
|
629
|
+
"FORM"
|
630
|
+
],
|
631
|
+
"text": [
|
632
|
+
|
633
|
+
],
|
634
|
+
"attributes": {
|
635
|
+
}
|
636
|
+
},
|
637
|
+
"granny": {
|
638
|
+
"tag": [
|
639
|
+
"BODY"
|
640
|
+
],
|
641
|
+
"text": [
|
642
|
+
|
643
|
+
],
|
644
|
+
"attributes": {
|
645
|
+
}
|
646
|
+
}
|
158
647
|
},
|
159
|
-
"
|
160
|
-
"
|
161
|
-
|
648
|
+
"negative": {
|
649
|
+
"self": {
|
650
|
+
"text": [
|
651
|
+
|
652
|
+
],
|
653
|
+
"tag": [
|
654
|
+
|
655
|
+
],
|
656
|
+
"attributes": {
|
657
|
+
}
|
658
|
+
},
|
659
|
+
"pappy": {
|
660
|
+
"text": [
|
661
|
+
|
662
|
+
],
|
663
|
+
"tag": [
|
664
|
+
|
665
|
+
],
|
666
|
+
"attributes": {
|
667
|
+
}
|
668
|
+
},
|
669
|
+
"granny": {
|
670
|
+
"text": [
|
671
|
+
|
672
|
+
],
|
673
|
+
"tag": [
|
674
|
+
|
675
|
+
],
|
676
|
+
"attributes": {
|
677
|
+
}
|
678
|
+
}
|
162
679
|
}
|
163
680
|
},
|
164
681
|
"the_iframe": {
|
165
|
-
"granny": {
|
166
|
-
},
|
167
682
|
"options": {
|
168
|
-
"collection": false
|
169
|
-
"granny": "HTML",
|
170
|
-
"pappy": "BODY",
|
171
|
-
"self": "IFRAME"
|
683
|
+
"collection": false
|
172
684
|
},
|
173
|
-
"
|
685
|
+
"positive": {
|
686
|
+
"self": {
|
687
|
+
"tag": [
|
688
|
+
"IFRAME"
|
689
|
+
],
|
690
|
+
"text": [
|
691
|
+
|
692
|
+
],
|
693
|
+
"attributes": {
|
694
|
+
"height": [
|
695
|
+
"300"
|
696
|
+
],
|
697
|
+
"src": [
|
698
|
+
"iframe.html"
|
699
|
+
],
|
700
|
+
"width": [
|
701
|
+
"300"
|
702
|
+
]
|
703
|
+
}
|
704
|
+
},
|
705
|
+
"pappy": {
|
706
|
+
"tag": [
|
707
|
+
"BODY"
|
708
|
+
],
|
709
|
+
"text": [
|
710
|
+
|
711
|
+
],
|
712
|
+
"attributes": {
|
713
|
+
}
|
714
|
+
},
|
715
|
+
"granny": {
|
716
|
+
"tag": [
|
717
|
+
"HTML"
|
718
|
+
],
|
719
|
+
"text": [
|
720
|
+
|
721
|
+
],
|
722
|
+
"attributes": {
|
723
|
+
}
|
724
|
+
}
|
174
725
|
},
|
175
|
-
"
|
176
|
-
"
|
177
|
-
|
178
|
-
|
726
|
+
"negative": {
|
727
|
+
"self": {
|
728
|
+
"text": [
|
729
|
+
|
730
|
+
],
|
731
|
+
"tag": [
|
732
|
+
|
733
|
+
],
|
734
|
+
"attributes": {
|
735
|
+
}
|
736
|
+
},
|
737
|
+
"pappy": {
|
738
|
+
"text": [
|
739
|
+
|
740
|
+
],
|
741
|
+
"tag": [
|
742
|
+
|
743
|
+
],
|
744
|
+
"attributes": {
|
745
|
+
}
|
746
|
+
},
|
747
|
+
"granny": {
|
748
|
+
"text": [
|
749
|
+
|
750
|
+
],
|
751
|
+
"tag": [
|
752
|
+
|
753
|
+
],
|
754
|
+
"attributes": {
|
755
|
+
}
|
756
|
+
}
|
179
757
|
}
|
180
758
|
}
|
759
|
+
},
|
760
|
+
"vars": {
|
761
|
+
"id_and_value_for_radio": "notdefined",
|
762
|
+
"path": "index.html",
|
763
|
+
"url": ""
|
181
764
|
}
|
182
765
|
}
|