Skip to content

Commit 3a31616

Browse files
fix element click selector and link popup selector couldn't select elements with numeric ids. close #77
1 parent d7d278c commit 3a31616

File tree

4 files changed

+101
-13
lines changed

4 files changed

+101
-13
lines changed

extension/scripts/Selector/SelectorElementClick.js

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,33 @@ var SelectorElementClick = {
3232
return $(element).closest("html").length !== 0;
3333
},
3434

35+
getElementCSSSelector: function(element) {
36+
37+
var nthChild, prev;
38+
for(nthChild = 1, prev = element.previousElementSibling; prev !== null;prev = prev.previousElementSibling, nthChild++);
39+
var tagName = element.tagName.toLocaleLowerCase();
40+
var cssSelector = tagName+":nth-child("+nthChild+")";
41+
42+
while(element.parentElement) {
43+
element = element.parentElement;
44+
var tagName = element.tagName.toLocaleLowerCase();
45+
if(tagName === 'body' || tagName === 'html') {
46+
cssSelector = tagName+">"+cssSelector;
47+
}
48+
else {
49+
for(nthChild = 1, prev = element.previousElementSibling; prev !== null;prev = prev.previousElementSibling, nthChild++);
50+
cssSelector = tagName+":nth-child("+nthChild+")>"+cssSelector;
51+
}
52+
}
53+
54+
return cssSelector;
55+
},
56+
3557
triggerButtonClick: function(clickElement) {
3658

37-
var cs = new CssSelector({
38-
enableSmartTableSelector: false,
39-
parent: $("body")[0],
40-
enableResultStripping:false
41-
});
42-
var cssSelector = cs.getCssSelector([clickElement]);
59+
var cssSelector = this.getElementCSSSelector(clickElement);
4360

44-
// this function will catch window.open call and place the requested url as the elements data attribute
61+
// this function will trigger the click from browser land
4562
var script = document.createElement("script");
4663
script.type = "text/javascript";
4764
script.text = "" +

extension/scripts/Selector/SelectorPopupLink.js

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,28 @@ var SelectorPopupLink = {
6464
return dfd.promise();
6565
},
6666

67+
getElementCSSSelector: function(element) {
68+
69+
var nthChild, prev;
70+
for(nthChild = 1, prev = element.previousElementSibling; prev !== null;prev = prev.previousElementSibling, nthChild++);
71+
var tagName = element.tagName.toLocaleLowerCase();
72+
var cssSelector = tagName+":nth-child("+nthChild+")";
73+
74+
while(element.parentElement) {
75+
element = element.parentElement;
76+
var tagName = element.tagName.toLocaleLowerCase();
77+
if(tagName === 'body' || tagName === 'html') {
78+
cssSelector = tagName+">"+cssSelector;
79+
}
80+
else {
81+
for(nthChild = 1, prev = element.previousElementSibling; prev !== null;prev = prev.previousElementSibling, nthChild++);
82+
cssSelector = tagName+":nth-child("+nthChild+")>"+cssSelector;
83+
}
84+
}
85+
86+
return cssSelector;
87+
},
88+
6789
/**
6890
* Gets an url from a window.open call by mocking the window.open function
6991
* @param element
@@ -73,12 +95,7 @@ var SelectorPopupLink = {
7395

7496
// override window.open function. we need to execute this in page scope.
7597
// we need to know how to find this element from page scope.
76-
var cs = new CssSelector({
77-
enableSmartTableSelector: false,
78-
parent: $("body")[0],
79-
enableResultStripping:false
80-
});
81-
var cssSelector = cs.getCssSelector([element]);
98+
var cssSelector = this.getElementCSSSelector(element);
8299

83100
// this function will catch window.open call and place the requested url as the elements data attribute
84101
var script = document.createElement("script");

tests/spec/Selector/SelectorElementClickSpec.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,39 @@ describe("Click Element Selector", function () {
6060
});
6161
});
6262

63+
it("should be able to click on elemenets with numeric id #123", function () {
64+
65+
$el.append($("<a id='123'>a</a>"));
66+
$el.find("a").click(function() {
67+
$el.append("<div>test</div>");
68+
});
69+
70+
var selector = new Selector({
71+
id: 'div',
72+
type: 'SelectorElementClick',
73+
multiple: true,
74+
clickElementSelector: "a#123",
75+
selector: "div",
76+
clickType: 'clickOnce'
77+
});
78+
79+
var dataDeferred = selector.getData($el[0]);
80+
81+
waitsFor(function() {
82+
return dataDeferred.state() === 'resolved';
83+
}, "wait for data extraction", 5000);
84+
85+
runs(function () {
86+
87+
var data;
88+
dataDeferred.done(function(resultData) {
89+
data = resultData;
90+
});
91+
expect(data.length).toEqual(1);
92+
expect($(data).text()).toEqual("test");
93+
});
94+
});
95+
6396
it("should get elements that are available immediately after clicking", function() {
6497

6598
$el.append($("<a>a</a>"));

tests/spec/Selector/SelectorPopupLinkSpec.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,27 @@ describe("Popup link Selector", function () {
6262
]);
6363
});
6464

65+
it("should extract click on a button with a numeric id #123", function () {
66+
67+
$el.append("<a id='123' onclick=\"window.open('http://example.com/a')\">a</a>");
68+
69+
var selector = new Selector({
70+
id: 'a',
71+
type: 'SelectorPopupLink',
72+
multiple: false,
73+
selector: "a#123"
74+
});
75+
76+
var dataDeferred = selector.getData($el);
77+
78+
expect(dataDeferred).deferredToEqual([{
79+
a: "a",
80+
'a-href': "http://example.com/a",
81+
_follow: "http://example.com/a",
82+
_followSelectorId: "a"
83+
}]);
84+
});
85+
6586
it("should return data and url columns", function () {
6687
var selector = new Selector({
6788
id: 'id',

0 commit comments

Comments
 (0)