rainux-selenium-webdriver 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +204 -0
- data/chrome/prebuilt/Win32/Release/npchromedriver.dll +0 -0
- data/chrome/prebuilt/x64/Release/npchromedriver.dll +0 -0
- data/chrome/src/extension/background.html +9 -0
- data/chrome/src/extension/background.js +995 -0
- data/chrome/src/extension/content_script.js +1321 -0
- data/chrome/src/extension/icons/busy.png +0 -0
- data/chrome/src/extension/icons/free.png +0 -0
- data/chrome/src/extension/manifest-nonwin.json +19 -0
- data/chrome/src/extension/manifest-win.json +20 -0
- data/chrome/src/extension/utils.js +231 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome.rb +8 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +358 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/command_executor.rb +124 -0
- data/chrome/src/rb/lib/selenium/webdriver/chrome/launcher.rb +135 -0
- data/common/src/js/abstractcommandprocessor.js +134 -0
- data/common/src/js/asserts.js +296 -0
- data/common/src/js/by.js +149 -0
- data/common/src/js/command.js +304 -0
- data/common/src/js/context.js +58 -0
- data/common/src/js/core/Blank.html +7 -0
- data/common/src/js/core/InjectedRemoteRunner.html +8 -0
- data/common/src/js/core/RemoteRunner.html +101 -0
- data/common/src/js/core/SeleniumLog.html +109 -0
- data/common/src/js/core/TestPrompt.html +145 -0
- data/common/src/js/core/TestRunner-splash.html +55 -0
- data/common/src/js/core/TestRunner.html +165 -0
- data/common/src/js/core/icons/all.png +0 -0
- data/common/src/js/core/icons/continue.png +0 -0
- data/common/src/js/core/icons/continue_disabled.png +0 -0
- data/common/src/js/core/icons/pause.png +0 -0
- data/common/src/js/core/icons/pause_disabled.png +0 -0
- data/common/src/js/core/icons/selected.png +0 -0
- data/common/src/js/core/icons/step.png +0 -0
- data/common/src/js/core/icons/step_disabled.png +0 -0
- data/common/src/js/core/lib/cssQuery/cssQuery-p.js +6 -0
- data/common/src/js/core/lib/cssQuery/src/cssQuery-level2.js +142 -0
- data/common/src/js/core/lib/cssQuery/src/cssQuery-level3.js +150 -0
- data/common/src/js/core/lib/cssQuery/src/cssQuery-standard.js +53 -0
- data/common/src/js/core/lib/cssQuery/src/cssQuery.js +356 -0
- data/common/src/js/core/lib/prototype.js +2006 -0
- data/common/src/js/core/lib/scriptaculous/builder.js +101 -0
- data/common/src/js/core/lib/scriptaculous/controls.js +815 -0
- data/common/src/js/core/lib/scriptaculous/dragdrop.js +915 -0
- data/common/src/js/core/lib/scriptaculous/effects.js +958 -0
- data/common/src/js/core/lib/scriptaculous/scriptaculous.js +47 -0
- data/common/src/js/core/lib/scriptaculous/slider.js +283 -0
- data/common/src/js/core/lib/scriptaculous/unittest.js +383 -0
- data/common/src/js/core/lib/snapsie.js +91 -0
- data/common/src/js/core/scripts/find_matching_child.js +69 -0
- data/common/src/js/core/scripts/htmlutils.js +8716 -0
- data/common/src/js/core/scripts/injection.html +72 -0
- data/common/src/js/core/scripts/selenium-api.js +3291 -0
- data/common/src/js/core/scripts/selenium-browserbot.js +2457 -0
- data/common/src/js/core/scripts/selenium-browserdetect.js +153 -0
- data/common/src/js/core/scripts/selenium-commandhandlers.js +379 -0
- data/common/src/js/core/scripts/selenium-executionloop.js +175 -0
- data/common/src/js/core/scripts/selenium-logging.js +148 -0
- data/common/src/js/core/scripts/selenium-remoterunner.js +695 -0
- data/common/src/js/core/scripts/selenium-testrunner.js +1362 -0
- data/common/src/js/core/scripts/selenium-version.js +5 -0
- data/common/src/js/core/scripts/ui-doc.html +808 -0
- data/common/src/js/core/scripts/ui-element.js +1644 -0
- data/common/src/js/core/scripts/ui-map-sample.js +979 -0
- data/common/src/js/core/scripts/user-extensions.js +3 -0
- data/common/src/js/core/scripts/user-extensions.js.sample +75 -0
- data/common/src/js/core/scripts/xmlextras.js +153 -0
- data/common/src/js/core/selenium-logo.png +0 -0
- data/common/src/js/core/selenium-test.css +43 -0
- data/common/src/js/core/selenium.css +316 -0
- data/common/src/js/core/xpath/dom.js +566 -0
- data/common/src/js/core/xpath/javascript-xpath-0.1.11.js +2816 -0
- data/common/src/js/core/xpath/util.js +549 -0
- data/common/src/js/core/xpath/xmltoken.js +149 -0
- data/common/src/js/core/xpath/xpath.js +2481 -0
- data/common/src/js/extension/README +2 -0
- data/common/src/js/extension/dommessenger.js +152 -0
- data/common/src/js/factory.js +55 -0
- data/common/src/js/future.js +141 -0
- data/common/src/js/jsunit.js +40 -0
- data/common/src/js/jsunit/app/css/jsUnitStyle.css +50 -0
- data/common/src/js/jsunit/app/css/readme +10 -0
- data/common/src/js/jsunit/app/emptyPage.html +11 -0
- data/common/src/js/jsunit/app/jsUnitCore.js +534 -0
- data/common/src/js/jsunit/app/jsUnitMockTimeout.js +81 -0
- data/common/src/js/jsunit/app/jsUnitTestManager.js +705 -0
- data/common/src/js/jsunit/app/jsUnitTestSuite.js +44 -0
- data/common/src/js/jsunit/app/jsUnitTracer.js +102 -0
- data/common/src/js/jsunit/app/jsUnitVersionCheck.js +59 -0
- data/common/src/js/jsunit/app/main-counts-errors.html +12 -0
- data/common/src/js/jsunit/app/main-counts-failures.html +13 -0
- data/common/src/js/jsunit/app/main-counts-runs.html +13 -0
- data/common/src/js/jsunit/app/main-counts.html +21 -0
- data/common/src/js/jsunit/app/main-data.html +178 -0
- data/common/src/js/jsunit/app/main-errors.html +23 -0
- data/common/src/js/jsunit/app/main-frame.html +19 -0
- data/common/src/js/jsunit/app/main-loader.html +45 -0
- data/common/src/js/jsunit/app/main-progress.html +25 -0
- data/common/src/js/jsunit/app/main-results.html +67 -0
- data/common/src/js/jsunit/app/main-status.html +13 -0
- data/common/src/js/jsunit/app/testContainer.html +16 -0
- data/common/src/js/jsunit/app/testContainerController.html +77 -0
- data/common/src/js/jsunit/app/xbDebug.js +306 -0
- data/common/src/js/jsunit/changelog.txt +60 -0
- data/common/src/js/jsunit/css/jsUnitStyle.css +83 -0
- data/common/src/js/jsunit/images/green.gif +0 -0
- data/common/src/js/jsunit/images/logo_jsunit.gif +0 -0
- data/common/src/js/jsunit/images/powerby-transparent.gif +0 -0
- data/common/src/js/jsunit/images/red.gif +0 -0
- data/common/src/js/jsunit/licenses/JDOM_license.txt +56 -0
- data/common/src/js/jsunit/licenses/Jetty_license.html +213 -0
- data/common/src/js/jsunit/licenses/MPL-1.1.txt +470 -0
- data/common/src/js/jsunit/licenses/gpl-2.txt +340 -0
- data/common/src/js/jsunit/licenses/index.html +141 -0
- data/common/src/js/jsunit/licenses/lgpl-2.1.txt +504 -0
- data/common/src/js/jsunit/licenses/mpl-tri-license-c.txt +35 -0
- data/common/src/js/jsunit/licenses/mpl-tri-license-html.txt +35 -0
- data/common/src/js/jsunit/readme.txt +19 -0
- data/common/src/js/jsunit/testRunner.html +167 -0
- data/common/src/js/jsunit/version.txt +1 -0
- data/common/src/js/key.js +117 -0
- data/common/src/js/localcommandprocessor.js +185 -0
- data/common/src/js/testcase.js +217 -0
- data/common/src/js/timing.js +89 -0
- data/common/src/js/webdriver.js +890 -0
- data/common/src/js/webelement.js +485 -0
- data/common/src/rb/README +30 -0
- data/common/src/rb/lib/selenium-webdriver.rb +1 -0
- data/common/src/rb/lib/selenium/webdriver.rb +67 -0
- data/common/src/rb/lib/selenium/webdriver/bridge_helper.rb +91 -0
- data/common/src/rb/lib/selenium/webdriver/child_process.rb +180 -0
- data/common/src/rb/lib/selenium/webdriver/core_ext/dir.rb +41 -0
- data/common/src/rb/lib/selenium/webdriver/driver.rb +252 -0
- data/common/src/rb/lib/selenium/webdriver/driver_extensions/takes_screenshot.rb +24 -0
- data/common/src/rb/lib/selenium/webdriver/element.rb +262 -0
- data/common/src/rb/lib/selenium/webdriver/error.rb +67 -0
- data/common/src/rb/lib/selenium/webdriver/find.rb +89 -0
- data/common/src/rb/lib/selenium/webdriver/keys.rb +84 -0
- data/common/src/rb/lib/selenium/webdriver/navigation.rb +27 -0
- data/common/src/rb/lib/selenium/webdriver/options.rb +50 -0
- data/common/src/rb/lib/selenium/webdriver/platform.rb +86 -0
- data/common/src/rb/lib/selenium/webdriver/target_locator.rb +70 -0
- data/firefox/prebuilt/Win32/Release/webdriver-firefox.dll +0 -0
- data/firefox/prebuilt/linux/Release/libwebdriver-firefox.so +0 -0
- data/firefox/prebuilt/linux/Release/x_ignore_nofocus.so +0 -0
- data/firefox/prebuilt/linux64/Release/libwebdriver-firefox.so +0 -0
- data/firefox/prebuilt/linux64/Release/x_ignore_nofocus.so +0 -0
- data/firefox/prebuilt/nsICommandProcessor.xpt +0 -0
- data/firefox/prebuilt/nsINativeEvents.xpt +0 -0
- data/firefox/prebuilt/nsIResponseHandler.xpt +0 -0
- data/firefox/src/extension/chrome.manifest +3 -0
- data/firefox/src/extension/components/badCertListener.js +294 -0
- data/firefox/src/extension/components/context.js +37 -0
- data/firefox/src/extension/components/driver-component.js +127 -0
- data/firefox/src/extension/components/firefoxDriver.js +810 -0
- data/firefox/src/extension/components/json2.js +273 -0
- data/firefox/src/extension/components/keytest.html +554 -0
- data/firefox/src/extension/components/nsCommandProcessor.js +643 -0
- data/firefox/src/extension/components/promptService.js +208 -0
- data/firefox/src/extension/components/screenshooter.js +81 -0
- data/firefox/src/extension/components/socketListener.js +185 -0
- data/firefox/src/extension/components/utils.js +1263 -0
- data/firefox/src/extension/components/webLoadingListener.js +57 -0
- data/firefox/src/extension/components/webdriverserver.js +106 -0
- data/firefox/src/extension/components/wrappedElement.js +683 -0
- data/firefox/src/extension/content/fxdriver.xul +30 -0
- data/firefox/src/extension/content/server.js +95 -0
- data/firefox/src/extension/idl/nsICommandProcessor.idl +38 -0
- data/firefox/src/extension/idl/nsIResponseHandler.idl +34 -0
- data/firefox/src/extension/install.rdf +29 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox.rb +31 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/binary.rb +107 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +484 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/extension_connection.rb +90 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/launcher.rb +155 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/profile.rb +233 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/profiles_ini.rb +59 -0
- data/firefox/src/rb/lib/selenium/webdriver/firefox/util.rb +23 -0
- data/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll +0 -0
- data/jobbie/prebuilt/x64/Release/InternetExplorerDriver.dll +0 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie.rb +14 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/bridge.rb +565 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/lib.rb +99 -0
- data/jobbie/src/rb/lib/selenium/webdriver/ie/util.rb +147 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote.rb +16 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +408 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/capabilities.rb +105 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/commands.rb +53 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +71 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/response.rb +49 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/server_error.rb +32 -0
- metadata +303 -0
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "WebDriver",
|
|
3
|
+
"version": "1.9.10",
|
|
4
|
+
"description": "WebDriver extension for Chrome",
|
|
5
|
+
"browser_action": {
|
|
6
|
+
"default_title": "WebDriver",
|
|
7
|
+
"default_icon": "icons/free.png"
|
|
8
|
+
},
|
|
9
|
+
"background_page": "background.html",
|
|
10
|
+
"content_scripts": [
|
|
11
|
+
{
|
|
12
|
+
"matches": ["http://*/*", "https://*/*", "file:///*"],
|
|
13
|
+
"js": ["utils.js", "content_script.js"],
|
|
14
|
+
"run_at": "document_end",
|
|
15
|
+
"all_frames": true
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"permissions": ["http://*/*", "tabs"]
|
|
19
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "WebDriver",
|
|
3
|
+
"version": "1.9.10 ",
|
|
4
|
+
"description": "WebDriver extension for Chrome",
|
|
5
|
+
"browser_action": {
|
|
6
|
+
"default_title": "WebDriver",
|
|
7
|
+
"default_icon": "icons/free.png"
|
|
8
|
+
},
|
|
9
|
+
"background_page": "background.html",
|
|
10
|
+
"content_scripts": [
|
|
11
|
+
{
|
|
12
|
+
"matches": ["http://*/*", "https://*/*", "file:///*"],
|
|
13
|
+
"js": ["utils.js", "content_script.js"],
|
|
14
|
+
"run_at": "document_end",
|
|
15
|
+
"all_frames": true
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"plugins": [{"path": "npchromedriver.dll", "public": true}],
|
|
19
|
+
"permissions": ["http://*/*", "tabs"]
|
|
20
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
//Very cut-down and slightly modified (generally to remove context) from
|
|
2
|
+
//$WEBDRIVER_HOME/firefox/src/extension/components/utils.js
|
|
3
|
+
|
|
4
|
+
function Utils() {
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function getTextFromNode(node, toReturn, textSoFar, isPreformatted) {
|
|
8
|
+
if (node['tagName'] && node.tagName == "SCRIPT") {
|
|
9
|
+
return [toReturn, textSoFar];
|
|
10
|
+
} else if (node['tagName'] && node.tagName == "TITLE") {
|
|
11
|
+
return [textSoFar + node.text, ""];
|
|
12
|
+
}
|
|
13
|
+
var children = node.childNodes;
|
|
14
|
+
|
|
15
|
+
for (var i = 0; i < children.length; i++) {
|
|
16
|
+
var child = children[i];
|
|
17
|
+
|
|
18
|
+
// Do we need to collapse the text so far?
|
|
19
|
+
if (child["tagName"] && child.tagName == "PRE") {
|
|
20
|
+
toReturn += collapseWhitespace(textSoFar);
|
|
21
|
+
textSoFar = "";
|
|
22
|
+
var bits = getTextFromNode(child, toReturn, "", true);
|
|
23
|
+
toReturn += bits[1];
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Or is this just plain text?
|
|
28
|
+
if (child.nodeName == "#text") {
|
|
29
|
+
if (Utils.isDisplayed(child)) {
|
|
30
|
+
var textToAdd = child.nodeValue;
|
|
31
|
+
textToAdd = textToAdd.replace(new RegExp(String.fromCharCode(160), "gm"), " ");
|
|
32
|
+
textSoFar += textToAdd;
|
|
33
|
+
}
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Treat as another child node.
|
|
38
|
+
var bits = getTextFromNode(child, toReturn, textSoFar, false);
|
|
39
|
+
toReturn = bits[0];
|
|
40
|
+
textSoFar = bits[1];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (isBlockLevel(node)) {
|
|
44
|
+
if (node["tagName"] && node.tagName != "PRE") {
|
|
45
|
+
toReturn += collapseWhitespace(textSoFar) + "\n";
|
|
46
|
+
textSoFar = "";
|
|
47
|
+
} else {
|
|
48
|
+
toReturn += "\n";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return [toReturn, textSoFar];
|
|
52
|
+
}
|
|
53
|
+
;
|
|
54
|
+
|
|
55
|
+
function isBlockLevel(node) {
|
|
56
|
+
if (node["tagName"] && node.tagName == "BR")
|
|
57
|
+
return true;
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
// Should we think about getting hold of the current document?
|
|
61
|
+
return "block" == Utils.getStyleProperty(node, "display");
|
|
62
|
+
} catch (e) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
Utils.isInHead = function(element) {
|
|
68
|
+
while (element) {
|
|
69
|
+
if (element.tagName && element.tagName.toLowerCase() == "head") {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
element = element.parentNode;
|
|
74
|
+
} catch (e) {
|
|
75
|
+
// Fine. the DOM has dispeared from underneath us
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return false;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
Utils.isDisplayed = function(element) {
|
|
84
|
+
// Ensure that we're dealing with an element.
|
|
85
|
+
var el = element;
|
|
86
|
+
while (el.nodeType != 1 && !(el.nodeType >= 9 && el.nodeType <= 11)) {
|
|
87
|
+
el = el.parentNode;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Hidden input elements are, by definition, never displayed
|
|
91
|
+
if (el.tagName == "input" && el.type == "hidden") {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
var visibility = Utils.getStyleProperty(el, "visibility");
|
|
96
|
+
|
|
97
|
+
var _isDisplayed = function(e) {
|
|
98
|
+
var display = e.ownerDocument.defaultView.getComputedStyle(e, null).getPropertyValue("display");
|
|
99
|
+
if (display == "none") return display;
|
|
100
|
+
if (e && e.parentNode && e.parentNode.style) {
|
|
101
|
+
return _isDisplayed(e.parentNode);
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
var displayed = _isDisplayed(el);
|
|
107
|
+
|
|
108
|
+
if (element.scrollIntoView && element.getBoundingClientRect &&
|
|
109
|
+
element.tagName.toLowerCase() != "option") {
|
|
110
|
+
//Option tags have 0-dimension bounding rects so ignore them
|
|
111
|
+
element.scrollIntoView(true);
|
|
112
|
+
var clientRect = element.getBoundingClientRect();
|
|
113
|
+
if (clientRect.width == 0 || clientRect.height == 0) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return displayed != "none" && visibility != "hidden";
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
Utils.getStyleProperty = function(node, propertyName) {
|
|
122
|
+
if (!node)
|
|
123
|
+
return undefined;
|
|
124
|
+
|
|
125
|
+
var value = node.ownerDocument.defaultView.getComputedStyle(node, null).getPropertyValue(propertyName);
|
|
126
|
+
|
|
127
|
+
// Convert colours to hex if possible
|
|
128
|
+
var raw = /rgb\((\d{1,3}),\s(\d{1,3}),\s(\d{1,3})\)/.exec(value);
|
|
129
|
+
if (raw) {
|
|
130
|
+
var temp = value.substr(0, raw.index);
|
|
131
|
+
|
|
132
|
+
var hex = "#";
|
|
133
|
+
for (var i = 1; i <= 3; i++) {
|
|
134
|
+
var colour = (raw[i] - 0).toString(16);
|
|
135
|
+
if (colour.length == 1)
|
|
136
|
+
colour = "0" + colour;
|
|
137
|
+
hex += colour
|
|
138
|
+
}
|
|
139
|
+
hex = hex.toLowerCase();
|
|
140
|
+
value = temp + hex + value.substr(raw.index + raw[0].length);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (value == "inherit" && element.parentNode.style) {
|
|
144
|
+
value = Utils.getStyleProperty(node.parentNode, propertyName);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return value;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
function collapseWhitespace(textSoFar) {
|
|
151
|
+
return textSoFar.replace(/\s+/g, " ");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function getPreformattedText(node) {
|
|
155
|
+
var textToAdd = "";
|
|
156
|
+
return getTextFromNode(node, "", textToAdd, true)[1];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function isWhiteSpace(character) {
|
|
160
|
+
return character == '\n' || character == ' ' || character == '\t' || character == '\r';
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
Utils.getText = function(element) {
|
|
164
|
+
var bits = getTextFromNode(element, "", "", element.tagName == "PRE");
|
|
165
|
+
var text = bits[0] + collapseWhitespace(bits[1]);
|
|
166
|
+
var start = 0;
|
|
167
|
+
while (start < text.length && isWhiteSpace(text[start])) {
|
|
168
|
+
++start;
|
|
169
|
+
}
|
|
170
|
+
var end = text.length;
|
|
171
|
+
while (end > start && isWhiteSpace(text[end - 1])) {
|
|
172
|
+
--end;
|
|
173
|
+
}
|
|
174
|
+
return text.slice(start, end);
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Fires the event using Utils.fireEvent, and if the event returned true,
|
|
179
|
+
* perform callback, which will be passed on arguments
|
|
180
|
+
*/
|
|
181
|
+
Utils.fireHtmlEventAndConditionallyPerformAction = function(element, eventName, callback) {
|
|
182
|
+
Utils.fireHtmlEvent(element, eventName, function(evt) { if (JSON.parse(evt.newValue).value) { callback(); } });
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
Utils.fireHtmlEvent = function(element, eventName, callback) {
|
|
186
|
+
if (callback === undefined) {
|
|
187
|
+
callback = function() {};
|
|
188
|
+
}
|
|
189
|
+
var args = [
|
|
190
|
+
{type: "ELEMENT", value: addElementToInternalArray(element)},
|
|
191
|
+
{type: "STRING", value: eventName}
|
|
192
|
+
];
|
|
193
|
+
|
|
194
|
+
// We need to do this because event handlers refer to functions that
|
|
195
|
+
// the content script can't reah. See:
|
|
196
|
+
// http://code.google.com/p/chromium/issues/detail?id=29071
|
|
197
|
+
var script = "var e = document.createEvent('HTMLEvents'); "
|
|
198
|
+
+ "e.initEvent(arguments[1], true, true); "
|
|
199
|
+
+ "return arguments[0].dispatchEvent(e);";
|
|
200
|
+
|
|
201
|
+
execute_(script, args, callback);
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
Utils.fireMouseEventOn = function(element, eventName) {
|
|
206
|
+
Utils.triggerMouseEvent(element, eventName, 0, 0);
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
Utils.triggerMouseEvent = function(element, eventType, clientX, clientY) {
|
|
210
|
+
var args = [
|
|
211
|
+
{type: "ELEMENT", value: addElementToInternalArray(element)},
|
|
212
|
+
{type: "STRING", value: eventType},
|
|
213
|
+
{type: "NUMBER", value: clientX},
|
|
214
|
+
{type: "NUMBER", value: clientY}
|
|
215
|
+
];
|
|
216
|
+
|
|
217
|
+
// We need to do this because event handlers refer to functions that
|
|
218
|
+
// the content script can't reah. See:
|
|
219
|
+
// http://code.google.com/p/chromium/issues/detail?id=29071
|
|
220
|
+
var script =
|
|
221
|
+
"var event = arguments[0].ownerDocument.createEvent('MouseEvents'); "
|
|
222
|
+
+ "var view = arguments[0].ownerDocument.defaultView; "
|
|
223
|
+
+ "event.initMouseEvent(arguments[1], true, true, view, 1, 0, 0, arguments[2], arguments[3], false, false, false, false, 0, arguments[0]);"
|
|
224
|
+
+ " arguments[0].dispatchEvent(event);";
|
|
225
|
+
|
|
226
|
+
execute_(script, args, function(){});
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
Utils.trim = function(str) {
|
|
230
|
+
return str.replace(/^\s*/, "").replace(/\s*$/, "");
|
|
231
|
+
}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
module Chrome
|
|
4
|
+
class Bridge
|
|
5
|
+
include BridgeHelper
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
@executor = CommandExecutor.new
|
|
9
|
+
|
|
10
|
+
@launcher = Launcher.launcher
|
|
11
|
+
@launcher.launch(@executor.uri)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def browser
|
|
15
|
+
:chrome
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def driver_extensions
|
|
19
|
+
[DriverExtensions::TakesScreenshot]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def get(url)
|
|
23
|
+
execute :request => 'get',
|
|
24
|
+
:url => url
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def goBack
|
|
28
|
+
execute :request => 'goBack'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def goForward
|
|
32
|
+
execute :request => 'goForward'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def getCurrentUrl
|
|
36
|
+
execute :request => 'getCurrentUrl'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def getTitle
|
|
40
|
+
execute :request => 'getTitle'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def getPageSource
|
|
44
|
+
execute :request => 'getPageSource'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def switchToWindow(name)
|
|
48
|
+
execute :request => 'switchToWindow',
|
|
49
|
+
:windowName => name
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def switchToFrame(id)
|
|
53
|
+
execute :request => 'switchToFrameByName',
|
|
54
|
+
:name => id
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def switchToDefaultContent
|
|
58
|
+
execute :request => "switchToDefaultContent"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def quit
|
|
62
|
+
begin
|
|
63
|
+
execute :request => 'quit'
|
|
64
|
+
rescue IOError
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
@launcher.kill
|
|
68
|
+
@executor.close
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def close
|
|
72
|
+
execute :request => 'close'
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def refresh
|
|
76
|
+
execute :request => 'refresh'
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def getWindowHandles
|
|
80
|
+
execute :request => 'getWindowHandles'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def getCurrentWindowHandle
|
|
84
|
+
execute :request => 'getCurrentWindowHandle'
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def getScreenshotAsBase64
|
|
88
|
+
execute :request => "screenshot"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def setSpeed(value)
|
|
92
|
+
@speed = value
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def getSpeed
|
|
96
|
+
@speed
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def executeScript(script, *args)
|
|
100
|
+
typed_args = args.map { |e| wrap_script_argument(e) }
|
|
101
|
+
|
|
102
|
+
resp = execute :request => 'executeScript',
|
|
103
|
+
:script => script,
|
|
104
|
+
:args => typed_args
|
|
105
|
+
|
|
106
|
+
return if resp.nil?
|
|
107
|
+
unwrap_script_argument resp
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def addCookie(cookie)
|
|
111
|
+
execute :request => 'addCookie',
|
|
112
|
+
:cookie => cookie
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def deleteCookie(name)
|
|
116
|
+
execute :request => 'deleteCookie',
|
|
117
|
+
:name => name
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def getAllCookies
|
|
121
|
+
execute :request => 'getCookies'
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def deleteAllCookies
|
|
125
|
+
execute :request => 'deleteAllCookies'
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def findElementByClassName(parent, class_name)
|
|
129
|
+
find_element_by 'class name', class_name, parent
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def findElementsByClassName(parent, class_name)
|
|
133
|
+
find_elements_by 'class name', class_name, parent
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def findElementById(parent, id)
|
|
137
|
+
find_element_by 'id', id, parent
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def findElementsById(parent, id)
|
|
141
|
+
find_elements_by 'id', id, parent
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def findElementByLinkText(parent, link_text)
|
|
145
|
+
find_element_by 'link text', link_text, parent
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def findElementsByLinkText(parent, link_text)
|
|
149
|
+
find_elements_by 'link text', link_text, parent
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def findElementByPartialLinkText(parent, link_text)
|
|
153
|
+
find_element_by 'partial link text', link_text, parent
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def findElementsByPartialLinkText(parent, link_text)
|
|
157
|
+
find_elements_by 'partial link text', link_text, parent
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def findElementByName(parent, name)
|
|
161
|
+
find_element_by 'name', name, parent
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def findElementsByName(parent, name)
|
|
165
|
+
find_elements_by 'name', name, parent
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def findElementByTagName(parent, tag_name)
|
|
169
|
+
find_element_by 'tag name', tag_name, parent
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def findElementsByTagName(parent, tag_name)
|
|
173
|
+
find_elements_by 'tag name', tag_name, parent
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def findElementByXpath(parent, xpath)
|
|
177
|
+
find_element_by 'xpath', xpath, parent
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def findElementsByXpath(parent, xpath)
|
|
181
|
+
find_elements_by 'xpath', xpath, parent
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def findElementByCssSelector(parent, selector)
|
|
185
|
+
find_element_by 'css selector', selector, parent
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def findElementsByCssSelector(parent, selector)
|
|
189
|
+
find_elements_by 'css selector', selector, parent
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
#
|
|
194
|
+
# Element functions
|
|
195
|
+
#
|
|
196
|
+
|
|
197
|
+
def clickElement(element)
|
|
198
|
+
execute :request => 'clickElement',
|
|
199
|
+
:elementId => element
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def getElementTagName(element)
|
|
203
|
+
execute :request => 'getElementTagName',
|
|
204
|
+
:elementId => element
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def getElementAttribute(element, name)
|
|
208
|
+
execute :request => 'getElementAttribute',
|
|
209
|
+
:elementId => element,
|
|
210
|
+
:attribute => name
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def getElementValue(element)
|
|
214
|
+
execute :request => 'getElementValue',
|
|
215
|
+
:elementId => element
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def getElementText(element)
|
|
219
|
+
execute :request => 'getElementText',
|
|
220
|
+
:elementId => element
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def getElementLocation(element)
|
|
224
|
+
data = execute :request => 'getElementLocation',
|
|
225
|
+
:elementId => element
|
|
226
|
+
|
|
227
|
+
Point.new data['x'], data['y']
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def getElementSize(element)
|
|
231
|
+
data = execute :request => 'getElementSize',
|
|
232
|
+
:elementId => element
|
|
233
|
+
|
|
234
|
+
Dimension.new data['width'], data['height']
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def sendKeysToElement(element, string)
|
|
238
|
+
execute :request => 'sendKeysToElement',
|
|
239
|
+
:elementId => element,
|
|
240
|
+
:keys => string.split(//u)
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def clearElement(element)
|
|
244
|
+
execute :request => 'clearElement',
|
|
245
|
+
:elementId => element
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def isElementEnabled(element)
|
|
249
|
+
execute :request => 'isElementEnabled',
|
|
250
|
+
:elementId => element
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def isElementSelected(element)
|
|
254
|
+
execute :request => 'isElementSelected',
|
|
255
|
+
:elementId => element
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def isElementDisplayed(element)
|
|
259
|
+
execute :request => 'isElementDisplayed',
|
|
260
|
+
:elementId => element
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def submitElement(element)
|
|
264
|
+
execute :request => 'submitElement',
|
|
265
|
+
:elementId => element
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def toggleElement(element)
|
|
269
|
+
execute :request => 'toggleElement',
|
|
270
|
+
:elementId => element
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def setElementSelected(element)
|
|
274
|
+
execute :request => 'setElementSelected',
|
|
275
|
+
:elementId => element
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def getElementValueOfCssProperty(element, prop)
|
|
279
|
+
execute :request => 'getElementValueOfCssProperty',
|
|
280
|
+
:elementId => element,
|
|
281
|
+
:css => prop
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def getActiveElement
|
|
285
|
+
Element.new self, element_id_from(execute(:request => 'getActiveElement'))
|
|
286
|
+
end
|
|
287
|
+
alias_method :switchToActiveElement, :getActiveElement
|
|
288
|
+
|
|
289
|
+
def hoverOverElement(element)
|
|
290
|
+
execute :request => 'hoverOverElement',
|
|
291
|
+
:elementId => element
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def dragElement(element, rigth_by, down_by)
|
|
295
|
+
raise UnsupportedOperationError, "drag and drop unsupported in Chrome"
|
|
296
|
+
execute :drag_element, {:id => element}, element, rigth_by, down_by
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
private
|
|
300
|
+
|
|
301
|
+
def find_element_by(how, what, parent = nil)
|
|
302
|
+
if parent
|
|
303
|
+
id = execute :request => 'findChildElement',
|
|
304
|
+
:id => parent,
|
|
305
|
+
:using => how,
|
|
306
|
+
:value => what
|
|
307
|
+
else
|
|
308
|
+
id = execute :request => 'findElement',
|
|
309
|
+
:using => how,
|
|
310
|
+
:value => what
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
Element.new self, element_id_from(id)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def find_elements_by(how, what, parent = nil)
|
|
317
|
+
if parent
|
|
318
|
+
ids = execute :request => 'findChildElements',
|
|
319
|
+
:id => parent,
|
|
320
|
+
:using => how,
|
|
321
|
+
:value => what
|
|
322
|
+
else
|
|
323
|
+
ids = execute :request => 'findElements',
|
|
324
|
+
:using => how,
|
|
325
|
+
:value => what
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
ids.map { |id| Element.new self, element_id_from(id) }
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
private
|
|
333
|
+
|
|
334
|
+
def execute(command)
|
|
335
|
+
puts "--> #{command.inspect}" if $DEBUG
|
|
336
|
+
resp = raw_execute command
|
|
337
|
+
puts "<-- #{resp.inspect}" if $DEBUG
|
|
338
|
+
|
|
339
|
+
code = resp['statusCode']
|
|
340
|
+
if e = Error.for_code(code)
|
|
341
|
+
msg = resp['value']['message'] if resp['value']
|
|
342
|
+
msg ||= "unknown exception for #{command.inspect}"
|
|
343
|
+
msg << " (#{code})"
|
|
344
|
+
|
|
345
|
+
raise e, msg
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
resp['value']
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def raw_execute(command)
|
|
352
|
+
@executor.execute command
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
end # Bridge
|
|
356
|
+
end # Chrome
|
|
357
|
+
end # WebDriver
|
|
358
|
+
end # Selenium
|