Dduvall has submitted this change and it was merged.

Change subject: Reimplement filtering using ES filters
......................................................................


Reimplement filtering using ES filters

Refactored type mappings to achieve a feature/scenario structure that is
more easily filtered in the Elasticsearch query. Removed client-side
filtering of feature elements.

Added mappings and test fixtures.

Change-Id: I647bb65f470ea9d62ed612ee2d7304a63fe35409
---
A db/mappings/build.json
A db/mappings/feature-element.json
A db/mappings/feature.json
M src/pl-build-features.tag
M src/pl-build-filter.tag
M src/pl-dashboard.tag
M src/platter.js
A test/fixtures/data.json
M test/fixtures/feature1.json
M test/fixtures/feature2.json
M test/fixtures/feature3.json
A test/fixtures/scenarios1.json
A test/fixtures/scenarios2.json
A test/fixtures/scenarios3.json
14 files changed, 316 insertions(+), 796 deletions(-)

Approvals:
  Dduvall: Verified; Looks good to me, approved



diff --git a/db/mappings/build.json b/db/mappings/build.json
new file mode 100644
index 0000000..5187d71
--- /dev/null
+++ b/db/mappings/build.json
@@ -0,0 +1,13 @@
+{
+       "build": {
+               "properties": {
+                       "build_number": { "type": "integer" },
+                       "result.status": { "type": "string", "index": 
"not_analyzed" },
+                       "result.duration": { "type": "long" }
+               },
+               "_timestamp": {
+                       "enabled": true,
+                       "store": true
+               }
+       }
+}
diff --git a/db/mappings/feature-element.json b/db/mappings/feature-element.json
new file mode 100644
index 0000000..66a517e
--- /dev/null
+++ b/db/mappings/feature-element.json
@@ -0,0 +1,34 @@
+{
+       "feature-element": {
+               "_parent": { "type": "feature" },
+               "properties": {
+                       "keyword": { "type": "string" },
+                       "name": { "type": "string" },
+                       "line": { "type": "integer" },
+                       "description": { "type": "string" },
+                       "tags": {
+                               "type": "nested",
+                               "properties": {
+                                       "name": { "type": "string", "index": 
"not_analyzed" },
+                                       "line": { "type": "integer" }
+                               }
+                       },
+                       "type": { "type": "string", "index": "not_analyzed" },
+                       "steps": {
+                               "type": "nested",
+                               "properties": {
+                                       "keyword": { "type": "string" },
+                                       "name": { "type": "string" },
+                                       "line": { "type": "integer" },
+                                       "match.arguments.offset": { "type": 
"integer", "index": "no" },
+                                       "match.arguments.val": { "type": 
"string", "index": "no" },
+                                       "match.location": { "type": "string", 
"index": "not_analyzed" },
+                                       "result.status": { "type": "string", 
"index": "not_analyzed" },
+                                       "result.duration": { "type": "long" }
+                               }
+                       }
+                       "result.status": { "type": "string", "index": 
"not_analyzed" },
+                       "result.duration": { "type": "long" }
+               }
+       }
+}
diff --git a/db/mappings/feature.json b/db/mappings/feature.json
new file mode 100644
index 0000000..722a9cb
--- /dev/null
+++ b/db/mappings/feature.json
@@ -0,0 +1,22 @@
+{
+       "feature": {
+               "_parent": { "type": "build" },
+               "properties": {
+                       "keyword": { "type": "string" },
+                       "name": { "type": "string" },
+                       "line": { "type": "integer" },
+                       "description": { "type": "string" },
+                       "tags": {
+                               "type": "nested",
+                               "properties": {
+                                       "name": { "type": "string", "index": 
"not_analyzed" },
+                                       "line": { "type": "integer" }
+                               }
+                       },
+                       "id": { "type": "string", "index": "not_analyzed" },
+                       "uri": { "type": "string", "index": "not_analyzed" },
+                       "result.status": { "type": "string", "index": 
"not_analyzed" },
+                       "result.duration": { "type": "long" }
+               }
+       }
+}
diff --git a/src/pl-build-features.tag b/src/pl-build-features.tag
index 71a4e86..20de155 100644
--- a/src/pl-build-features.tag
+++ b/src/pl-build-features.tag
@@ -1,5 +1,15 @@
 <pl-build-features>
        <div class="list-group">
-               <pl-feature each={ features } 
class="list-group-item"></pl-feature>
+               <pl-feature each={ nonEmptyFeatures() } 
class="list-group-item"></pl-feature>
        </div>
+
+       <script>
+               var self = this;
+
+               self.nonEmptyFeatures = function () {
+                       return self.features.filter(function (feature) {
+                               return feature.elements.length > 1 || 
feature.elements[0].type !== 'background';
+                       });
+               };
+       </script>
 </pl-build-features>
diff --git a/src/pl-build-filter.tag b/src/pl-build-filter.tag
index 542db45..9f1b5fa 100644
--- a/src/pl-build-filter.tag
+++ b/src/pl-build-filter.tag
@@ -1,7 +1,9 @@
 <pl-build-filter>
        <form onsubmit={ submit }>
                <div class="input-group">
-                       <span class="input-group-addon glyphicon 
glyphicon-filter"></span>
+                       <span class="input-group-btn">
+                               <button class="btn btn-default" type="button" 
onclick={ clear }><span class="glyphicon glyphicon-filter"></span></button>
+                       </span>
                        <input class="form-control" type="text" 
name="filterString" value="{ filterToString() }"
                                placeholder="e.g. 'status:failed', 
'status:skipped', '@some-tag-name'">
                        <span class="input-group-btn">
