Skip to content

Commit 4859052

Browse files
committed
closes #43: executeScript doesn't return values of JS variables. bug.
1 parent b949291 commit 4859052

File tree

6 files changed

+77
-37
lines changed

6 files changed

+77
-37
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "webdriver-sync",
3-
"version": "0.8.4",
3+
"version": "0.8.5",
44
"description": "Synchronous testing with Selenium and node.js!",
55
"main": "src/webdriver-sync.js",
66
"directories": {

src/classPaths.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ module.exports = {
2121
List: 'java.util.List',
2222
LocalFileDetector: 'org.openqa.selenium.remote.LocalFileDetector',
2323
Long: 'java.lang.Long',
24+
Map: 'java.util.Map',
2425
OutputType: 'org.openqa.selenium.OutputType',
2526
Platform: 'org.openqa.selenium.Platform',
2627
Point: 'org.openqa.selenium.Point',

src/interfaces/JavascriptExecutor.js

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
var addFinalProp = require('../utils').addFinalProp;
2-
var toArray = require('../utils').collectionToArray;
1+
var utils = require('../utils');
2+
var addFinalProp = utils.addFinalProp;
3+
var toArray = utils.collectionToArray;
4+
var toObject = utils.mapToObject;
35
var classPaths = require('../classPaths');
46
var wd = require('../webdriver-sync');
57
var WebElement = wd.WebElement;
@@ -11,13 +13,15 @@ module.exports = JavascriptExecutor;
1113
function JavascriptExecutor(instance) {
1214
addFinalProp(this, "_instance", instance);
1315
}
16+
1417
JavascriptExecutor.prototype.executeAsyncScript = function() {
1518
var result = this._instance.executeAsyncScriptSync.apply(
1619
this._instance,
1720
getArgs(arguments)
1821
);
1922
return coerce(result);
2023
};
24+
2125
JavascriptExecutor.prototype.executeScript = function() {
2226
var result = this._instance.executeScriptSync.apply(
2327
this._instance,
@@ -27,8 +31,6 @@ JavascriptExecutor.prototype.executeScript = function() {
2731
};
2832

2933
function coerce(result) {
30-
var checked;
31-
var isWebElementArray = false;
3234
if (result === void 0 || result === null)
3335
return null;
3436
if (typeof result !== 'object')
@@ -38,16 +40,12 @@ function coerce(result) {
3840
if (java.instanceOf(result, classPaths.Long))
3941
return result.longValue;
4042
if (java.instanceOf(result, classPaths.List)) {
41-
return toArray(result, function(item) {
42-
if (!checked) {
43-
checked = true;
44-
isWebElementArray = java.instanceOf(item, classPaths.WebElement);
45-
}
46-
if (isWebElementArray)
47-
return new WebElement(item);
48-
return item;
49-
});
43+
return toArray(result, coerce);
44+
}
45+
if (java.instanceOf(result, classPaths.Map)) {
46+
return toObject(result, coerce);
5047
}
48+
return result;
5149
}
5250

5351
function getArgs(from) {

src/utils.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ var Map = require('./imports').helpers.Map;
33
var addFinalProp = function(obj, prop, val) {
44
obj[prop] = val;
55
};
6+
67
var collectionToArray = function(collection, mapper) {
78
var array = [];
89
var _mapper = typeof mapper === 'function'
@@ -37,6 +38,7 @@ function extend(Child, Parent) {
3738
}
3839
Child.__extends[Parent.name] = true;
3940
}
41+
4042
function extendAll() {
4143
var args = toArray(arguments);
4244
var Child = args.splice(0, 1)[0];
@@ -50,9 +52,10 @@ function extendAll() {
5052
extend(Child, args[i]);
5153
}
5254
}
55+
5356
function mapToObject(map, mapper) {
54-
var keys = map.keySetSync();
55-
var len = keys.size();
57+
var keys = map.keySetSync().toArraySync();
58+
var len = keys.length;
5659
var i;
5760
var key;
5861
var obj = {};
@@ -62,11 +65,12 @@ function mapToObject(map, mapper) {
6265
return item;
6366
};
6467
for (i = 0; i < len; i++) {
65-
key = keys.getSync(i);
68+
key = keys[i];
6669
obj[key] = _mapper(map.getSync(key));
6770
}
6871
return obj;
6972
}
73+
7074
function objectToMap(obj) {
7175
var key;
7276
var map = Map.createWithStringKeysSync();
@@ -92,11 +96,13 @@ function objectToMapStringString(obj) {
9296
function toArray(arr) {
9397
return Array.prototype.slice.call(arr);
9498
}
99+
95100
function toStringArray(arr) {
96101
return toArray(arr).map(function(v) {
97102
return (new String(v)).toString();
98103
});
99104
}
105+
100106
module.exports.addFinalProp = addFinalProp;
101107
module.exports.collectionToArray = collectionToArray;
102108
module.exports.extend = extend;

test/classes/ChromeDriver.js

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ describe("ChromeDriver", function() {
1111
driver.get('http://google.com');
1212
});
1313

14+
after(function(){
15+
driver.quit();
16+
});
17+
1418
it("can execute javascript synchronously", function() {
1519
driver.executeScript('alert(5);');
1620
driver.switchTo().alert().accept();
@@ -20,24 +24,4 @@ describe("ChromeDriver", function() {
2024
driver.executeScript('alert(6);');
2125
driver.switchTo().alert().accept();
2226
});
23-
24-
it("can return a WebElement", function() {
25-
var el = driver.executeScript('return document.querySelector("[name=q]");');
26-
assert(el instanceof WebElement);
27-
});
28-
29-
it("can return an array of WebElements", function() {
30-
var divs = driver.executeScript('return document.querySelectorAll("div");');
31-
divs.forEach(function(div) {
32-
assert(div instanceof WebElement);
33-
});
34-
});
35-
36-
it("can return numbers", function() {
37-
assert.equal(driver.executeScript("return 5;"), 5);
38-
});
39-
40-
it("can return strings", function() {
41-
assert.equal(driver.executeScript("return 'boo';"), 'boo');
42-
});
4327
});

test/interfaces/JavascriptExecutor.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
describe("ChromeDriver", function() {
2+
var assert = require('assert');
3+
var path = require('path');
4+
var driver = require(path.resolve(__dirname, '..', 'lib', 'driver')).driver;
5+
var WebElement = require(
6+
path.resolve(__dirname, '..', '..', 'src', 'webdriver-sync')
7+
).WebElement;
8+
9+
beforeEach(function() {
10+
driver.get('http://google.com');
11+
});
12+
13+
after(function(){
14+
driver.quit();
15+
});
16+
17+
it("can return a WebElement", function() {
18+
var el = driver.executeScript('return document.querySelector("[name=q]");');
19+
assert(el instanceof WebElement);
20+
});
21+
22+
it("can return an array of WebElements", function() {
23+
var divs = driver.executeScript('return document.querySelectorAll("div");');
24+
divs.forEach(function(div) {
25+
assert(div instanceof WebElement);
26+
});
27+
});
28+
29+
it("can return numbers", function() {
30+
assert.equal(driver.executeScript("return 5;"), 5);
31+
});
32+
33+
it("can return strings", function() {
34+
assert.equal(driver.executeScript("return 'boo';"), 'boo');
35+
});
36+
37+
it("can return objects", function() {
38+
var result = driver.executeScript("return {asdf:5};");
39+
assert.equal(result.asdf, 5);
40+
});
41+
42+
it("can return arrays", function() {
43+
var result = driver.executeScript("return ['boo'];");
44+
assert.equal(result[0], 'boo');
45+
});
46+
47+
it("handles nested arrays and objects", function(){
48+
var result = driver.executeScript("return {arr:['boo'],obj:{asdf:5}};");
49+
assert.equal(result.arr[0]+result.obj.asdf, 'boo5');
50+
});
51+
});

0 commit comments

Comments
 (0)