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.
Files changed (192) hide show
  1. data/COPYING +204 -0
  2. data/chrome/prebuilt/Win32/Release/npchromedriver.dll +0 -0
  3. data/chrome/prebuilt/x64/Release/npchromedriver.dll +0 -0
  4. data/chrome/src/extension/background.html +9 -0
  5. data/chrome/src/extension/background.js +995 -0
  6. data/chrome/src/extension/content_script.js +1321 -0
  7. data/chrome/src/extension/icons/busy.png +0 -0
  8. data/chrome/src/extension/icons/free.png +0 -0
  9. data/chrome/src/extension/manifest-nonwin.json +19 -0
  10. data/chrome/src/extension/manifest-win.json +20 -0
  11. data/chrome/src/extension/utils.js +231 -0
  12. data/chrome/src/rb/lib/selenium/webdriver/chrome.rb +8 -0
  13. data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +358 -0
  14. data/chrome/src/rb/lib/selenium/webdriver/chrome/command_executor.rb +124 -0
  15. data/chrome/src/rb/lib/selenium/webdriver/chrome/launcher.rb +135 -0
  16. data/common/src/js/abstractcommandprocessor.js +134 -0
  17. data/common/src/js/asserts.js +296 -0
  18. data/common/src/js/by.js +149 -0
  19. data/common/src/js/command.js +304 -0
  20. data/common/src/js/context.js +58 -0
  21. data/common/src/js/core/Blank.html +7 -0
  22. data/common/src/js/core/InjectedRemoteRunner.html +8 -0
  23. data/common/src/js/core/RemoteRunner.html +101 -0
  24. data/common/src/js/core/SeleniumLog.html +109 -0
  25. data/common/src/js/core/TestPrompt.html +145 -0
  26. data/common/src/js/core/TestRunner-splash.html +55 -0
  27. data/common/src/js/core/TestRunner.html +165 -0
  28. data/common/src/js/core/icons/all.png +0 -0
  29. data/common/src/js/core/icons/continue.png +0 -0
  30. data/common/src/js/core/icons/continue_disabled.png +0 -0
  31. data/common/src/js/core/icons/pause.png +0 -0
  32. data/common/src/js/core/icons/pause_disabled.png +0 -0
  33. data/common/src/js/core/icons/selected.png +0 -0
  34. data/common/src/js/core/icons/step.png +0 -0
  35. data/common/src/js/core/icons/step_disabled.png +0 -0
  36. data/common/src/js/core/lib/cssQuery/cssQuery-p.js +6 -0
  37. data/common/src/js/core/lib/cssQuery/src/cssQuery-level2.js +142 -0
  38. data/common/src/js/core/lib/cssQuery/src/cssQuery-level3.js +150 -0
  39. data/common/src/js/core/lib/cssQuery/src/cssQuery-standard.js +53 -0
  40. data/common/src/js/core/lib/cssQuery/src/cssQuery.js +356 -0
  41. data/common/src/js/core/lib/prototype.js +2006 -0
  42. data/common/src/js/core/lib/scriptaculous/builder.js +101 -0
  43. data/common/src/js/core/lib/scriptaculous/controls.js +815 -0
  44. data/common/src/js/core/lib/scriptaculous/dragdrop.js +915 -0
  45. data/common/src/js/core/lib/scriptaculous/effects.js +958 -0
  46. data/common/src/js/core/lib/scriptaculous/scriptaculous.js +47 -0
  47. data/common/src/js/core/lib/scriptaculous/slider.js +283 -0
  48. data/common/src/js/core/lib/scriptaculous/unittest.js +383 -0
  49. data/common/src/js/core/lib/snapsie.js +91 -0
  50. data/common/src/js/core/scripts/find_matching_child.js +69 -0
  51. data/common/src/js/core/scripts/htmlutils.js +8716 -0
  52. data/common/src/js/core/scripts/injection.html +72 -0
  53. data/common/src/js/core/scripts/selenium-api.js +3291 -0
  54. data/common/src/js/core/scripts/selenium-browserbot.js +2457 -0
  55. data/common/src/js/core/scripts/selenium-browserdetect.js +153 -0
  56. data/common/src/js/core/scripts/selenium-commandhandlers.js +379 -0
  57. data/common/src/js/core/scripts/selenium-executionloop.js +175 -0
  58. data/common/src/js/core/scripts/selenium-logging.js +148 -0
  59. data/common/src/js/core/scripts/selenium-remoterunner.js +695 -0
  60. data/common/src/js/core/scripts/selenium-testrunner.js +1362 -0
  61. data/common/src/js/core/scripts/selenium-version.js +5 -0
  62. data/common/src/js/core/scripts/ui-doc.html +808 -0
  63. data/common/src/js/core/scripts/ui-element.js +1644 -0
  64. data/common/src/js/core/scripts/ui-map-sample.js +979 -0
  65. data/common/src/js/core/scripts/user-extensions.js +3 -0
  66. data/common/src/js/core/scripts/user-extensions.js.sample +75 -0
  67. data/common/src/js/core/scripts/xmlextras.js +153 -0
  68. data/common/src/js/core/selenium-logo.png +0 -0
  69. data/common/src/js/core/selenium-test.css +43 -0
  70. data/common/src/js/core/selenium.css +316 -0
  71. data/common/src/js/core/xpath/dom.js +566 -0
  72. data/common/src/js/core/xpath/javascript-xpath-0.1.11.js +2816 -0
  73. data/common/src/js/core/xpath/util.js +549 -0
  74. data/common/src/js/core/xpath/xmltoken.js +149 -0
  75. data/common/src/js/core/xpath/xpath.js +2481 -0
  76. data/common/src/js/extension/README +2 -0
  77. data/common/src/js/extension/dommessenger.js +152 -0
  78. data/common/src/js/factory.js +55 -0
  79. data/common/src/js/future.js +141 -0
  80. data/common/src/js/jsunit.js +40 -0
  81. data/common/src/js/jsunit/app/css/jsUnitStyle.css +50 -0
  82. data/common/src/js/jsunit/app/css/readme +10 -0
  83. data/common/src/js/jsunit/app/emptyPage.html +11 -0
  84. data/common/src/js/jsunit/app/jsUnitCore.js +534 -0
  85. data/common/src/js/jsunit/app/jsUnitMockTimeout.js +81 -0
  86. data/common/src/js/jsunit/app/jsUnitTestManager.js +705 -0
  87. data/common/src/js/jsunit/app/jsUnitTestSuite.js +44 -0
  88. data/common/src/js/jsunit/app/jsUnitTracer.js +102 -0
  89. data/common/src/js/jsunit/app/jsUnitVersionCheck.js +59 -0
  90. data/common/src/js/jsunit/app/main-counts-errors.html +12 -0
  91. data/common/src/js/jsunit/app/main-counts-failures.html +13 -0
  92. data/common/src/js/jsunit/app/main-counts-runs.html +13 -0
  93. data/common/src/js/jsunit/app/main-counts.html +21 -0
  94. data/common/src/js/jsunit/app/main-data.html +178 -0
  95. data/common/src/js/jsunit/app/main-errors.html +23 -0
  96. data/common/src/js/jsunit/app/main-frame.html +19 -0
  97. data/common/src/js/jsunit/app/main-loader.html +45 -0
  98. data/common/src/js/jsunit/app/main-progress.html +25 -0
  99. data/common/src/js/jsunit/app/main-results.html +67 -0
  100. data/common/src/js/jsunit/app/main-status.html +13 -0
  101. data/common/src/js/jsunit/app/testContainer.html +16 -0
  102. data/common/src/js/jsunit/app/testContainerController.html +77 -0
  103. data/common/src/js/jsunit/app/xbDebug.js +306 -0
  104. data/common/src/js/jsunit/changelog.txt +60 -0
  105. data/common/src/js/jsunit/css/jsUnitStyle.css +83 -0
  106. data/common/src/js/jsunit/images/green.gif +0 -0
  107. data/common/src/js/jsunit/images/logo_jsunit.gif +0 -0
  108. data/common/src/js/jsunit/images/powerby-transparent.gif +0 -0
  109. data/common/src/js/jsunit/images/red.gif +0 -0
  110. data/common/src/js/jsunit/licenses/JDOM_license.txt +56 -0
  111. data/common/src/js/jsunit/licenses/Jetty_license.html +213 -0
  112. data/common/src/js/jsunit/licenses/MPL-1.1.txt +470 -0
  113. data/common/src/js/jsunit/licenses/gpl-2.txt +340 -0
  114. data/common/src/js/jsunit/licenses/index.html +141 -0
  115. data/common/src/js/jsunit/licenses/lgpl-2.1.txt +504 -0
  116. data/common/src/js/jsunit/licenses/mpl-tri-license-c.txt +35 -0
  117. data/common/src/js/jsunit/licenses/mpl-tri-license-html.txt +35 -0
  118. data/common/src/js/jsunit/readme.txt +19 -0
  119. data/common/src/js/jsunit/testRunner.html +167 -0
  120. data/common/src/js/jsunit/version.txt +1 -0
  121. data/common/src/js/key.js +117 -0
  122. data/common/src/js/localcommandprocessor.js +185 -0
  123. data/common/src/js/testcase.js +217 -0
  124. data/common/src/js/timing.js +89 -0
  125. data/common/src/js/webdriver.js +890 -0
  126. data/common/src/js/webelement.js +485 -0
  127. data/common/src/rb/README +30 -0
  128. data/common/src/rb/lib/selenium-webdriver.rb +1 -0
  129. data/common/src/rb/lib/selenium/webdriver.rb +67 -0
  130. data/common/src/rb/lib/selenium/webdriver/bridge_helper.rb +91 -0
  131. data/common/src/rb/lib/selenium/webdriver/child_process.rb +180 -0
  132. data/common/src/rb/lib/selenium/webdriver/core_ext/dir.rb +41 -0
  133. data/common/src/rb/lib/selenium/webdriver/driver.rb +252 -0
  134. data/common/src/rb/lib/selenium/webdriver/driver_extensions/takes_screenshot.rb +24 -0
  135. data/common/src/rb/lib/selenium/webdriver/element.rb +262 -0
  136. data/common/src/rb/lib/selenium/webdriver/error.rb +67 -0
  137. data/common/src/rb/lib/selenium/webdriver/find.rb +89 -0
  138. data/common/src/rb/lib/selenium/webdriver/keys.rb +84 -0
  139. data/common/src/rb/lib/selenium/webdriver/navigation.rb +27 -0
  140. data/common/src/rb/lib/selenium/webdriver/options.rb +50 -0
  141. data/common/src/rb/lib/selenium/webdriver/platform.rb +86 -0
  142. data/common/src/rb/lib/selenium/webdriver/target_locator.rb +70 -0
  143. data/firefox/prebuilt/Win32/Release/webdriver-firefox.dll +0 -0
  144. data/firefox/prebuilt/linux/Release/libwebdriver-firefox.so +0 -0
  145. data/firefox/prebuilt/linux/Release/x_ignore_nofocus.so +0 -0
  146. data/firefox/prebuilt/linux64/Release/libwebdriver-firefox.so +0 -0
  147. data/firefox/prebuilt/linux64/Release/x_ignore_nofocus.so +0 -0
  148. data/firefox/prebuilt/nsICommandProcessor.xpt +0 -0
  149. data/firefox/prebuilt/nsINativeEvents.xpt +0 -0
  150. data/firefox/prebuilt/nsIResponseHandler.xpt +0 -0
  151. data/firefox/src/extension/chrome.manifest +3 -0
  152. data/firefox/src/extension/components/badCertListener.js +294 -0
  153. data/firefox/src/extension/components/context.js +37 -0
  154. data/firefox/src/extension/components/driver-component.js +127 -0
  155. data/firefox/src/extension/components/firefoxDriver.js +810 -0
  156. data/firefox/src/extension/components/json2.js +273 -0
  157. data/firefox/src/extension/components/keytest.html +554 -0
  158. data/firefox/src/extension/components/nsCommandProcessor.js +643 -0
  159. data/firefox/src/extension/components/promptService.js +208 -0
  160. data/firefox/src/extension/components/screenshooter.js +81 -0
  161. data/firefox/src/extension/components/socketListener.js +185 -0
  162. data/firefox/src/extension/components/utils.js +1263 -0
  163. data/firefox/src/extension/components/webLoadingListener.js +57 -0
  164. data/firefox/src/extension/components/webdriverserver.js +106 -0
  165. data/firefox/src/extension/components/wrappedElement.js +683 -0
  166. data/firefox/src/extension/content/fxdriver.xul +30 -0
  167. data/firefox/src/extension/content/server.js +95 -0
  168. data/firefox/src/extension/idl/nsICommandProcessor.idl +38 -0
  169. data/firefox/src/extension/idl/nsIResponseHandler.idl +34 -0
  170. data/firefox/src/extension/install.rdf +29 -0
  171. data/firefox/src/rb/lib/selenium/webdriver/firefox.rb +31 -0
  172. data/firefox/src/rb/lib/selenium/webdriver/firefox/binary.rb +107 -0
  173. data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +484 -0
  174. data/firefox/src/rb/lib/selenium/webdriver/firefox/extension_connection.rb +90 -0
  175. data/firefox/src/rb/lib/selenium/webdriver/firefox/launcher.rb +155 -0
  176. data/firefox/src/rb/lib/selenium/webdriver/firefox/profile.rb +233 -0
  177. data/firefox/src/rb/lib/selenium/webdriver/firefox/profiles_ini.rb +59 -0
  178. data/firefox/src/rb/lib/selenium/webdriver/firefox/util.rb +23 -0
  179. data/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll +0 -0
  180. data/jobbie/prebuilt/x64/Release/InternetExplorerDriver.dll +0 -0
  181. data/jobbie/src/rb/lib/selenium/webdriver/ie.rb +14 -0
  182. data/jobbie/src/rb/lib/selenium/webdriver/ie/bridge.rb +565 -0
  183. data/jobbie/src/rb/lib/selenium/webdriver/ie/lib.rb +99 -0
  184. data/jobbie/src/rb/lib/selenium/webdriver/ie/util.rb +147 -0
  185. data/remote/client/src/rb/lib/selenium/webdriver/remote.rb +16 -0
  186. data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +408 -0
  187. data/remote/client/src/rb/lib/selenium/webdriver/remote/capabilities.rb +105 -0
  188. data/remote/client/src/rb/lib/selenium/webdriver/remote/commands.rb +53 -0
  189. data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +71 -0
  190. data/remote/client/src/rb/lib/selenium/webdriver/remote/response.rb +49 -0
  191. data/remote/client/src/rb/lib/selenium/webdriver/remote/server_error.rb +32 -0
  192. metadata +303 -0
@@ -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,8 @@
1
+ require "selenium/webdriver/chrome/launcher"
2
+ require "selenium/webdriver/chrome/command_executor"
3
+ require "selenium/webdriver/chrome/bridge"
4
+
5
+ require "fileutils"
6
+ require "thread"
7
+ require "socket"
8
+
@@ -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