@@ -19,7 +21,7 @@
                        return str.split(/\s+/).map(function (item) {
                                var m, pair = {};
 
-                               if (m = item.match(/^@(.+)$/)) {
+                               if (m = item.match(/^(@.+)$/)) {
                                        pair.tag = m[1];
                                } else if (m = item.match(/^(status):(.+)$/)) {
                                        pair[m[1]] = m[2];
@@ -29,12 +31,18 @@
                        });
                }
 
+               self.clear = function () {
+                       self.filter = [];
+                       self.trigger('pl:filter', self.filter);
+                       self.filterString.focus();
+               };
+
                self.filterToString = function () {
                        return self.filter.map(function (pair) {
                                for (var k in pair) {
                                        switch (k) {
                                                case 'tag':
-                                                       return '@' + pair[k];
+                                                       return pair[k];
                                                default:
                                                        return k + ':' + 
pair[k];
                                        }
diff --git a/src/pl-dashboard.tag b/src/pl-dashboard.tag
index db29f3e..2926b5a 100644
--- a/src/pl-dashboard.tag
+++ b/src/pl-dashboard.tag
@@ -7,7 +7,8 @@
        <script>
                var self = this,
                                dash = opts,
-                               currentBuildId;
+                               currentBuildId,
+                               currentFeatures;
 
                self.on('mount', function () {
                        dash.loadBuilds();
@@ -28,7 +29,10 @@
                dash.subscribe(self, {
                        'load-build': function (id, build) {
                                currentBuildId = id;
-                               dash.loadFeatures(id);
+
+                               // Updating the filter triggers a reload of 
features
+                               // TODO this is confusing
+                               self.tags['pl-build-filter'].update({ filter: 
[] });
 
                                self.tags['pl-build-info'].update({ buildId: 
id, buildNumber: build.build_number });
                                self.tags['pl-builds'].update({ currentBuildId: 
id });
@@ -39,9 +43,26 @@
                        },
 
                        'load-build-features': function (buildId, features) {
-                               self.tags['pl-build-info'].update({ features: 
features });
-                               self.tags['pl-build-features'].update({ 
features: features });
-                       }
+                               currentFeatures = features;
+
+                               dash.loadElements(
+                                       features.map(function (f) { return 
f._id; }),
+                                       self.tags['pl-build-filter'].filter
+                               );
+                       },
+
+                       'load-build-features-elements': function (elements) {
+                               for (var fid in elements) {
+                                       for (var i = 0; i < 
currentFeatures.length; i++) {
+                                               if (currentFeatures[i]._id === 
fid) {
+                                                       
currentFeatures[i].elements = elements[fid];
+                                               }
+                                       }
+                               }
+
+                               self.tags['pl-build-info'].update({ features: 
currentFeatures });
+                               self.tags['pl-build-features'].update({ 
features: currentFeatures });
+                       },
                });
        </script>
 </pl-dashboard>
diff --git a/src/platter.js b/src/platter.js
index aebd407..1882f62 100644
--- a/src/platter.js
+++ b/src/platter.js
@@ -47,16 +47,31 @@
                        return request('get', pathTo(collection, id));
                };
 
-               self.search = function (collection, query) {
-                       return request('post', pathTo(collection, '_search'), 
query);
+               self.search = function (collection, query, fields) {
+                       fields = fields || [ '_source' ];
+                       return request('post', pathTo(collection, '_search') + 
'?fields=' + fields.join(','), query);
                };
 
-               self.sourcesOf = function (results) {
-                       var sources = [];
+               self.sourcesOf = function (results, mapByProperty) {
+                       var sources = mapByProperty ? {} : [];
 
                        for (var i = 0; i < results.length; i++) {
-                               sources.push(results[i]._source);
-                               sources[i]._id = results[i]._id;
+                               var source = results[i]._source;
+
+                               source._id = results[i]._id;
+
+                               if (results[i].fields) {
+                                       for (var k in results[i].fields) {
+                                               source[k] = 
results[i].fields[k];
+                                       }
+                               }
+
+                               if (mapByProperty) {
+                                       sources[source[mapByProperty]] = 
sources[source[mapByProperty]] || [];
+                                       
sources[source[mapByProperty]].push(source);
+                               } else {
+                                       sources.push(source);
+                               }
                        }
 
                        return sources;
@@ -69,30 +84,55 @@
                var self = {},
                                db = Platter.Database(dbURL);
 
-               self.compileUserFilter = function (ufilter) {
-                       var esfilter = { must: [], should: [] };
+               self.compileUserFilter = function (type, ufilter) {
+                       var esfilter = { bool: { must: [], should: [] } },
+                                       scoped;
+
+                       if (type === 'feature') {
+                               scoped = function (f) { return { has_child: { 
type: 'feature-element', filter: f } }; };
+                       } else {
+                               scoped = function (f) { return f; };
+                       }
+
+                       function stepStatus(vals) {
+                               return { nested: { path: 'steps', filter: { 
terms: { 'steps.result.status': vals } } } };
+                       }
 
                        if (ufilter) {
                                for (var i = 0; i < ufilter.length; i++) {
-                                       for (var k in ufilter[i]) {
-                                               var val = ufilter[i][k];
+                                       for (var key in ufilter[i]) {
+                                               var val = ufilter[i][key];
 
-                                               switch (k) {
+                                               switch (key) {
                                                        case 'tag':
-                                                               
esfilter.should.push({ term: { 'tags.name': val } });
+                                                               var filter = { 
nested: { path: 'tags', filter: { term: { 'tags.name': val } } } };
+
+                                                               
esfilter.bool.should.push(filter);
+
+                                                               if (type == 
'element') {
+                                                                       
esfilter.bool.should.push({ has_parent: { type: 'feature', filter: filter } });
+                                                               } else {
+                                                                       
esfilter.bool.should.push(scoped(filter));
+                                                               }
                                                                break;
                                                        case 'status':
-                                                               
esfilter.must.push({
-                                                                       nested: 
{
-                                                                               
path: 'elements.steps',
-                                                                               
filter: { term: { 'elements.steps.result.status': val } }
-                                                                       }
-                                                               });
+                                                               var filter;
+
+                                                               if (val === 
'passed') {
+                                                                       filter 
= { not: stepStatus(['failed', 'skipped']) };
+                                                               } else {
+                                                                       filter 
= stepStatus([val]);
+                                                               }
+
+                                                               
esfilter.bool.must.push(scoped(filter));
+
                                                                break;
                                                }
                                        }
                                }
                        }
+
+                       esfilter.bool = self.pruneFilter(esfilter.bool);
 
                        return esfilter;
                };
@@ -116,19 +156,51 @@
                        });
                };
 
-               self.loadFeatures = function (buildId, ufilter) {
-                       var filter = self.compileUserFilter(ufilter);
-                       filter.must.push({ has_parent: { type: 'build', filter: 
{ term: { _id: buildId } } } });
+               self.loadElements = function (featureIds, ufilter) {
+                       var elementFilter = {
+                               bool: {
+                                       must: { has_parent: { type: 'feature', 
filter: { ids: { values: featureIds } } } }
+                               }
+                       };
 
-                       if (filter.should.length === 0) {
-                               delete filter.should;
+                       ufilter = self.compileUserFilter('element', ufilter);
+
+                       if (Object.keys(ufilter.bool).length > 0) {
+                               elementFilter.bool.should = [
+                                       { term: { type: "background" } },
+                                       ufilter
+                               ];
                        }
 
-                       db.search('feature', { filter: { bool: filter } 
}).done(function (data) {
-                               var features = db.sourcesOf(data.hits.hits);
+                       db.search('feature-element', { filter: elementFilter }, 
[ '_source', '_parent'])
+                               .done(function (data) {
+                                       console.log(data);
+                                       
self.trigger('load-build-features-elements', db.sourcesOf(data.hits.hits, 
'_parent'));
+                               });
+               };
 
-                               self.postFilterScenarios(features, ufilter);
-                               self.trigger('load-build-features', buildId, 
features);
+               self.loadFeatures = function (buildId, ufilter) {
+                       var featureFilter = {
+                               bool: {
+                                       must: [ { has_parent: { type: 'build', 
filter: { term: { _id: buildId } } } } ]
+                               }
+                       };
+
+                       ufilter = self.compileUserFilter('feature', ufilter);
+
+                       if (ufilter.bool.must) {
+                               for (var i = 0; i < ufilter.bool.must.length; 
i++) {
+                                       
featureFilter.bool.must.push(ufilter.bool.must[i]);
+                               }
+                       }
+
+                       if (ufilter.bool.should) {
+                               featureFilter.bool.should = ufilter.bool.should;
+                       }
+
+                       db.search('feature', { filter: featureFilter 
}).done(function (data) {
+                               console.log(data);
+                               self.trigger('load-build-features', buildId, 
db.sourcesOf(data.hits.hits));
                        });
                };
 
@@ -145,69 +217,20 @@
                        });
                };
 
-               self.matchesFilter = function (element, ufilter) {
-                       var index = { tag: [], status: 'passed' },
-                                       filters = [],
-                                       matches = {},
-                                       match = true;
-
-                       if (!ufilter || element.type === 'background') {
-                               return true;
-                       }
-
-                       for (var i = 0; i < ufilter.length; i++) {
-                               for (var k in ufilter[i]) {
-                                       filters.push(k);
-                               }
-                       }
-
-                       if (element.name.match(/advanced setting/i)) debugger;
-
-                       for (var i = 0; i < element.steps.length; i++) {
-                               var step = element.steps[i];
-
-                               if (index.status !== 'failed' && 
step.result.status !== index.status) {
-                                       index.status = step.result.status;
-                               }
-
-                               for (var j = 0; step.tags && j < 
step.tags.length; j++) {
-                                       index.tag.push(step.tags[j].name);
-                               }
-                       }
-
-                       for (var k in index) {
-                               matches[k] = filters.indexOf(k) === -1;
-                       }
-
-                       for (var i = 0; i < ufilter.length; i++) {
-                               for (var k in ufilter[i]) {
-                                       if (typeof index[k] !== undefined) {
-                                               var val = ufilter[i][k];
-
-                                               if (index[k] === val || 
index[k].indexOf(val) > -1) {
-                                                       matches[k] = true;
-                                               }
-                                       }
-                               }
-                       }
-
-                       for (var k in matches) {
-                               match = match && matches[k];
-                       }
-
-                       return match;
-               };
-
                self.mount = function (selector) {
                        riot.mount(selector, 'pl-dashboard', self);
                };
 
-               self.postFilterScenarios = function (features, ufilter) {
-                       for (var i = 0; i < features.length; i++) {
-                               features[i].elements = 
features[i].elements.filter(function (element) {
-                                       return self.matchesFilter(element, 
ufilter);
-                               });
+               self.pruneFilter = function (filter) {
+                       var newFilter = {};
+
+                       for (var k in filter) {
+                               if (filter[k].length > 0) {
+                                       newFilter[k] = filter[k];
+                               }
                        }
+
+                       return newFilter;
                };
 
                self.route = function (collection, id) {
diff --git a/test/fixtures/data.json b/test/fixtures/data.json
new file mode 100644
index 0000000..9407bfe
--- /dev/null
+++ b/test/fixtures/data.json
@@ -0,0 +1,77 @@
+{ "index": { "_type":  "build", "_id": "b1" } }
+{ "build_number": 1 }
+
+{ "index": { "_type":  "feature", "_id": "b1f1", "_parent": "b1" } }
+{ "keyword": "Feature", "name": "VisualEditor Links", "line": 2, 
"description": "", "tags": [ { "name": "@en.wikipedia.beta.wmflabs.org", 
"line": 1 }, { "name": "@internet_explorer_10", "line": 1 }, { "name": 
"@login", "line": 1 }, { "name": "@test2.wikipedia.org", "line": 1 } ], "id": 
"visualeditor-links", "uri": "features/links.feature" }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f1e1", "_parent": "b1f1" } 
}
+{ "keyword": "Background", "name": "", "line": 4, "description": "", "type": 
"background", "steps": [ { "keyword": "Given ", "name": "I go to the \"Links 
VisualEditor Test\" page with content \"Links VisualEditor Test\"", "line": 5, 
"match": { "arguments": [ { "offset": 13, "val": "Links VisualEditor Test" }, { 
"offset": 57, "val": "Links VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 36398509000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1228741000 } }, { "keyword": "And ", "name": "I click the 
Link button", "line": 7, "match": { "location": 
"features/step_definitions/links_steps.rb:9" }, "result": { "status": "passed", 
"duration": 1342402000 } }, { "keyword": "And ", "name": "I can see the Link 
User Inteface", "line": 8, "match": { "location": 
"features/step_definitions/links_steps.rb:1" }, "result": { "status": "passed", 
"duration": 772573000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f1e2", "_parent": "b1f1" } 
}
+{ "keyword": "Scenario", "name": "Enter external link", "line": 10, 
"description": "", "id": "visualeditor-links;enter-external-link", "type": 
"scenario", "steps": [ { "keyword": "Given ", "name": "I go to the \"Links 
VisualEditor Test\" page with content \"Links VisualEditor Test\"", "line": 5, 
"match": { "arguments": [ { "offset": 13, "val": "Links VisualEditor Test" }, { 
"offset": 57, "val": "Links VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 262000 } }, { "keyword": "And ", "name": "I click in the 
editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 192000 } }, { "keyword": "And ", "name": "I click the 
Link button", "line": 7, "match": { "location": 
"features/step_definitions/links_steps.rb:9" }, "result": { "status": "passed", 
"duration": 188000 } }, { "keyword": "And ", "name": "I can see the Link User 
Inteface", "line": 8, "match": { "location": 
"features/step_definitions/links_steps.rb:1" }, "result": { "status": "passed", 
"duration": 440000 } }, { "keyword": "When ", "name": "I enter external link 
http://www.example.com into link Content box", "line": 11, "match": { 
"arguments": [{ "offset": 22, "val": "http://www.example.com"; }], "location": 
"features/step_definitions/links_steps.rb:13" }, "result": { "status": 
"passed", "duration": 17927988000 } }, { "keyword": "And ", "name": "I click 
Done to close Link User Interface", "line": 12, "match": { "location": 
"features/step_definitions/links_steps.rb:5" }, "result": { "status": "passed", 
"duration": 1003999 } }, { "keyword": "And ", "name": "I click Save page", 
"line": 13, "match": { "location": 
"features/step_definitions/shared_steps.rb:49" }, "result": { "status": 
"passed", "duration": 1200000 } }, { "keyword": "And ", "name": "I click Review 
your changes", "line": 14, "match": { "location": 
"features/step_definitions/shared_steps.rb:45" }, "result": { "status": 
"passed", "duration": 979000 } }, { "keyword": "Then ", "name": "an external 
link appears in the diff view", "line": 15, "match": { "location": 
"features/step_definitions/links_steps.rb:46" }, "result": { "status": 
"passed", "duration": 909000 } } ] }
+
+{ "index": { "_type":  "feature", "_id": "b1f2", "_parent": "b2" } }
+{ "keyword": "Feature", "name": "VisualEditor Options", "line": 2, 
"description": "", "tags": [ { "name": "@en.wikipedia.beta.wmflabs.org", 
"line": 1 }, { "name": "@firefox", "line": 1 }, { "name": 
"@internet_explorer_10", "line": 1 }, { "name": "@safari", "line": 1 }, { 
"name": "@test2.wikipedia.org", "line": 1 } ], "id": "visualeditor-options", 
"uri": "features/options.feature" }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f2e1", "_parent": "b1f2" } 
}
+{ "keyword": "Background", "name": "", "line": 4, "description": "", "type": 
"background", "steps": [ { "keyword": "Given ", "name": "I go to the \"Options 
VisualEditor Test\" page with content \"Options VisualEditor Test\"", "line": 
5, "match": { "arguments": [ { "offset": 13, "val": "Options VisualEditor Test" 
}, { "offset": 59, "val": "Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13995618000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1297954000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 2081309000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f2e2", "_parent": "b1f2" } 
}
+{ "keyword": "Scenario", "name": "Options", "line": 9, "description": "", 
"id": "visualeditor-options;options", "type": "scenario", "steps": [ { 
"keyword": "Given ", "name": "I go to the \"Options VisualEditor Test\" page 
with content \"Options VisualEditor Test\"", "line": 5, "match": { "arguments": 
[ { "offset": 13, "val": "Options VisualEditor Test" }, { "offset": 59, "val": 
"Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 248999 } }, { "keyword": "And ", "name": "I click in the 
editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 207000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 216000 } }, { "keyword": "When ", "name": "I click 
Options", "line": 10, "match": { "location": 
"features/step_definitions/options_steps.rb:33" }, "result": { "status": 
"passed", "duration": 1459172000 } }, { "keyword": "Then ", "name": "I should 
see the options overlay", "line": 11, "match": { "location": 
"features/step_definitions/options_steps.rb:69" }, "result": { "status": 
"passed", "duration": 1625016000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f2e3", "_parent": "b1f2" } 
}
+{ "keyword": "Scenario", "name": "Advanced Settings", "line": 13, 
"description": "", "id": "visualeditor-options;advanced-settings", "type": 
"scenario", "steps": [ { "keyword": "Given ", "name": "I go to the \"Options 
VisualEditor Test\" page with content \"Options VisualEditor Test\"", "line": 
5, "match": { "arguments": [ { "offset": 13, "val": "Options VisualEditor Test" 
}, { "offset": 59, "val": "Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 14652534000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1336753000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 1977429000 } }, { "keyword": "When ", "name": "I click 
Advanced Settings", "line": 14, "match": { "location": 
"features/step_definitions/options_steps.rb:21" }, "result": { "status": 
"passed", "duration": 1445250000 } }, { "keyword": "Then ", "name": "I should 
see the options overlay", "line": 15, "match": { "location": 
"features/step_definitions/options_steps.rb:69" }, "result": { "status": 
"passed", "duration": 1541360000 } }, { "keyword": "And ", "name": "the options 
overlay should display Advanced Settings", "line": 16, "match": { "location": 
"features/step_definitions/options_steps.rb:73" }, "result": { "status": 
"passed", "duration": 1258035000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f2e4", "_parent": "b1f2" } 
}
+{ "keyword": "Scenario", "name": "Page Settings", "line": 18, "description": 
"", "id": "visualeditor-options;page-settings", "type": "scenario", "steps": [ 
{ "keyword": "Given ", "name": "I go to the \"Options VisualEditor Test\" page 
with content \"Options VisualEditor Test\"", "line": 5, "match": { "arguments": 
[ { "offset": 13, "val": "Options VisualEditor Test" }, { "offset": 59, "val": 
"Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13775548000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1312728000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 2162537000 } }, { "keyword": "When ", "name": "I click 
Page Settings", "line": 19, "match": { "location": 
"features/step_definitions/options_steps.rb:37" }, "result": { "status": 
"passed", "duration": 1400966000 } }, { "keyword": "Then ", "name": "I should 
see the options overlay", "line": 20, "match": { "location": 
"features/step_definitions/options_steps.rb:69" }, "result": { "status": 
"passed", "duration": 1487332000 } }, { "keyword": "And ", "name": "the options 
overlay should display Page Settings", "line": 21, "match": { "location": 
"features/step_definitions/options_steps.rb:81" }, "result": { "status": 
"passed", "duration": 1056103999 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f2e5", "_parent": "b1f2" } 
}
+{ "keyword": "Scenario", "name": "Categories", "line": 23, "description": "", 
"id": "visualeditor-options;categories", "type": "scenario", "steps": [ { 
"keyword": "Given ", "name": "I go to the \"Options VisualEditor Test\" page 
with content \"Options VisualEditor Test\"", "line": 5, "match": { "arguments": 
[ { "offset": 13, "val": "Options VisualEditor Test" }, { "offset": 59, "val": 
"Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13972204000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1267778000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 2009850000 } }, { "keyword": "When ", "name": "I click 
Categories", "line": 24, "match": { "location": 
"features/step_definitions/options_steps.rb:29" }, "result": { "status": 
"passed", "duration": 1477469000 } }, { "keyword": "Then ", "name": "I should 
see the options overlay", "line": 25, "match": { "location": 
"features/step_definitions/options_steps.rb:69" }, "result": { "status": 
"passed", "duration": 2618606000 } }, { "keyword": "And ", "name": "the options 
overlay should display Categories", "line": 26, "match": { "location": 
"features/step_definitions/options_steps.rb:77" }, "result": { "status": 
"passed", "duration": 1304112000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f2e6", "_parent": "b1f2" } 
}
+{ "keyword": "Scenario", "name": "Advanced Settings setting fields", "line": 
28, "description": "", "id": 
"visualeditor-options;advanced-settings-setting-fields", "type": "scenario", 
"steps": [ { "keyword": "Given ", "name": "I go to the \"Options VisualEditor 
Test\" page with content \"Options VisualEditor Test\"", "line": 5, "match": { 
"arguments": [ { "offset": 13, "val": "Options VisualEditor Test" }, { 
"offset": 59, "val": "Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13794748000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1255158000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 2070142999 } }, { "keyword": "When ", "name": "I click 
Advanced Settings", "line": 29, "match": { "location": 
"features/step_definitions/options_steps.rb:21" }, "result": { "status": 
"passed", "duration": 1431204000 } }, { "keyword": "And ", "name": "I click Yes 
for Indexed by Search Engines", "line": 30, "match": { "location": 
"features/step_definitions/options_steps.rb:45" }, "result": { "status": 
"passed", "duration": 1390585000 } }, { "keyword": "And ", "name": "I click Yes 
for showing tab for adding new section", "line": 31, "match": { "location": 
"features/step_definitions/options_steps.rb:49" }, "result": { "status": 
"passed", "duration": 1215773000 } }, { "keyword": "And ", "name": "I check the 
option for Enable display title", "line": 32, "match": { "location": 
"features/step_definitions/options_steps.rb:1" }, "result": { "status": 
"failed", "error_message": "unable to locate element, using {:index=>4, 
:tag_name=>\"input\", :type=>\"checkbox\"} 
(Watir::Exception::UnknownObjectException)\n(eval):1:in 
`process_watir_call'\n./features/step_definitions/options_steps.rb:2:in `/^I 
check the option for Enable display title$/'\nfeatures/options.feature:32:in 
`And I check the option for Enable display title'", "duration": 311250000 } }, 
{ "keyword": "And ", "name": "I type \"automated test\" for display title 
textbox", "line": 33, "match": { "arguments": [{ "offset": 8, "val": "automated 
test" }], "location": "features/step_definitions/options_steps.rb:61" }, 
"result": { "status": "skipped", "duration": 962000 } }, { "keyword": "And ", 
"name": "I click Apply Changes button", "line": 34, "match": { "location": 
"features/step_definitions/options_steps.rb:25" }, "result": { "status": 
"skipped", "duration": 724000 } }, { "keyword": "And ", "name": "I click Save 
page", "line": 35, "match": { "location": 
"features/step_definitions/shared_steps.rb:49" }, "result": { "status": 
"skipped", "duration": 483000 } }, { "keyword": "And ", "name": "I click Review 
your changes", "line": 36, "match": { "location": 
"features/step_definitions/shared_steps.rb:45" }, "result": { "status": 
"skipped", "duration": 500000 } }, { "keyword": "Then ", "name": "the options 
set in Advanced Settings panel should appear in diff view", "line": 37, 
"match": { "location": "features/step_definitions/options_steps.rb:85" }, 
"result": { "status": "skipped", "duration": 889000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f2e7", "_parent": "b1f2" } 
}
+{ "keyword": "Scenario", "name": "Setting the fields in Page Settings", 
"line": 39, "description": "", "id": 
"visualeditor-options;setting-the-fields-in-page-settings", "type": "scenario", 
"steps": [ { "keyword": "Given ", "name": "I go to the \"Options VisualEditor 
Test\" page with content \"Options VisualEditor Test\"", "line": 5, "match": { 
"arguments": [ { "offset": 13, "val": "Options VisualEditor Test" }, { 
"offset": 59, "val": "Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13815343000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1220136000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 1182166000 } }, { "keyword": "When ", "name": "I click 
Page Settings", "line": 40, "match": { "location": 
"features/step_definitions/options_steps.rb:37" }, "result": { "status": 
"passed", "duration": 1356627000 } }, { "keyword": "And ", "name": "I check the 
option for Redirect this page to", "line": 41, "match": { "location": 
"features/step_definitions/options_steps.rb:13" }, "result": { "status": 
"passed", "duration": 1127131000 } }, { "keyword": "And ", "name": "I type 
\"Linux\" for redirect page", "line": 42, "match": { "arguments": [{ "offset": 
8, "val": "Linux" }], "location": 
"features/step_definitions/options_steps.rb:65" }, "result": { "status": 
"passed", "duration": 1645933000 } }, { "keyword": "And ", "name": "I check the 
option for Prevent this redirect being updated when target page is moved", 
"line": 43, "match": { "location": 
"features/step_definitions/options_steps.rb:9" }, "result": { "status": 
"passed", "duration": 995585000 } }, { "keyword": "And ", "name": "I select the 
option Always for showing Table of Contents", "line": 44, "match": { 
"location": "features/step_definitions/options_steps.rb:57" }, "result": { 
"status": "passed", "duration": 1277368000 } }, { "keyword": "And ", "name": "I 
check the option for Disable edit links next to each heading on this page", 
"line": 45, "match": { "location": 
"features/step_definitions/options_steps.rb:5" }, "result": { "status": 
"passed", "duration": 1002413000 } }, { "keyword": "And ", "name": "I check the 
option for This is a Disambiguation page", "line": 46, "match": { "location": 
"features/step_definitions/options_steps.rb:17" }, "result": { "status": 
"failed", "error_message": "Element is not currently visible and so may not be 
interacted with (Selenium::WebDriver::Error::ElementNotVisibleError)\n[remote 
server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12257:in
 `DelayedCommand.prototype.checkPreconditions_'\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12274:in
 `DelayedCommand.prototype.executeInternal_/h'\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12279:in
 `DelayedCommand.prototype.executeInternal_'\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12221:in
 `DelayedCommand.prototype.execute/<'\n(eval):1:in 
`process_watir_call'\n./features/step_definitions/options_steps.rb:18:in `/^I 
check the option for This is a Disambiguation 
page$/'\nfeatures/options.feature:46:in `And I check the option for This is a 
Disambiguation page'", "duration": 954323000 } }, { "keyword": "And ", "name": 
"I click Apply Changes button", "line": 47, "match": { "location": 
"features/step_definitions/options_steps.rb:25" }, "result": { "status": 
"skipped", "duration": 444000 } }, { "keyword": "And ", "name": "I click Save 
page", "line": 48, "match": { "location": 
"features/step_definitions/shared_steps.rb:49" }, "result": { "status": 
"skipped", "duration": 380000 } }, { "keyword": "And ", "name": "I click Review 
your changes", "line": 49, "match": { "location": 
"features/step_definitions/shared_steps.rb:45" }, "result": { "status": 
"skipped", "duration": 368000 } }, { "keyword": "Then ", "name": "the options 
set in Page Settings panel should appear in diff view", "line": 50, "match": { 
"location": "features/step_definitions/options_steps.rb:94" }, "result": { 
"status": "skipped", "duration": 764000 } } ] }
+
+{ "index": { "_type":  "feature", "_id": "b1f3", "_parent": "b3" } }
+{ "keyword": "Feature", "name": "VisualEditor References", "line": 2, 
"description": "", "tags": [ { "name": "@en.wikipedia.beta.wmflabs.org", 
"line": 1 }, { "name": "@firefox", "line": 1 }, { "name": 
"@internet_explorer_10", "line": 1 }, { "name": "@login", "line": 1 }, { 
"name": "@safari", "line": 1 }, { "name": "@test2.wikipedia.org", "line": 1 } 
], "id": "visualeditor-references", "uri": "features/references.feature" }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f3e1", "_parent": "b1f3" } 
}
+{ "keyword": "Background", "name": "", "line": 4, "description": "", "type": 
"background", "steps": [ { "keyword": "Given ", "name": "I go to a page that 
has references", "line": 5, "match": { "location": 
"features/step_definitions/references_steps.rb:1" }, "result": { "status": 
"passed", "duration": 15070603000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1305241000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b1f3e2", "_parent": "b1f3" } 
}
+{ "keyword": "Scenario", "name": "Creating References list", "line": 8, 
"description": "", "id": "visualeditor-references;creating-references-list", 
"type": "scenario", "steps": [ { "keyword": "Given ", "name": "I go to a page 
that has references", "line": 5, "match": { "location": 
"features/step_definitions/references_steps.rb:1" }, "result": { "status": 
"passed", "duration": 510999 } }, { "keyword": "And ", "name": "I click in the 
editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 402000 } }, { "keyword": "Given ", "name": "I click 
Reference", "line": 9, "match": { "location": 
"features/step_definitions/references_steps.rb:19" }, "result": { "status": 
"failed", "error_message": "timed out after 5 seconds, waiting for 
{:css=>\".ve-test-toolbar-insert > div:nth-child(2) > span:nth-child(8) > 
a:nth-child(1)\"} to become present 
(Watir::Wait::TimeoutError)\n./features/step_definitions/references_steps.rb:22:in
 `block (2 levels) in <top 
(required)>'\n/Users/dduvall/Projects/mediawiki/selenium/lib/mediawiki_selenium/page_factory.rb:30:in
 `block in 
on_page'\n/Users/dduvall/Projects/mediawiki/selenium/lib/mediawiki_selenium/page_factory.rb:19:in
 `on_page'\n./features/step_definitions/references_steps.rb:20:in `/^I click 
Reference$/'\nfeatures/references.feature:9:in `Given I click Reference'", 
"duration": 7321064000 } }, { "keyword": "And ", "name": "I can see the 
References User Interface", "line": 10, "match": { "location": 
"features/step_definitions/references_steps.rb:11" }, "result": { "status": 
"skipped", "duration": 800000 } }, { "keyword": "When ", "name": "I click 
Insert references list", "line": 11, "match": { "location": 
"features/step_definitions/references_steps.rb:15" }, "result": { "status": 
"skipped", "duration": 662000 } }, { "keyword": "Then ", "name": "link to 
Insert menu should be visible", "line": 12, "match": { "location": 
"features/step_definitions/references_steps.rb:53" }, "result": { "status": 
"skipped", "duration": 600000 } } ] }
+
+{ "index": { "_type":  "build", "_id": "b2" } }
+{ "build_number": 2 }
+
+{ "index": { "_type":  "feature", "_id": "b2f1", "_parent": "b2" } }
+{ "keyword": "Feature", "name": "VisualEditor Links", "line": 2, 
"description": "", "tags": [ { "name": "@en.wikipedia.beta.wmflabs.org", 
"line": 1 }, { "name": "@internet_explorer_10", "line": 1 }, { "name": 
"@login", "line": 1 }, { "name": "@test2.wikipedia.org", "line": 1 } ], "id": 
"visualeditor-links", "uri": "features/links.feature" }
+
+{ "index": { "_type":  "feature-element", "_id": "b2f1e1", "_parent": "b2f1" } 
}
+{ "keyword": "Background", "name": "", "line": 4, "description": "", "type": 
"background", "steps": [ { "keyword": "Given ", "name": "I go to the \"Links 
VisualEditor Test\" page with content \"Links VisualEditor Test\"", "line": 5, 
"match": { "arguments": [ { "offset": 13, "val": "Links VisualEditor Test" }, { 
"offset": 57, "val": "Links VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 36398509000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1228741000 } }, { "keyword": "And ", "name": "I click the 
Link button", "line": 7, "match": { "location": 
"features/step_definitions/links_steps.rb:9" }, "result": { "status": "passed", 
"duration": 1342402000 } }, { "keyword": "And ", "name": "I can see the Link 
User Inteface", "line": 8, "match": { "location": 
"features/step_definitions/links_steps.rb:1" }, "result": { "status": "passed", 
"duration": 772573000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b2f1e2", "_parent": "b2f1" } 
}
+{ "keyword": "Scenario", "name": "Enter external link", "line": 10, 
"description": "", "id": "visualeditor-links;enter-external-link", "type": 
"scenario", "steps": [ { "keyword": "Given ", "name": "I go to the \"Links 
VisualEditor Test\" page with content \"Links VisualEditor Test\"", "line": 5, 
"match": { "arguments": [ { "offset": 13, "val": "Links VisualEditor Test" }, { 
"offset": 57, "val": "Links VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 262000 } }, { "keyword": "And ", "name": "I click in the 
editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 192000 } }, { "keyword": "And ", "name": "I click the 
Link button", "line": 7, "match": { "location": 
"features/step_definitions/links_steps.rb:9" }, "result": { "status": "passed", 
"duration": 188000 } }, { "keyword": "And ", "name": "I can see the Link User 
Inteface", "line": 8, "match": { "location": 
"features/step_definitions/links_steps.rb:1" }, "result": { "status": "passed", 
"duration": 440000 } }, { "keyword": "When ", "name": "I enter external link 
http://www.example.com into link Content box", "line": 11, "match": { 
"arguments": [{ "offset": 22, "val": "http://www.example.com"; }], "location": 
"features/step_definitions/links_steps.rb:13" }, "result": { "status": 
"passed", "duration": 17927988000 } }, { "keyword": "And ", "name": "I click 
Done to close Link User Interface", "line": 12, "match": { "location": 
"features/step_definitions/links_steps.rb:5" }, "result": { "status": "passed", 
"duration": 1003999 } }, { "keyword": "And ", "name": "I click Save page", 
"line": 13, "match": { "location": 
"features/step_definitions/shared_steps.rb:49" }, "result": { "status": 
"passed", "duration": 1200000 } }, { "keyword": "And ", "name": "I click Review 
your changes", "line": 14, "match": { "location": 
"features/step_definitions/shared_steps.rb:45" }, "result": { "status": 
"passed", "duration": 979000 } }, { "keyword": "Then ", "name": "an external 
link appears in the diff view", "line": 15, "match": { "location": 
"features/step_definitions/links_steps.rb:46" }, "result": { "status": 
"passed", "duration": 909000 } } ] }
+
+{ "index": { "_type":  "feature", "_id": "b2f3", "_parent": "b3" } }
+{ "keyword": "Feature", "name": "VisualEditor References", "line": 2, 
"description": "", "tags": [ { "name": "@en.wikipedia.beta.wmflabs.org", 
"line": 1 }, { "name": "@firefox", "line": 1 }, { "name": 
"@internet_explorer_10", "line": 1 }, { "name": "@login", "line": 1 }, { 
"name": "@safari", "line": 1 }, { "name": "@test2.wikipedia.org", "line": 1 } 
], "id": "visualeditor-references", "uri": "features/references.feature" }
+
+{ "index": { "_type":  "feature-element", "_id": "b2f3e1", "_parent": "b2f3" } 
}
+{ "keyword": "Background", "name": "", "line": 4, "description": "", "type": 
"background", "steps": [ { "keyword": "Given ", "name": "I go to a page that 
has references", "line": 5, "match": { "location": 
"features/step_definitions/references_steps.rb:1" }, "result": { "status": 
"passed", "duration": 15070603000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1305241000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b2f3e2", "_parent": "b2f3" } 
}
+{ "keyword": "Scenario", "name": "Creating References list", "line": 8, 
"description": "", "id": "visualeditor-references;creating-references-list", 
"type": "scenario", "steps": [ { "keyword": "Given ", "name": "I go to a page 
that has references", "line": 5, "match": { "location": 
"features/step_definitions/references_steps.rb:1" }, "result": { "status": 
"passed", "duration": 510999 } }, { "keyword": "And ", "name": "I click in the 
editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 402000 } }, { "keyword": "Given ", "name": "I click 
Reference", "line": 9, "match": { "location": 
"features/step_definitions/references_steps.rb:19" }, "result": { "status": 
"failed", "error_message": "timed out after 5 seconds, waiting for 
{:css=>\".ve-test-toolbar-insert > div:nth-child(2) > span:nth-child(8) > 
a:nth-child(1)\"} to become present 
(Watir::Wait::TimeoutError)\n./features/step_definitions/references_steps.rb:22:in
 `block (2 levels) in <top 
(required)>'\n/Users/dduvall/Projects/mediawiki/selenium/lib/mediawiki_selenium/page_factory.rb:30:in
 `block in 
on_page'\n/Users/dduvall/Projects/mediawiki/selenium/lib/mediawiki_selenium/page_factory.rb:19:in
 `on_page'\n./features/step_definitions/references_steps.rb:20:in `/^I click 
Reference$/'\nfeatures/references.feature:9:in `Given I click Reference'", 
"duration": 7321064000 } }, { "keyword": "And ", "name": "I can see the 
References User Interface", "line": 10, "match": { "location": 
"features/step_definitions/references_steps.rb:11" }, "result": { "status": 
"skipped", "duration": 800000 } }, { "keyword": "When ", "name": "I click 
Insert references list", "line": 11, "match": { "location": 
"features/step_definitions/references_steps.rb:15" }, "result": { "status": 
"skipped", "duration": 662000 } }, { "keyword": "Then ", "name": "link to 
Insert menu should be visible", "line": 12, "match": { "location": 
"features/step_definitions/references_steps.rb:53" }, "result": { "status": 
"skipped", "duration": 600000 } } ] }
+
+{ "index": { "_type":  "build", "_id": "b3" } }
+{ "build_number": 3 }
+
+{ "index": { "_type":  "feature", "_id": "b3f1", "_parent": "b3" } }
+{ "keyword": "Feature", "name": "VisualEditor Links", "line": 2, 
"description": "", "tags": [ { "name": "@en.wikipedia.beta.wmflabs.org", 
"line": 1 }, { "name": "@internet_explorer_10", "line": 1 }, { "name": 
"@login", "line": 1 }, { "name": "@test2.wikipedia.org", "line": 1 } ], "id": 
"visualeditor-links", "uri": "features/links.feature" }
+
+{ "index": { "_type":  "feature-element", "_id": "b3f1e1", "_parent": "b3f1" } 
}
+{ "keyword": "Background", "name": "", "line": 4, "description": "", "type": 
"background", "steps": [ { "keyword": "Given ", "name": "I go to the \"Links 
VisualEditor Test\" page with content \"Links VisualEditor Test\"", "line": 5, 
"match": { "arguments": [ { "offset": 13, "val": "Links VisualEditor Test" }, { 
"offset": 57, "val": "Links VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 36398509000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1228741000 } }, { "keyword": "And ", "name": "I click the 
Link button", "line": 7, "match": { "location": 
"features/step_definitions/links_steps.rb:9" }, "result": { "status": "passed", 
"duration": 1342402000 } }, { "keyword": "And ", "name": "I can see the Link 
User Inteface", "line": 8, "match": { "location": 
"features/step_definitions/links_steps.rb:1" }, "result": { "status": "passed", 
"duration": 772573000 } } ] }
+
+{ "index": { "_type":  "feature-element", "_id": "b3f1e2", "_parent": "b3f1" } 
}
+{ "keyword": "Scenario", "name": "Enter external link", "line": 10, 
"description": "", "id": "visualeditor-links;enter-external-link", "type": 
"scenario", "steps": [ { "keyword": "Given ", "name": "I go to the \"Links 
VisualEditor Test\" page with content \"Links VisualEditor Test\"", "line": 5, 
"match": { "arguments": [ { "offset": 13, "val": "Links VisualEditor Test" }, { 
"offset": 57, "val": "Links VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 262000 } }, { "keyword": "And ", "name": "I click in the 
editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 192000 } }, { "keyword": "And ", "name": "I click the 
Link button", "line": 7, "match": { "location": 
"features/step_definitions/links_steps.rb:9" }, "result": { "status": "passed", 
"duration": 188000 } }, { "keyword": "And ", "name": "I can see the Link User 
Inteface", "line": 8, "match": { "location": 
"features/step_definitions/links_steps.rb:1" }, "result": { "status": "passed", 
"duration": 440000 } }, { "keyword": "When ", "name": "I enter external link 
http://www.example.com into link Content box", "line": 11, "match": { 
"arguments": [{ "offset": 22, "val": "http://www.example.com"; }], "location": 
"features/step_definitions/links_steps.rb:13" }, "result": { "status": 
"passed", "duration": 17927988000 } }, { "keyword": "And ", "name": "I click 
Done to close Link User Interface", "line": 12, "match": { "location": 
"features/step_definitions/links_steps.rb:5" }, "result": { "status": "passed", 
"duration": 1003999 } }, { "keyword": "And ", "name": "I click Save page", 
"line": 13, "match": { "location": 
"features/step_definitions/shared_steps.rb:49" }, "result": { "status": 
"passed", "duration": 1200000 } }, { "keyword": "And ", "name": "I click Review 
your changes", "line": 14, "match": { "location": 
"features/step_definitions/shared_steps.rb:45" }, "result": { "status": 
"passed", "duration": 979000 } }, { "keyword": "Then ", "name": "an external 
link appears in the diff view", "line": 15, "match": { "location": 
"features/step_definitions/links_steps.rb:46" }, "result": { "status": 
"passed", "duration": 909000 } } ] }
diff --git a/test/fixtures/feature1.json b/test/fixtures/feature1.json
index 0a979a5..db782fa 100644
--- a/test/fixtures/feature1.json
+++ b/test/fixtures/feature1.json
@@ -10,132 +10,5 @@
     { "name": "@test2.wikipedia.org", "line": 1 }
   ],
   "id": "visualeditor-links",
-  "uri": "features/links.feature",
-  "elements": [
-    {
-      "keyword": "Background",
-      "name": "",
-      "line": 4,
-      "description": "",
-      "type": "background",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to the \"Links VisualEditor Test\" page with content 
\"Links VisualEditor Test\"",
-          "line": 5,
-          "match": {
-            "arguments": [
-              { "offset": 13, "val": "Links VisualEditor Test" },
-              { "offset": 57, "val": "Links VisualEditor Test" }
-            ],
-            "location": "features/step_definitions/shared_steps.rb:17"
-          },
-          "result": { "status": "passed", "duration": 36398509000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 1228741000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click the Link button",
-          "line": 7,
-          "match": { "location": "features/step_definitions/links_steps.rb:9" 
},
-          "result": { "status": "passed", "duration": 1342402000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I can see the Link User Inteface",
-          "line": 8,
-          "match": { "location": "features/step_definitions/links_steps.rb:1" 
},
-          "result": { "status": "passed", "duration": 772573000 }
-        }
-      ]
-    },
-    {
-      "keyword": "Scenario",
-      "name": "Enter external link",
-      "line": 10,
-      "description": "",
-      "id": "visualeditor-links;enter-external-link",
-      "type": "scenario",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to the \"Links VisualEditor Test\" page with content 
\"Links VisualEditor Test\"",
-          "line": 5,
-          "match": {
-            "arguments": [
-              { "offset": 13, "val": "Links VisualEditor Test" },
-              { "offset": 57, "val": "Links VisualEditor Test" }
-            ],
-            "location": "features/step_definitions/shared_steps.rb:17"
-          },
-          "result": { "status": "passed", "duration": 262000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 192000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click the Link button",
-          "line": 7,
-          "match": { "location": "features/step_definitions/links_steps.rb:9" 
},
-          "result": { "status": "passed", "duration": 188000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I can see the Link User Inteface",
-          "line": 8,
-          "match": { "location": "features/step_definitions/links_steps.rb:1" 
},
-          "result": { "status": "passed", "duration": 440000 }
-        },
-        {
-          "keyword": "When ",
-          "name": "I enter external link http://www.example.com into link 
Content box",
-          "line": 11,
-          "match": {
-            "arguments": [{ "offset": 22, "val": "http://www.example.com"; }],
-            "location": "features/step_definitions/links_steps.rb:13"
-          },
-          "result": { "status": "passed", "duration": 17927988000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Done to close Link User Interface",
-          "line": 12,
-          "match": { "location": "features/step_definitions/links_steps.rb:5" 
},
-          "result": { "status": "passed", "duration": 1003999 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Save page",
-          "line": 13,
-          "match": { "location": 
"features/step_definitions/shared_steps.rb:49" },
-          "result": { "status": "passed", "duration": 1200000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Review your changes",
-          "line": 14,
-          "match": { "location": 
"features/step_definitions/shared_steps.rb:45" },
-          "result": { "status": "passed", "duration": 979000 }
-        },
-        {
-          "keyword": "Then ",
-          "name": "an external link appears in the diff view",
-          "line": 15,
-          "match": { "location": "features/step_definitions/links_steps.rb:46" 
},
-          "result": { "status": "passed", "duration": 909000 }
-        }
-      ]
-    }
-  ]
+  "uri": "features/links.feature"
 }
diff --git a/test/fixtures/feature2.json b/test/fixtures/feature2.json
index 544b0d1..283b87c 100644
--- a/test/fixtures/feature2.json
+++ b/test/fixtures/feature2.json
@@ -11,496 +11,5 @@
     { "name": "@test2.wikipedia.org", "line": 1 }
   ],
   "id": "visualeditor-options",
-  "uri": "features/options.feature",
-  "elements": [
-    {
-      "keyword": "Background",
-      "name": "",
-      "line": 4,
-      "description": "",
-      "type": "background",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to the \"Options VisualEditor Test\" page with content 
\"Options VisualEditor Test\"",
-          "line": 5,
-          "match": {
-            "arguments": [
-              { "offset": 13, "val": "Options VisualEditor Test" },
-              { "offset": 59, "val": "Options VisualEditor Test" }
-            ],
-            "location": "features/step_definitions/shared_steps.rb:17"
-          },
-          "result": { "status": "passed", "duration": 13995618000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 1297954000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click the hamburger menu",
-          "line": 7,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:41" },
-          "result": { "status": "passed", "duration": 2081309000 }
-        }
-      ]
-    },
-    {
-      "keyword": "Scenario",
-      "name": "Options",
-      "line": 9,
-      "description": "",
-      "id": "visualeditor-options;options",
-      "type": "scenario",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to the \"Options VisualEditor Test\" page with content 
\"Options VisualEditor Test\"",
-          "line": 5,
-          "match": {
-            "arguments": [
-              { "offset": 13, "val": "Options VisualEditor Test" },
-              { "offset": 59, "val": "Options VisualEditor Test" }
-            ],
-            "location": "features/step_definitions/shared_steps.rb:17"
-          },
-          "result": { "status": "passed", "duration": 248999 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 207000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click the hamburger menu",
-          "line": 7,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:41" },
-          "result": { "status": "passed", "duration": 216000 }
-        },
-        {
-          "keyword": "When ",
-          "name": "I click Options",
-          "line": 10,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:33" },
-          "result": { "status": "passed", "duration": 1459172000 }
-        },
-        {
-          "keyword": "Then ",
-          "name": "I should see the options overlay",
-          "line": 11,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:69" },
-          "result": { "status": "passed", "duration": 1625016000 }
-        }
-      ]
-    },
-    {
-      "keyword": "Scenario",
-      "name": "Advanced Settings",
-      "line": 13,
-      "description": "",
-      "id": "visualeditor-options;advanced-settings",
-      "type": "scenario",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to the \"Options VisualEditor Test\" page with content 
\"Options VisualEditor Test\"",
-          "line": 5,
-          "match": {
-            "arguments": [
-              { "offset": 13, "val": "Options VisualEditor Test" },
-              { "offset": 59, "val": "Options VisualEditor Test" }
-            ],
-            "location": "features/step_definitions/shared_steps.rb:17"
-          },
-          "result": { "status": "passed", "duration": 14652534000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 1336753000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click the hamburger menu",
-          "line": 7,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:41" },
-          "result": { "status": "passed", "duration": 1977429000 }
-        },
-        {
-          "keyword": "When ",
-          "name": "I click Advanced Settings",
-          "line": 14,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:21" },
-          "result": { "status": "passed", "duration": 1445250000 }
-        },
-        {
-          "keyword": "Then ",
-          "name": "I should see the options overlay",
-          "line": 15,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:69" },
-          "result": { "status": "passed", "duration": 1541360000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "the options overlay should display Advanced Settings",
-          "line": 16,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:73" },
-          "result": { "status": "passed", "duration": 1258035000 }
-        }
-      ]
-    },
-    {
-      "keyword": "Scenario",
-      "name": "Page Settings",
-      "line": 18,
-      "description": "",
-      "id": "visualeditor-options;page-settings",
-      "type": "scenario",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to the \"Options VisualEditor Test\" page with content 
\"Options VisualEditor Test\"",
-          "line": 5,
-          "match": {
-            "arguments": [
-              { "offset": 13, "val": "Options VisualEditor Test" },
-              { "offset": 59, "val": "Options VisualEditor Test" }
-            ],
-            "location": "features/step_definitions/shared_steps.rb:17"
-          },
-          "result": { "status": "passed", "duration": 13775548000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 1312728000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click the hamburger menu",
-          "line": 7,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:41" },
-          "result": { "status": "passed", "duration": 2162537000 }
-        },
-        {
-          "keyword": "When ",
-          "name": "I click Page Settings",
-          "line": 19,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:37" },
-          "result": { "status": "passed", "duration": 1400966000 }
-        },
-        {
-          "keyword": "Then ",
-          "name": "I should see the options overlay",
-          "line": 20,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:69" },
-          "result": { "status": "passed", "duration": 1487332000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "the options overlay should display Page Settings",
-          "line": 21,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:81" },
-          "result": { "status": "passed", "duration": 1056103999 }
-        }
-      ]
-    },
-    {
-      "keyword": "Scenario",
-      "name": "Categories",
-      "line": 23,
-      "description": "",
-      "id": "visualeditor-options;categories",
-      "type": "scenario",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to the \"Options VisualEditor Test\" page with content 
\"Options VisualEditor Test\"",
-          "line": 5,
-          "match": {
-            "arguments": [
-              { "offset": 13, "val": "Options VisualEditor Test" },
-              { "offset": 59, "val": "Options VisualEditor Test" }
-            ],
-            "location": "features/step_definitions/shared_steps.rb:17"
-          },
-          "result": { "status": "passed", "duration": 13972204000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 1267778000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click the hamburger menu",
-          "line": 7,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:41" },
-          "result": { "status": "passed", "duration": 2009850000 }
-        },
-        {
-          "keyword": "When ",
-          "name": "I click Categories",
-          "line": 24,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:29" },
-          "result": { "status": "passed", "duration": 1477469000 }
-        },
-        {
-          "keyword": "Then ",
-          "name": "I should see the options overlay",
-          "line": 25,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:69" },
-          "result": { "status": "passed", "duration": 2618606000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "the options overlay should display Categories",
-          "line": 26,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:77" },
-          "result": { "status": "passed", "duration": 1304112000 }
-        }
-      ]
-    },
-    {
-      "keyword": "Scenario",
-      "name": "Advanced Settings setting fields",
-      "line": 28,
-      "description": "",
-      "id": "visualeditor-options;advanced-settings-setting-fields",
-      "type": "scenario",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to the \"Options VisualEditor Test\" page with content 
\"Options VisualEditor Test\"",
-          "line": 5,
-          "match": {
-            "arguments": [
-              { "offset": 13, "val": "Options VisualEditor Test" },
-              { "offset": 59, "val": "Options VisualEditor Test" }
-            ],
-            "location": "features/step_definitions/shared_steps.rb:17"
-          },
-          "result": { "status": "passed", "duration": 13794748000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 1255158000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click the hamburger menu",
-          "line": 7,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:41" },
-          "result": { "status": "passed", "duration": 2070142999 }
-        },
-        {
-          "keyword": "When ",
-          "name": "I click Advanced Settings",
-          "line": 29,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:21" },
-          "result": { "status": "passed", "duration": 1431204000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Yes for Indexed by Search Engines",
-          "line": 30,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:45" },
-          "result": { "status": "passed", "duration": 1390585000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Yes for showing tab for adding new section",
-          "line": 31,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:49" },
-          "result": { "status": "passed", "duration": 1215773000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I check the option for Enable display title",
-          "line": 32,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:1" },
-          "result": {
-            "status": "failed",
-            "error_message": "unable to locate element, using {:index=>4, 
:tag_name=>\"input\", :type=>\"checkbox\"} 
(Watir::Exception::UnknownObjectException)\n(eval):1:in 
`process_watir_call'\n./features/step_definitions/options_steps.rb:2:in `/^I 
check the option for Enable display title$/'\nfeatures/options.feature:32:in 
`And I check the option for Enable display title'",
-            "duration": 311250000
-          }
-        },
-        {
-          "keyword": "And ",
-          "name": "I type \"automated test\" for display title textbox",
-          "line": 33,
-          "match": {
-            "arguments": [{ "offset": 8, "val": "automated test" }],
-            "location": "features/step_definitions/options_steps.rb:61"
-          },
-          "result": { "status": "skipped", "duration": 962000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Apply Changes button",
-          "line": 34,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:25" },
-          "result": { "status": "skipped", "duration": 724000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Save page",
-          "line": 35,
-          "match": { "location": 
"features/step_definitions/shared_steps.rb:49" },
-          "result": { "status": "skipped", "duration": 483000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Review your changes",
-          "line": 36,
-          "match": { "location": 
"features/step_definitions/shared_steps.rb:45" },
-          "result": { "status": "skipped", "duration": 500000 }
-        },
-        {
-          "keyword": "Then ",
-          "name": "the options set in Advanced Settings panel should appear in 
diff view",
-          "line": 37,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:85" },
-          "result": { "status": "skipped", "duration": 889000 }
-        }
-      ]
-    },
-    {
-      "keyword": "Scenario",
-      "name": "Setting the fields in Page Settings",
-      "line": 39,
-      "description": "",
-      "id": "visualeditor-options;setting-the-fields-in-page-settings",
-      "type": "scenario",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to the \"Options VisualEditor Test\" page with content 
\"Options VisualEditor Test\"",
-          "line": 5,
-          "match": {
-            "arguments": [
-              { "offset": 13, "val": "Options VisualEditor Test" },
-              { "offset": 59, "val": "Options VisualEditor Test" }
-            ],
-            "location": "features/step_definitions/shared_steps.rb:17"
-          },
-          "result": { "status": "passed", "duration": 13815343000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 1220136000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click the hamburger menu",
-          "line": 7,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:41" },
-          "result": { "status": "passed", "duration": 1182166000 }
-        },
-        {
-          "keyword": "When ",
-          "name": "I click Page Settings",
-          "line": 40,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:37" },
-          "result": { "status": "passed", "duration": 1356627000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I check the option for Redirect this page to",
-          "line": 41,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:13" },
-          "result": { "status": "passed", "duration": 1127131000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I type \"Linux\" for redirect page",
-          "line": 42,
-          "match": {
-            "arguments": [{ "offset": 8, "val": "Linux" }],
-            "location": "features/step_definitions/options_steps.rb:65"
-          },
-          "result": { "status": "passed", "duration": 1645933000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I check the option for Prevent this redirect being updated 
when target page is moved",
-          "line": 43,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:9" },
-          "result": { "status": "passed", "duration": 995585000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I select the option Always for showing Table of Contents",
-          "line": 44,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:57" },
-          "result": { "status": "passed", "duration": 1277368000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I check the option for Disable edit links next to each 
heading on this page",
-          "line": 45,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:5" },
-          "result": { "status": "passed", "duration": 1002413000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I check the option for This is a Disambiguation page",
-          "line": 46,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:17" },
-          "result": {
-            "status": "failed",
-            "error_message": "Element is not currently visible and so may not 
be interacted with 
(Selenium::WebDriver::Error::ElementNotVisibleError)\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12257:in
 `DelayedCommand.prototype.checkPreconditions_'\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12274:in
 `DelayedCommand.prototype.executeInternal_/h'\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12279:in
 `DelayedCommand.prototype.executeInternal_'\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12221:in
 `DelayedCommand.prototype.execute/<'\n(eval):1:in 
`process_watir_call'\n./features/step_definitions/options_steps.rb:18:in `/^I 
check the option for This is a Disambiguation 
page$/'\nfeatures/options.feature:46:in `And I check the option for This is a 
Disambiguation page'",
-            "duration": 954323000
-          }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Apply Changes button",
-          "line": 47,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:25" },
-          "result": { "status": "skipped", "duration": 444000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Save page",
-          "line": 48,
-          "match": { "location": 
"features/step_definitions/shared_steps.rb:49" },
-          "result": { "status": "skipped", "duration": 380000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click Review your changes",
-          "line": 49,
-          "match": { "location": 
"features/step_definitions/shared_steps.rb:45" },
-          "result": { "status": "skipped", "duration": 368000 }
-        },
-        {
-          "keyword": "Then ",
-          "name": "the options set in Page Settings panel should appear in 
diff view",
-          "line": 50,
-          "match": { "location": 
"features/step_definitions/options_steps.rb:94" },
-          "result": { "status": "skipped", "duration": 764000 }
-        }
-      ]
-    }
-  ]
+  "uri": "features/options.feature"
 }
diff --git a/test/fixtures/feature3.json b/test/fixtures/feature3.json
index 3f4f3b3..15a03e5 100644
--- a/test/fixtures/feature3.json
+++ b/test/fixtures/feature3.json
@@ -12,86 +12,5 @@
     { "name": "@test2.wikipedia.org", "line": 1 }
   ],
   "id": "visualeditor-references",
-  "uri": "features/references.feature",
-  "elements": [
-    {
-      "keyword": "Background",
-      "name": "",
-      "line": 4,
-      "description": "",
-      "type": "background",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to a page that has references",
-          "line": 5,
-          "match": { "location": 
"features/step_definitions/references_steps.rb:1" },
-          "result": { "status": "passed", "duration": 15070603000 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 1305241000 }
-        }
-      ]
-    },
-    {
-      "keyword": "Scenario",
-      "name": "Creating References list",
-      "line": 8,
-      "description": "",
-      "id": "visualeditor-references;creating-references-list",
-      "type": "scenario",
-      "steps": [
-        {
-          "keyword": "Given ",
-          "name": "I go to a page that has references",
-          "line": 5,
-          "match": { "location": 
"features/step_definitions/references_steps.rb:1" },
-          "result": { "status": "passed", "duration": 510999 }
-        },
-        {
-          "keyword": "And ",
-          "name": "I click in the editable part",
-          "line": 6,
-          "match": { "location": "features/step_definitions/shared_steps.rb:6" 
},
-          "result": { "status": "passed", "duration": 402000 }
-        },
-        {
-          "keyword": "Given ",
-          "name": "I click Reference",
-          "line": 9,
-          "match": { "location": 
"features/step_definitions/references_steps.rb:19" },
-          "result": {
-            "status": "failed",
-            "error_message": "timed out after 5 seconds, waiting for 
{:css=>\".ve-test-toolbar-insert > div:nth-child(2) > span:nth-child(8) > 
a:nth-child(1)\"} to become present 
(Watir::Wait::TimeoutError)\n./features/step_definitions/references_steps.rb:22:in
 `block (2 levels) in <top 
(required)>'\n/Users/dduvall/Projects/mediawiki/selenium/lib/mediawiki_selenium/page_factory.rb:30:in
 `block in 
on_page'\n/Users/dduvall/Projects/mediawiki/selenium/lib/mediawiki_selenium/page_factory.rb:19:in
 `on_page'\n./features/step_definitions/references_steps.rb:20:in `/^I click 
Reference$/'\nfeatures/references.feature:9:in `Given I click Reference'",
-            "duration": 7321064000
-          }
-        },
-        {
-          "keyword": "And ",
-          "name": "I can see the References User Interface",
-          "line": 10,
-          "match": { "location": 
"features/step_definitions/references_steps.rb:11" },
-          "result": { "status": "skipped", "duration": 800000 }
-        },
-        {
-          "keyword": "When ",
-          "name": "I click Insert references list",
-          "line": 11,
-          "match": { "location": 
"features/step_definitions/references_steps.rb:15" },
-          "result": { "status": "skipped", "duration": 662000 }
-        },
-        {
-          "keyword": "Then ",
-          "name": "link to Insert menu should be visible",
-          "line": 12,
-          "match": { "location": 
"features/step_definitions/references_steps.rb:53" },
-          "result": { "status": "skipped", "duration": 600000 }
-        }
-      ]
-    }
-  ]
+  "uri": "features/references.feature"
 }
diff --git a/test/fixtures/scenarios1.json b/test/fixtures/scenarios1.json
new file mode 100644
index 0000000..41700ed
--- /dev/null
+++ b/test/fixtures/scenarios1.json
@@ -0,0 +1,2 @@
+{ "keyword": "Background", "name": "", "line": 4, "description": "", "type": 
"background", "steps": [ { "keyword": "Given ", "name": "I go to the \"Links 
VisualEditor Test\" page with content \"Links VisualEditor Test\"", "line": 5, 
"match": { "arguments": [ { "offset": 13, "val": "Links VisualEditor Test" }, { 
"offset": 57, "val": "Links VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 36398509000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1228741000 } }, { "keyword": "And ", "name": "I click the 
Link button", "line": 7, "match": { "location": 
"features/step_definitions/links_steps.rb:9" }, "result": { "status": "passed", 
"duration": 1342402000 } }, { "keyword": "And ", "name": "I can see the Link 
User Inteface", "line": 8, "match": { "location": 
"features/step_definitions/links_steps.rb:1" }, "result": { "status": "passed", 
"duration": 772573000 } } ] }
+{ "keyword": "Scenario", "name": "Enter external link", "line": 10, 
"description": "", "id": "visualeditor-links;enter-external-link", "type": 
"scenario", "steps": [ { "keyword": "Given ", "name": "I go to the \"Links 
VisualEditor Test\" page with content \"Links VisualEditor Test\"", "line": 5, 
"match": { "arguments": [ { "offset": 13, "val": "Links VisualEditor Test" }, { 
"offset": 57, "val": "Links VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 262000 } }, { "keyword": "And ", "name": "I click in the 
editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 192000 } }, { "keyword": "And ", "name": "I click the 
Link button", "line": 7, "match": { "location": 
"features/step_definitions/links_steps.rb:9" }, "result": { "status": "passed", 
"duration": 188000 } }, { "keyword": "And ", "name": "I can see the Link User 
Inteface", "line": 8, "match": { "location": 
"features/step_definitions/links_steps.rb:1" }, "result": { "status": "passed", 
"duration": 440000 } }, { "keyword": "When ", "name": "I enter external link 
http://www.example.com into link Content box", "line": 11, "match": { 
"arguments": [{ "offset": 22, "val": "http://www.example.com"; }], "location": 
"features/step_definitions/links_steps.rb:13" }, "result": { "status": 
"passed", "duration": 17927988000 } }, { "keyword": "And ", "name": "I click 
Done to close Link User Interface", "line": 12, "match": { "location": 
"features/step_definitions/links_steps.rb:5" }, "result": { "status": "passed", 
"duration": 1003999 } }, { "keyword": "And ", "name": "I click Save page", 
"line": 13, "match": { "location": 
"features/step_definitions/shared_steps.rb:49" }, "result": { "status": 
"passed", "duration": 1200000 } }, { "keyword": "And ", "name": "I click Review 
your changes", "line": 14, "match": { "location": 
"features/step_definitions/shared_steps.rb:45" }, "result": { "status": 
"passed", "duration": 979000 } }, { "keyword": "Then ", "name": "an external 
link appears in the diff view", "line": 15, "match": { "location": 
"features/step_definitions/links_steps.rb:46" }, "result": { "status": 
"passed", "duration": 909000 } } ] }
diff --git a/test/fixtures/scenarios2.json b/test/fixtures/scenarios2.json
new file mode 100644
index 0000000..f411196
--- /dev/null
+++ b/test/fixtures/scenarios2.json
@@ -0,0 +1,7 @@
+{ "keyword": "Background", "name": "", "line": 4, "description": "", "type": 
"background", "steps": [ { "keyword": "Given ", "name": "I go to the \"Options 
VisualEditor Test\" page with content \"Options VisualEditor Test\"", "line": 
5, "match": { "arguments": [ { "offset": 13, "val": "Options VisualEditor Test" 
}, { "offset": 59, "val": "Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13995618000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1297954000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 2081309000 } } ] }
+{ "keyword": "Scenario", "name": "Options", "line": 9, "description": "", 
"id": "visualeditor-options;options", "type": "scenario", "steps": [ { 
"keyword": "Given ", "name": "I go to the \"Options VisualEditor Test\" page 
with content \"Options VisualEditor Test\"", "line": 5, "match": { "arguments": 
[ { "offset": 13, "val": "Options VisualEditor Test" }, { "offset": 59, "val": 
"Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 248999 } }, { "keyword": "And ", "name": "I click in the 
editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 207000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 216000 } }, { "keyword": "When ", "name": "I click 
Options", "line": 10, "match": { "location": 
"features/step_definitions/options_steps.rb:33" }, "result": { "status": 
"passed", "duration": 1459172000 } }, { "keyword": "Then ", "name": "I should 
see the options overlay", "line": 11, "match": { "location": 
"features/step_definitions/options_steps.rb:69" }, "result": { "status": 
"passed", "duration": 1625016000 } } ] }
+{ "keyword": "Scenario", "name": "Advanced Settings", "line": 13, 
"description": "", "id": "visualeditor-options;advanced-settings", "type": 
"scenario", "steps": [ { "keyword": "Given ", "name": "I go to the \"Options 
VisualEditor Test\" page with content \"Options VisualEditor Test\"", "line": 
5, "match": { "arguments": [ { "offset": 13, "val": "Options VisualEditor Test" 
}, { "offset": 59, "val": "Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 14652534000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1336753000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 1977429000 } }, { "keyword": "When ", "name": "I click 
Advanced Settings", "line": 14, "match": { "location": 
"features/step_definitions/options_steps.rb:21" }, "result": { "status": 
"passed", "duration": 1445250000 } }, { "keyword": "Then ", "name": "I should 
see the options overlay", "line": 15, "match": { "location": 
"features/step_definitions/options_steps.rb:69" }, "result": { "status": 
"passed", "duration": 1541360000 } }, { "keyword": "And ", "name": "the options 
overlay should display Advanced Settings", "line": 16, "match": { "location": 
"features/step_definitions/options_steps.rb:73" }, "result": { "status": 
"passed", "duration": 1258035000 } } ] }
+{ "keyword": "Scenario", "name": "Page Settings", "line": 18, "description": 
"", "id": "visualeditor-options;page-settings", "type": "scenario", "steps": [ 
{ "keyword": "Given ", "name": "I go to the \"Options VisualEditor Test\" page 
with content \"Options VisualEditor Test\"", "line": 5, "match": { "arguments": 
[ { "offset": 13, "val": "Options VisualEditor Test" }, { "offset": 59, "val": 
"Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13775548000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1312728000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 2162537000 } }, { "keyword": "When ", "name": "I click 
Page Settings", "line": 19, "match": { "location": 
"features/step_definitions/options_steps.rb:37" }, "result": { "status": 
"passed", "duration": 1400966000 } }, { "keyword": "Then ", "name": "I should 
see the options overlay", "line": 20, "match": { "location": 
"features/step_definitions/options_steps.rb:69" }, "result": { "status": 
"passed", "duration": 1487332000 } }, { "keyword": "And ", "name": "the options 
overlay should display Page Settings", "line": 21, "match": { "location": 
"features/step_definitions/options_steps.rb:81" }, "result": { "status": 
"passed", "duration": 1056103999 } } ] }
+{ "keyword": "Scenario", "name": "Categories", "line": 23, "description": "", 
"id": "visualeditor-options;categories", "type": "scenario", "steps": [ { 
"keyword": "Given ", "name": "I go to the \"Options VisualEditor Test\" page 
with content \"Options VisualEditor Test\"", "line": 5, "match": { "arguments": 
[ { "offset": 13, "val": "Options VisualEditor Test" }, { "offset": 59, "val": 
"Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13972204000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1267778000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 2009850000 } }, { "keyword": "When ", "name": "I click 
Categories", "line": 24, "match": { "location": 
"features/step_definitions/options_steps.rb:29" }, "result": { "status": 
"passed", "duration": 1477469000 } }, { "keyword": "Then ", "name": "I should 
see the options overlay", "line": 25, "match": { "location": 
"features/step_definitions/options_steps.rb:69" }, "result": { "status": 
"passed", "duration": 2618606000 } }, { "keyword": "And ", "name": "the options 
overlay should display Categories", "line": 26, "match": { "location": 
"features/step_definitions/options_steps.rb:77" }, "result": { "status": 
"passed", "duration": 1304112000 } } ] }
+{ "keyword": "Scenario", "name": "Advanced Settings setting fields", "line": 
28, "description": "", "id": 
"visualeditor-options;advanced-settings-setting-fields", "type": "scenario", 
"steps": [ { "keyword": "Given ", "name": "I go to the \"Options VisualEditor 
Test\" page with content \"Options VisualEditor Test\"", "line": 5, "match": { 
"arguments": [ { "offset": 13, "val": "Options VisualEditor Test" }, { 
"offset": 59, "val": "Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13794748000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1255158000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 2070142999 } }, { "keyword": "When ", "name": "I click 
Advanced Settings", "line": 29, "match": { "location": 
"features/step_definitions/options_steps.rb:21" }, "result": { "status": 
"passed", "duration": 1431204000 } }, { "keyword": "And ", "name": "I click Yes 
for Indexed by Search Engines", "line": 30, "match": { "location": 
"features/step_definitions/options_steps.rb:45" }, "result": { "status": 
"passed", "duration": 1390585000 } }, { "keyword": "And ", "name": "I click Yes 
for showing tab for adding new section", "line": 31, "match": { "location": 
"features/step_definitions/options_steps.rb:49" }, "result": { "status": 
"passed", "duration": 1215773000 } }, { "keyword": "And ", "name": "I check the 
option for Enable display title", "line": 32, "match": { "location": 
"features/step_definitions/options_steps.rb:1" }, "result": { "status": 
"failed", "error_message": "unable to locate element, using {:index=>4, 
:tag_name=>\"input\", :type=>\"checkbox\"} 
(Watir::Exception::UnknownObjectException)\n(eval):1:in 
`process_watir_call'\n./features/step_definitions/options_steps.rb:2:in `/^I 
check the option for Enable display title$/'\nfeatures/options.feature:32:in 
`And I check the option for Enable display title'", "duration": 311250000 } }, 
{ "keyword": "And ", "name": "I type \"automated test\" for display title 
textbox", "line": 33, "match": { "arguments": [{ "offset": 8, "val": "automated 
test" }], "location": "features/step_definitions/options_steps.rb:61" }, 
"result": { "status": "skipped", "duration": 962000 } }, { "keyword": "And ", 
"name": "I click Apply Changes button", "line": 34, "match": { "location": 
"features/step_definitions/options_steps.rb:25" }, "result": { "status": 
"skipped", "duration": 724000 } }, { "keyword": "And ", "name": "I click Save 
page", "line": 35, "match": { "location": 
"features/step_definitions/shared_steps.rb:49" }, "result": { "status": 
"skipped", "duration": 483000 } }, { "keyword": "And ", "name": "I click Review 
your changes", "line": 36, "match": { "location": 
"features/step_definitions/shared_steps.rb:45" }, "result": { "status": 
"skipped", "duration": 500000 } }, { "keyword": "Then ", "name": "the options 
set in Advanced Settings panel should appear in diff view", "line": 37, 
"match": { "location": "features/step_definitions/options_steps.rb:85" }, 
"result": { "status": "skipped", "duration": 889000 } } ] }
+{ "keyword": "Scenario", "name": "Setting the fields in Page Settings", 
"line": 39, "description": "", "id": 
"visualeditor-options;setting-the-fields-in-page-settings", "type": "scenario", 
"steps": [ { "keyword": "Given ", "name": "I go to the \"Options VisualEditor 
Test\" page with content \"Options VisualEditor Test\"", "line": 5, "match": { 
"arguments": [ { "offset": 13, "val": "Options VisualEditor Test" }, { 
"offset": 59, "val": "Options VisualEditor Test" } ], "location": 
"features/step_definitions/shared_steps.rb:17" }, "result": { "status": 
"passed", "duration": 13815343000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1220136000 } }, { "keyword": "And ", "name": "I click the 
hamburger menu", "line": 7, "match": { "location": 
"features/step_definitions/options_steps.rb:41" }, "result": { "status": 
"passed", "duration": 1182166000 } }, { "keyword": "When ", "name": "I click 
Page Settings", "line": 40, "match": { "location": 
"features/step_definitions/options_steps.rb:37" }, "result": { "status": 
"passed", "duration": 1356627000 } }, { "keyword": "And ", "name": "I check the 
option for Redirect this page to", "line": 41, "match": { "location": 
"features/step_definitions/options_steps.rb:13" }, "result": { "status": 
"passed", "duration": 1127131000 } }, { "keyword": "And ", "name": "I type 
\"Linux\" for redirect page", "line": 42, "match": { "arguments": [{ "offset": 
8, "val": "Linux" }], "location": 
"features/step_definitions/options_steps.rb:65" }, "result": { "status": 
"passed", "duration": 1645933000 } }, { "keyword": "And ", "name": "I check the 
option for Prevent this redirect being updated when target page is moved", 
"line": 43, "match": { "location": 
"features/step_definitions/options_steps.rb:9" }, "result": { "status": 
"passed", "duration": 995585000 } }, { "keyword": "And ", "name": "I select the 
option Always for showing Table of Contents", "line": 44, "match": { 
"location": "features/step_definitions/options_steps.rb:57" }, "result": { 
"status": "passed", "duration": 1277368000 } }, { "keyword": "And ", "name": "I 
check the option for Disable edit links next to each heading on this page", 
"line": 45, "match": { "location": 
"features/step_definitions/options_steps.rb:5" }, "result": { "status": 
"passed", "duration": 1002413000 } }, { "keyword": "And ", "name": "I check the 
option for This is a Disambiguation page", "line": 46, "match": { "location": 
"features/step_definitions/options_steps.rb:17" }, "result": { "status": 
"failed", "error_message": "Element is not currently visible and so may not be 
interacted with (Selenium::WebDriver::Error::ElementNotVisibleError)\n[remote 
server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12257:in
 `DelayedCommand.prototype.checkPreconditions_'\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12274:in
 `DelayedCommand.prototype.executeInternal_/h'\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12279:in
 `DelayedCommand.prototype.executeInternal_'\n[remote server] 
file:///var/folders/65/_x0d5xfx62dg61__x6cy3pz40000gp/T/webdriver-profile20150408-73323-lcegcm/extensions/fxdri...@googlecode.com/components/command-processor.js:12221:in
 `DelayedCommand.prototype.execute/<'\n(eval):1:in 
`process_watir_call'\n./features/step_definitions/options_steps.rb:18:in `/^I 
check the option for This is a Disambiguation 
page$/'\nfeatures/options.feature:46:in `And I check the option for This is a 
Disambiguation page'", "duration": 954323000 } }, { "keyword": "And ", "name": 
"I click Apply Changes button", "line": 47, "match": { "location": 
"features/step_definitions/options_steps.rb:25" }, "result": { "status": 
"skipped", "duration": 444000 } }, { "keyword": "And ", "name": "I click Save 
page", "line": 48, "match": { "location": 
"features/step_definitions/shared_steps.rb:49" }, "result": { "status": 
"skipped", "duration": 380000 } }, { "keyword": "And ", "name": "I click Review 
your changes", "line": 49, "match": { "location": 
"features/step_definitions/shared_steps.rb:45" }, "result": { "status": 
"skipped", "duration": 368000 } }, { "keyword": "Then ", "name": "the options 
set in Page Settings panel should appear in diff view", "line": 50, "match": { 
"location": "features/step_definitions/options_steps.rb:94" }, "result": { 
"status": "skipped", "duration": 764000 } } ] }
diff --git a/test/fixtures/scenarios3.json b/test/fixtures/scenarios3.json
new file mode 100644
index 0000000..e808d11
--- /dev/null
+++ b/test/fixtures/scenarios3.json
@@ -0,0 +1,2 @@
+{ "keyword": "Background", "name": "", "line": 4, "description": "", "type": 
"background", "steps": [ { "keyword": "Given ", "name": "I go to a page that 
has references", "line": 5, "match": { "location": 
"features/step_definitions/references_steps.rb:1" }, "result": { "status": 
"passed", "duration": 15070603000 } }, { "keyword": "And ", "name": "I click in 
the editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 1305241000 } } ] }
+{ "keyword": "Scenario", "name": "Creating References list", "line": 8, 
"description": "", "id": "visualeditor-references;creating-references-list", 
"type": "scenario", "steps": [ { "keyword": "Given ", "name": "I go to a page 
that has references", "line": 5, "match": { "location": 
"features/step_definitions/references_steps.rb:1" }, "result": { "status": 
"passed", "duration": 510999 } }, { "keyword": "And ", "name": "I click in the 
editable part", "line": 6, "match": { "location": 
"features/step_definitions/shared_steps.rb:6" }, "result": { "status": 
"passed", "duration": 402000 } }, { "keyword": "Given ", "name": "I click 
Reference", "line": 9, "match": { "location": 
"features/step_definitions/references_steps.rb:19" }, "result": { "status": 
"failed", "error_message": "timed out after 5 seconds, waiting for 
{:css=>\".ve-test-toolbar-insert > div:nth-child(2) > span:nth-child(8) > 
a:nth-child(1)\"} to become present 
(Watir::Wait::TimeoutError)\n./features/step_definitions/references_steps.rb:22:in
 `block (2 levels) in <top 
(required)>'\n/Users/dduvall/Projects/mediawiki/selenium/lib/mediawiki_selenium/page_factory.rb:30:in
 `block in 
on_page'\n/Users/dduvall/Projects/mediawiki/selenium/lib/mediawiki_selenium/page_factory.rb:19:in
 `on_page'\n./features/step_definitions/references_steps.rb:20:in `/^I click 
Reference$/'\nfeatures/references.feature:9:in `Given I click Reference'", 
"duration": 7321064000 } }, { "keyword": "And ", "name": "I can see the 
References User Interface", "line": 10, "match": { "location": 
"features/step_definitions/references_steps.rb:11" }, "result": { "status": 
"skipped", "duration": 800000 } }, { "keyword": "When ", "name": "I click 
Insert references list", "line": 11, "match": { "location": 
"features/step_definitions/references_steps.rb:15" }, "result": { "status": 
"skipped", "duration": 662000 } }, { "keyword": "Then ", "name": "link to 
Insert menu should be visible", "line": 12, "match": { "location": 
"features/step_definitions/references_steps.rb:53" }, "result": { "status": 
"skipped", "duration": 600000 } } ] }

-- 
To view, visit https://gerrit.wikimedia.org/r/206871
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I647bb65f470ea9d62ed612ee2d7304a63fe35409
Gerrit-PatchSet: 1
Gerrit-Project: integration/raita
Gerrit-Branch: master
Gerrit-Owner: Dduvall <dduv...@wikimedia.org>
Gerrit-Reviewer: Dduvall <dduv...@wikimedia.org>
Gerrit-Reviewer: Hashar <has...@free.fr>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to