selenium-webdriver 2.43.5 → 2.44.0
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.
- package/CHANGES.md +20 -0
- package/README.md +8 -13
- package/builder.js +4 -3
- package/docs/class_webdriver_Alert.html +6 -6
- package/docs/class_webdriver_AlertPromise.html +6 -6
- package/docs/class_webdriver_UnhandledAlertError.html +4 -4
- package/docs/class_webdriver_WebDriver.html +39 -37
- package/docs/class_webdriver_WebDriver_Logs.html +3 -3
- package/docs/class_webdriver_WebDriver_Navigation.html +5 -5
- package/docs/class_webdriver_WebDriver_Options.html +9 -9
- package/docs/class_webdriver_WebDriver_TargetLocator.html +6 -6
- package/docs/class_webdriver_WebDriver_Timeouts.html +4 -4
- package/docs/class_webdriver_WebDriver_Window.html +6 -6
- package/docs/class_webdriver_WebElement.html +23 -23
- package/docs/class_webdriver_WebElementPromise.html +22 -22
- package/docs/class_webdriver_promise_CancellationError.html +3 -0
- package/docs/class_webdriver_promise_ControlFlow.html +32 -32
- package/docs/class_webdriver_promise_Deferred.html +7 -8
- package/docs/class_webdriver_promise_Frame_.html +14 -30
- package/docs/class_webdriver_promise_Promise.html +2 -2
- package/docs/class_webdriver_promise_Task_.html +12 -12
- package/docs/class_webdriver_until_Condition.html +3 -0
- package/docs/enum_webdriver_Key.html +1 -1
- package/docs/enum_webdriver_promise_ControlFlow_EventType.html +1 -1
- package/docs/enum_webdriver_promise_Deferred_State_.html +1 -1
- package/docs/index.html +8 -13
- package/docs/interface_webdriver_promise_Thenable.html +8 -10
- package/docs/license.html +1 -1
- package/docs/module_selenium-webdriver.html +2 -2
- package/docs/module_selenium-webdriver__base.html +1 -1
- package/docs/module_selenium-webdriver__base_class_Context.html +1 -1
- package/docs/module_selenium-webdriver_builder.html +1 -1
- package/docs/module_selenium-webdriver_builder_class_Builder.html +1 -1
- package/docs/module_selenium-webdriver_chrome.html +1 -1
- package/docs/module_selenium-webdriver_chrome_class_Driver.html +2 -2
- package/docs/module_selenium-webdriver_chrome_class_Options.html +2 -2
- package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +1 -1
- package/docs/module_selenium-webdriver_error.html +1 -1
- package/docs/module_selenium-webdriver_executors.html +1 -1
- package/docs/module_selenium-webdriver_firefox.html +1 -1
- package/docs/module_selenium-webdriver_firefox_binary.html +1 -1
- package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +1 -1
- package/docs/module_selenium-webdriver_firefox_class_Driver.html +2 -2
- package/docs/module_selenium-webdriver_firefox_class_Options.html +1 -1
- package/docs/module_selenium-webdriver_firefox_extension.html +1 -1
- package/docs/module_selenium-webdriver_firefox_profile.html +1 -1
- package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +1 -1
- package/docs/module_selenium-webdriver_http.html +1 -1
- package/docs/module_selenium-webdriver_http_class_HttpClient.html +1 -1
- package/docs/module_selenium-webdriver_http_util.html +1 -1
- package/docs/module_selenium-webdriver_io.html +1 -1
- package/docs/module_selenium-webdriver_io_exec.html +1 -1
- package/docs/module_selenium-webdriver_net.html +1 -1
- package/docs/module_selenium-webdriver_net_portprober.html +1 -1
- package/docs/module_selenium-webdriver_phantomjs.html +1 -1
- package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +2 -2
- package/docs/module_selenium-webdriver_proxy.html +1 -1
- package/docs/module_selenium-webdriver_remote.html +1 -1
- package/docs/module_selenium-webdriver_remote_class_DriverService.html +2 -2
- package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +2 -2
- package/docs/module_selenium-webdriver_testing.html +16 -29
- package/docs/module_selenium-webdriver_testing_assert.html +1 -1
- package/docs/namespace_webdriver_promise.html +18 -20
- package/docs/namespace_webdriver_stacktrace.html +15 -15
- package/docs/namespace_webdriver_until.html +32 -0
- package/docs/source/_base.js.src.html +1 -1
- package/docs/source/builder.js.src.html +1 -1
- package/docs/source/chrome.js.src.html +1 -1
- package/docs/source/error.js.src.html +1 -1
- package/docs/source/executors.js.src.html +1 -1
- package/docs/source/firefox/binary.js.src.html +1 -1
- package/docs/source/firefox/extension.js.src.html +1 -1
- package/docs/source/firefox/index.js.src.html +1 -1
- package/docs/source/firefox/profile.js.src.html +1 -1
- package/docs/source/http/index.js.src.html +1 -1
- package/docs/source/http/util.js.src.html +1 -1
- package/docs/source/index.js.src.html +1 -1
- package/docs/source/io/exec.js.src.html +1 -1
- package/docs/source/io/index.js.src.html +1 -1
- package/docs/source/lib/atoms/error.js.src.html +1 -1
- package/docs/source/lib/atoms/json.js.src.html +1 -1
- package/docs/source/lib/atoms/response.js.src.html +1 -1
- package/docs/source/lib/atoms/userAgent.js.src.html +1 -1
- package/docs/source/lib/goog/array/array.js.src.html +1 -1
- package/docs/source/lib/goog/asserts/asserts.js.src.html +1 -1
- package/docs/source/lib/goog/async/nexttick.js.src.html +1 -1
- package/docs/source/lib/goog/async/run.js.src.html +1 -1
- package/docs/source/lib/goog/base.js.src.html +1 -1
- package/docs/source/lib/goog/debug/debug.js.src.html +1 -1
- package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +1 -1
- package/docs/source/lib/goog/debug/error.js.src.html +1 -1
- package/docs/source/lib/goog/debug/logbuffer.js.src.html +1 -1
- package/docs/source/lib/goog/debug/logger.js.src.html +1 -1
- package/docs/source/lib/goog/debug/logrecord.js.src.html +1 -1
- package/docs/source/lib/goog/deps.js.src.html +1 -1
- package/docs/source/lib/goog/disposable/disposable.js.src.html +1 -1
- package/docs/source/lib/goog/disposable/idisposable.js.src.html +1 -1
- package/docs/source/lib/goog/dom/browserfeature.js.src.html +1 -1
- package/docs/source/lib/goog/dom/dom.js.src.html +1 -1
- package/docs/source/lib/goog/dom/nodetype.js.src.html +1 -1
- package/docs/source/lib/goog/dom/tagname.js.src.html +1 -1
- package/docs/source/lib/goog/dom/vendor.js.src.html +1 -1
- package/docs/source/lib/goog/events/browserevent.js.src.html +1 -1
- package/docs/source/lib/goog/events/browserfeature.js.src.html +1 -1
- package/docs/source/lib/goog/events/event.js.src.html +1 -1
- package/docs/source/lib/goog/events/eventid.js.src.html +1 -1
- package/docs/source/lib/goog/events/events.js.src.html +1 -1
- package/docs/source/lib/goog/events/eventtarget.js.src.html +1 -1
- package/docs/source/lib/goog/events/eventtype.js.src.html +1 -1
- package/docs/source/lib/goog/events/keycodes.js.src.html +1 -1
- package/docs/source/lib/goog/events/listenable.js.src.html +1 -1
- package/docs/source/lib/goog/events/listener.js.src.html +1 -1
- package/docs/source/lib/goog/events/listenermap.js.src.html +1 -1
- package/docs/source/lib/goog/functions/functions.js.src.html +1 -1
- package/docs/source/lib/goog/iter/iter.js.src.html +1 -1
- package/docs/source/lib/goog/json/json.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/matcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/useragent/browser.js.src.html +1 -1
- package/docs/source/lib/goog/labs/useragent/engine.js.src.html +1 -1
- package/docs/source/lib/goog/labs/useragent/util.js.src.html +1 -1
- package/docs/source/lib/goog/math/box.js.src.html +1 -1
- package/docs/source/lib/goog/math/coordinate.js.src.html +1 -1
- package/docs/source/lib/goog/math/math.js.src.html +1 -1
- package/docs/source/lib/goog/math/rect.js.src.html +1 -1
- package/docs/source/lib/goog/math/size.js.src.html +1 -1
- package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +1 -1
- package/docs/source/lib/goog/net/xhrlike.js.src.html +1 -1
- package/docs/source/lib/goog/net/xmlhttp.js.src.html +1 -1
- package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +1 -1
- package/docs/source/lib/goog/object/object.js.src.html +1 -1
- package/docs/source/lib/goog/reflect/reflect.js.src.html +1 -1
- package/docs/source/lib/goog/string/string.js.src.html +1 -1
- package/docs/source/lib/goog/structs/collection.js.src.html +1 -1
- package/docs/source/lib/goog/structs/map.js.src.html +1 -1
- package/docs/source/lib/goog/structs/set.js.src.html +1 -1
- package/docs/source/lib/goog/structs/structs.js.src.html +1 -1
- package/docs/source/lib/goog/style/style.js.src.html +1 -1
- package/docs/source/lib/goog/testing/asserts.js.src.html +1 -1
- package/docs/source/lib/goog/testing/asynctestcase.js.src.html +1 -1
- package/docs/source/lib/goog/testing/events/events.js.src.html +1 -1
- package/docs/source/lib/goog/testing/functionmock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/jsunit.js.src.html +1 -1
- package/docs/source/lib/goog/testing/loosemock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mockclock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mockcontrol.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mockinterface.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mockmatchers.js.src.html +1 -1
- package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +1 -1
- package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +1 -1
- package/docs/source/lib/goog/testing/recordfunction.js.src.html +1 -1
- package/docs/source/lib/goog/testing/stacktrace.js.src.html +1 -1
- package/docs/source/lib/goog/testing/strictmock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/testcase.js.src.html +1 -1
- package/docs/source/lib/goog/testing/testrunner.js.src.html +1 -1
- package/docs/source/lib/goog/testing/watchers.js.src.html +1 -1
- package/docs/source/lib/goog/uri/uri.js.src.html +1 -1
- package/docs/source/lib/goog/uri/utils.js.src.html +1 -1
- package/docs/source/lib/goog/useragent/product.js.src.html +1 -1
- package/docs/source/lib/goog/useragent/product_isversion.js.src.html +1 -1
- package/docs/source/lib/goog/useragent/useragent.js.src.html +1 -1
- package/docs/source/lib/webdriver/abstractbuilder.js.src.html +1 -1
- package/docs/source/lib/webdriver/actionsequence.js.src.html +1 -1
- package/docs/source/lib/webdriver/builder.js.src.html +1 -1
- package/docs/source/lib/webdriver/button.js.src.html +1 -1
- package/docs/source/lib/webdriver/capabilities.js.src.html +1 -1
- package/docs/source/lib/webdriver/command.js.src.html +1 -1
- package/docs/source/lib/webdriver/events.js.src.html +1 -1
- package/docs/source/lib/webdriver/firefoxdomexecutor.js.src.html +1 -1
- package/docs/source/lib/webdriver/http/corsclient.js.src.html +1 -1
- package/docs/source/lib/webdriver/http/http.js.src.html +1 -1
- package/docs/source/lib/webdriver/http/xhrclient.js.src.html +1 -1
- package/docs/source/lib/webdriver/key.js.src.html +1 -1
- package/docs/source/lib/webdriver/locators.js.src.html +1 -1
- package/docs/source/lib/webdriver/logging.js.src.html +1 -1
- package/docs/source/lib/webdriver/process.js.src.html +1 -1
- package/docs/source/lib/webdriver/promise.js.src.html +1 -1
- package/docs/source/lib/webdriver/session.js.src.html +1 -1
- package/docs/source/lib/webdriver/stacktrace.js.src.html +1 -1
- package/docs/source/lib/webdriver/testing/asserts.js.src.html +1 -1
- package/docs/source/lib/webdriver/testing/testcase.js.src.html +1 -1
- package/docs/source/lib/webdriver/until.js.src.html +1 -0
- package/docs/source/lib/webdriver/webdriver.js.src.html +1 -1
- package/docs/source/net/index.js.src.html +1 -1
- package/docs/source/net/portprober.js.src.html +1 -1
- package/docs/source/phantomjs.js.src.html +1 -1
- package/docs/source/proxy.js.src.html +1 -1
- package/docs/source/remote/index.js.src.html +1 -1
- package/docs/source/testing/assert.js.src.html +1 -1
- package/docs/source/testing/index.js.src.html +1 -1
- package/docs/types.js +1 -1
- package/example/google_search.js +9 -17
- package/example/google_search_generator.js +6 -7
- package/example/google_search_test.js +10 -18
- package/example/parallel_flows.js +4 -7
- package/index.js +6 -0
- package/lib/firefox/webdriver.xpi +0 -0
- package/lib/goog/deps.js +7 -5
- package/lib/test/index.js +0 -8
- package/lib/webdriver/promise.js +263 -251
- package/lib/webdriver/stacktrace.js +15 -1
- package/lib/webdriver/test/promise_flow_test.js +82 -76
- package/lib/webdriver/test/promise_test.js +22 -62
- package/lib/webdriver/test/stacktrace_test.js +18 -0
- package/lib/webdriver/test/until_test.js +388 -0
- package/lib/webdriver/test/webdriver_test.js +41 -0
- package/lib/webdriver/until.js +408 -0
- package/lib/webdriver/webdriver.js +91 -29
- package/package.json +2 -2
- package/test/element_finding_test.js +6 -6
- package/test/http/util_test.js +4 -5
- package/test/page_loading_test.js +7 -7
- package/test/stale_element_test.js +2 -10
- package/testing/index.js +9 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>remote/index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>'use strict';<tr><td><a name="l16" href="#l16">16</a><td><tr><td><a name="l17" href="#l17">17</a><td>var path = require('path'),<tr><td><a name="l18" href="#l18">18</a><td> url = require('url'),<tr><td><a name="l19" href="#l19">19</a><td> util = require('util');<tr><td><a name="l20" href="#l20">20</a><td><tr><td><a name="l21" href="#l21">21</a><td>var promise = require('../').promise,<tr><td><a name="l22" href="#l22">22</a><td> httpUtil = require('../http/util'),<tr><td><a name="l23" href="#l23">23</a><td> exec = require('../io/exec'),<tr><td><a name="l24" href="#l24">24</a><td> net = require('../net'),<tr><td><a name="l25" href="#l25">25</a><td> portprober = require('../net/portprober');<tr><td><a name="l26" href="#l26">26</a><td><tr><td><a name="l27" href="#l27">27</a><td><tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td>/**<tr><td><a name="l30" href="#l30">30</a><td> * Configuration options for a DriverService instance.<tr><td><a name="l31" href="#l31">31</a><td> * <ul><tr><td><a name="l32" href="#l32">32</a><td> * <li><tr><td><a name="l33" href="#l33">33</a><td> * <li>{@code loopback} - Whether the service should only be accessed on this<tr><td><a name="l34" href="#l34">34</a><td> * host's loopback address.<tr><td><a name="l35" href="#l35">35</a><td> * <li>{@code port} - The port to start the server on (must be > 0). If the<tr><td><a name="l36" href="#l36">36</a><td> * port is provided as a promise, the service will wait for the promise to<tr><td><a name="l37" href="#l37">37</a><td> * resolve before starting.<tr><td><a name="l38" href="#l38">38</a><td> * <li>{@code args} - The arguments to pass to the service. If a promise is<tr><td><a name="l39" href="#l39">39</a><td> * provided, the service will wait for it to resolve before starting.<tr><td><a name="l40" href="#l40">40</a><td> * <li>{@code path} - The base path on the server for the WebDriver wire<tr><td><a name="l41" href="#l41">41</a><td> * protocol (e.g. '/wd/hub'). Defaults to '/'.<tr><td><a name="l42" href="#l42">42</a><td> * <li>{@code env} - The environment variables that should be visible to the<tr><td><a name="l43" href="#l43">43</a><td> * server process. Defaults to inheriting the current process's<tr><td><a name="l44" href="#l44">44</a><td> * environment.<tr><td><a name="l45" href="#l45">45</a><td> * <li>{@code stdio} - IO configuration for the spawned server process. For<tr><td><a name="l46" href="#l46">46</a><td> * more information, refer to the documentation of<tr><td><a name="l47" href="#l47">47</a><td> * {@code child_process.spawn}.<tr><td><a name="l48" href="#l48">48</a><td> * </ul><tr><td><a name="l49" href="#l49">49</a><td> *<tr><td><a name="l50" href="#l50">50</a><td> * @typedef {{<tr><td><a name="l51" href="#l51">51</a><td> * port: (number|!webdriver.promise.Promise.<number>),<tr><td><a name="l52" href="#l52">52</a><td> * args: !(Array.<string>|webdriver.promise.Promise.<!Array.<string>>),<tr><td><a name="l53" href="#l53">53</a><td> * path: (string|undefined),<tr><td><a name="l54" href="#l54">54</a><td> * env: (!Object.<string, string>|undefined),<tr><td><a name="l55" href="#l55">55</a><td> * stdio: (string|!Array.<string|number|!Stream|null|undefined>|undefined)<tr><td><a name="l56" href="#l56">56</a><td> * }}<tr><td><a name="l57" href="#l57">57</a><td> */<tr><td><a name="l58" href="#l58">58</a><td>var ServiceOptions;<tr><td><a name="l59" href="#l59">59</a><td><tr><td><a name="l60" href="#l60">60</a><td><tr><td><a name="l61" href="#l61">61</a><td>/**<tr><td><a name="l62" href="#l62">62</a><td> * Manages the life and death of a native executable WebDriver server.<tr><td><a name="l63" href="#l63">63</a><td> *<tr><td><a name="l64" href="#l64">64</a><td> * <p>It is expected that the driver server implements the<tr><td><a name="l65" href="#l65">65</a><td> * <a href="http://code.google.com/p/selenium/wiki/JsonWireProtocol">WebDriver<tr><td><a name="l66" href="#l66">66</a><td> * Wire Protocol</a>. Furthermore, the managed server should support multiple<tr><td><a name="l67" href="#l67">67</a><td> * concurrent sessions, so that this class may be reused for multiple clients.<tr><td><a name="l68" href="#l68">68</a><td> *<tr><td><a name="l69" href="#l69">69</a><td> * @param {string} executable Path to the executable to run.<tr><td><a name="l70" href="#l70">70</a><td> * @param {!ServiceOptions} options Configuration options for the service.<tr><td><a name="l71" href="#l71">71</a><td> * @constructor<tr><td><a name="l72" href="#l72">72</a><td> */<tr><td><a name="l73" href="#l73">73</a><td>function DriverService(executable, options) {<tr><td><a name="l74" href="#l74">74</a><td><tr><td><a name="l75" href="#l75">75</a><td> /** @private {string} */<tr><td><a name="l76" href="#l76">76</a><td> this.executable_ = executable;<tr><td><a name="l77" href="#l77">77</a><td><tr><td><a name="l78" href="#l78">78</a><td> /** @private {boolean} */<tr><td><a name="l79" href="#l79">79</a><td> this.loopbackOnly_ = !!options.loopback;<tr><td><a name="l80" href="#l80">80</a><td><tr><td><a name="l81" href="#l81">81</a><td> /** @private {(number|!webdriver.promise.Promise.<number>)} */<tr><td><a name="l82" href="#l82">82</a><td> this.port_ = options.port;<tr><td><a name="l83" href="#l83">83</a><td><tr><td><a name="l84" href="#l84">84</a><td> /**<tr><td><a name="l85" href="#l85">85</a><td> * @private {!(Array.<string>|webdriver.promise.Promise.<!Array.<string>>)}<tr><td><a name="l86" href="#l86">86</a><td> */<tr><td><a name="l87" href="#l87">87</a><td> this.args_ = options.args;<tr><td><a name="l88" href="#l88">88</a><td><tr><td><a name="l89" href="#l89">89</a><td> /** @private {string} */<tr><td><a name="l90" href="#l90">90</a><td> this.path_ = options.path || '/';<tr><td><a name="l91" href="#l91">91</a><td><tr><td><a name="l92" href="#l92">92</a><td> /** @private {!Object.<string, string>} */<tr><td><a name="l93" href="#l93">93</a><td> this.env_ = options.env || process.env;<tr><td><a name="l94" href="#l94">94</a><td><tr><td><a name="l95" href="#l95">95</a><td> /** @private {(string|!Array.<string|number|!Stream|null|undefined>)} */<tr><td><a name="l96" href="#l96">96</a><td> this.stdio_ = options.stdio || 'ignore';<tr><td><a name="l97" href="#l97">97</a><td><tr><td><a name="l98" href="#l98">98</a><td> /**<tr><td><a name="l99" href="#l99">99</a><td> * A promise for the managed subprocess, or null if the server has not been<tr><td><a name="l100" href="#l100">100</a><td> * started yet. This promise will never be rejected.<tr><td><a name="l101" href="#l101">101</a><td> * @private {promise.Promise.<!exec.Command>}<tr><td><a name="l102" href="#l102">102</a><td> */<tr><td><a name="l103" href="#l103">103</a><td> this.command_ = null;<tr><td><a name="l104" href="#l104">104</a><td><tr><td><a name="l105" href="#l105">105</a><td> /**<tr><td><a name="l106" href="#l106">106</a><td> * Promise that resolves to the server's address or null if the server has<tr><td><a name="l107" href="#l107">107</a><td> * not been started. This promise will be rejected if the server terminates<tr><td><a name="l108" href="#l108">108</a><td> * before it starts accepting WebDriver requests.<tr><td><a name="l109" href="#l109">109</a><td> * @private {promise.Promise.<string>}<tr><td><a name="l110" href="#l110">110</a><td> */<tr><td><a name="l111" href="#l111">111</a><td> this.address_ = null;<tr><td><a name="l112" href="#l112">112</a><td>}<tr><td><a name="l113" href="#l113">113</a><td><tr><td><a name="l114" href="#l114">114</a><td><tr><td><a name="l115" href="#l115">115</a><td>/**<tr><td><a name="l116" href="#l116">116</a><td> * The default amount of time, in milliseconds, to wait for the server to<tr><td><a name="l117" href="#l117">117</a><td> * start.<tr><td><a name="l118" href="#l118">118</a><td> * @type {number}<tr><td><a name="l119" href="#l119">119</a><td> */<tr><td><a name="l120" href="#l120">120</a><td>DriverService.DEFAULT_START_TIMEOUT_MS = 30 * 1000;<tr><td><a name="l121" href="#l121">121</a><td><tr><td><a name="l122" href="#l122">122</a><td><tr><td><a name="l123" href="#l123">123</a><td>/**<tr><td><a name="l124" href="#l124">124</a><td> * @return {!webdriver.promise.Promise.<string>} A promise that resolves to<tr><td><a name="l125" href="#l125">125</a><td> * the server's address.<tr><td><a name="l126" href="#l126">126</a><td> * @throws {Error} If the server has not been started.<tr><td><a name="l127" href="#l127">127</a><td> */<tr><td><a name="l128" href="#l128">128</a><td>DriverService.prototype.address = function() {<tr><td><a name="l129" href="#l129">129</a><td> if (this.address_) {<tr><td><a name="l130" href="#l130">130</a><td> return this.address_;<tr><td><a name="l131" href="#l131">131</a><td> }<tr><td><a name="l132" href="#l132">132</a><td> throw Error('Server has not been started.');<tr><td><a name="l133" href="#l133">133</a><td>};<tr><td><a name="l134" href="#l134">134</a><td><tr><td><a name="l135" href="#l135">135</a><td><tr><td><a name="l136" href="#l136">136</a><td>/**<tr><td><a name="l137" href="#l137">137</a><td> * Returns whether the underlying process is still running. This does not take<tr><td><a name="l138" href="#l138">138</a><td> * into account whether the process is in the process of shutting down.<tr><td><a name="l139" href="#l139">139</a><td> * @return {boolean} Whether the underlying service process is running.<tr><td><a name="l140" href="#l140">140</a><td> */<tr><td><a name="l141" href="#l141">141</a><td>DriverService.prototype.isRunning = function() {<tr><td><a name="l142" href="#l142">142</a><td> return !!this.address_;<tr><td><a name="l143" href="#l143">143</a><td>};<tr><td><a name="l144" href="#l144">144</a><td><tr><td><a name="l145" href="#l145">145</a><td><tr><td><a name="l146" href="#l146">146</a><td>/**<tr><td><a name="l147" href="#l147">147</a><td> * Starts the server if it is not already running.<tr><td><a name="l148" href="#l148">148</a><td> * @param {number=} opt_timeoutMs How long to wait, in milliseconds, for the<tr><td><a name="l149" href="#l149">149</a><td> * server to start accepting requests. Defaults to 30 seconds.<tr><td><a name="l150" href="#l150">150</a><td> * @return {!promise.Promise.<string>} A promise that will resolve<tr><td><a name="l151" href="#l151">151</a><td> * to the server's base URL when it has started accepting requests. If the<tr><td><a name="l152" href="#l152">152</a><td> * timeout expires before the server has started, the promise will be<tr><td><a name="l153" href="#l153">153</a><td> * rejected.<tr><td><a name="l154" href="#l154">154</a><td> */<tr><td><a name="l155" href="#l155">155</a><td>DriverService.prototype.start = function(opt_timeoutMs) {<tr><td><a name="l156" href="#l156">156</a><td> if (this.address_) {<tr><td><a name="l157" href="#l157">157</a><td> return this.address_;<tr><td><a name="l158" href="#l158">158</a><td> }<tr><td><a name="l159" href="#l159">159</a><td><tr><td><a name="l160" href="#l160">160</a><td> var timeout = opt_timeoutMs || DriverService.DEFAULT_START_TIMEOUT_MS;<tr><td><a name="l161" href="#l161">161</a><td><tr><td><a name="l162" href="#l162">162</a><td> var self = this;<tr><td><a name="l163" href="#l163">163</a><td> this.command_ = promise.defer();<tr><td><a name="l164" href="#l164">164</a><td> this.address_ = promise.defer();<tr><td><a name="l165" href="#l165">165</a><td> this.address_.fulfill(promise.when(this.port_, function(port) {<tr><td><a name="l166" href="#l166">166</a><td> if (port <= 0) {<tr><td><a name="l167" href="#l167">167</a><td> throw Error('Port must be > 0: ' + port);<tr><td><a name="l168" href="#l168">168</a><td> }<tr><td><a name="l169" href="#l169">169</a><td> return promise.when(self.args_, function(args) {<tr><td><a name="l170" href="#l170">170</a><td> var command = exec(self.executable_, {<tr><td><a name="l171" href="#l171">171</a><td> args: args,<tr><td><a name="l172" href="#l172">172</a><td> env: self.env_,<tr><td><a name="l173" href="#l173">173</a><td> stdio: self.stdio_<tr><td><a name="l174" href="#l174">174</a><td> });<tr><td><a name="l175" href="#l175">175</a><td><tr><td><a name="l176" href="#l176">176</a><td> self.command_.fulfill(command);<tr><td><a name="l177" href="#l177">177</a><td><tr><td><a name="l178" href="#l178">178</a><td> command.result().then(function(result) {<tr><td><a name="l179" href="#l179">179</a><td> self.address_.reject(result.code == null ?<tr><td><a name="l180" href="#l180">180</a><td> Error('Server was killed with ' + result.signal) :<tr><td><a name="l181" href="#l181">181</a><td> Error('Server exited with ' + result.code));<tr><td><a name="l182" href="#l182">182</a><td> self.address_ = null;<tr><td><a name="l183" href="#l183">183</a><td> self.command_ = null;<tr><td><a name="l184" href="#l184">184</a><td> });<tr><td><a name="l185" href="#l185">185</a><td><tr><td><a name="l186" href="#l186">186</a><td> var serverUrl = url.format({<tr><td><a name="l187" href="#l187">187</a><td> protocol: 'http',<tr><td><a name="l188" href="#l188">188</a><td> hostname: !self.loopbackOnly_ && net.getAddress() ||<tr><td><a name="l189" href="#l189">189</a><td> net.getLoopbackAddress(),<tr><td><a name="l190" href="#l190">190</a><td> port: port,<tr><td><a name="l191" href="#l191">191</a><td> pathname: self.path_<tr><td><a name="l192" href="#l192">192</a><td> });<tr><td><a name="l193" href="#l193">193</a><td><tr><td><a name="l194" href="#l194">194</a><td> return httpUtil.waitForServer(serverUrl, timeout).then(function() {<tr><td><a name="l195" href="#l195">195</a><td> return serverUrl;<tr><td><a name="l196" href="#l196">196</a><td> });<tr><td><a name="l197" href="#l197">197</a><td> });<tr><td><a name="l198" href="#l198">198</a><td> }));<tr><td><a name="l199" href="#l199">199</a><td><tr><td><a name="l200" href="#l200">200</a><td> return this.address_;<tr><td><a name="l201" href="#l201">201</a><td>};<tr><td><a name="l202" href="#l202">202</a><td><tr><td><a name="l203" href="#l203">203</a><td><tr><td><a name="l204" href="#l204">204</a><td>/**<tr><td><a name="l205" href="#l205">205</a><td> * Stops the service if it is not currently running. This function will kill<tr><td><a name="l206" href="#l206">206</a><td> * the server immediately. To synchronize with the active control flow, use<tr><td><a name="l207" href="#l207">207</a><td> * {@link #stop()}.<tr><td><a name="l208" href="#l208">208</a><td> * @return {!webdriver.promise.Promise} A promise that will be resolved when<tr><td><a name="l209" href="#l209">209</a><td> * the server has been stopped.<tr><td><a name="l210" href="#l210">210</a><td> */<tr><td><a name="l211" href="#l211">211</a><td>DriverService.prototype.kill = function() {<tr><td><a name="l212" href="#l212">212</a><td> if (!this.address_ || !this.command_) {<tr><td><a name="l213" href="#l213">213</a><td> return promise.fulfilled(); // Not currently running.<tr><td><a name="l214" href="#l214">214</a><td> }<tr><td><a name="l215" href="#l215">215</a><td> return this.command_.then(function(command) {<tr><td><a name="l216" href="#l216">216</a><td> command.kill('SIGTERM');<tr><td><a name="l217" href="#l217">217</a><td> });<tr><td><a name="l218" href="#l218">218</a><td>};<tr><td><a name="l219" href="#l219">219</a><td><tr><td><a name="l220" href="#l220">220</a><td><tr><td><a name="l221" href="#l221">221</a><td>/**<tr><td><a name="l222" href="#l222">222</a><td> * Schedules a task in the current control flow to stop the server if it is<tr><td><a name="l223" href="#l223">223</a><td> * currently running.<tr><td><a name="l224" href="#l224">224</a><td> * @return {!webdriver.promise.Promise} A promise that will be resolved when<tr><td><a name="l225" href="#l225">225</a><td> * the server has been stopped.<tr><td><a name="l226" href="#l226">226</a><td> */<tr><td><a name="l227" href="#l227">227</a><td>DriverService.prototype.stop = function() {<tr><td><a name="l228" href="#l228">228</a><td> return promise.controlFlow().execute(this.kill.bind(this));<tr><td><a name="l229" href="#l229">229</a><td>};<tr><td><a name="l230" href="#l230">230</a><td><tr><td><a name="l231" href="#l231">231</a><td><tr><td><a name="l232" href="#l232">232</a><td><tr><td><a name="l233" href="#l233">233</a><td>/**<tr><td><a name="l234" href="#l234">234</a><td> * Manages the life and death of the Selenium standalone server. The server<tr><td><a name="l235" href="#l235">235</a><td> * may be obtained from http://selenium-release.storage.googleapis.com/index.html.<tr><td><a name="l236" href="#l236">236</a><td> * @param {string} jar Path to the Selenium server jar.<tr><td><a name="l237" href="#l237">237</a><td> * @param {!SeleniumServer.Options} options Configuration options for the<tr><td><a name="l238" href="#l238">238</a><td> * server.<tr><td><a name="l239" href="#l239">239</a><td> * @throws {Error} If an invalid port is specified.<tr><td><a name="l240" href="#l240">240</a><td> * @constructor<tr><td><a name="l241" href="#l241">241</a><td> * @extends {DriverService}<tr><td><a name="l242" href="#l242">242</a><td> */<tr><td><a name="l243" href="#l243">243</a><td>function SeleniumServer(jar, options) {<tr><td><a name="l244" href="#l244">244</a><td> if (options.port < 0)<tr><td><a name="l245" href="#l245">245</a><td> throw Error('Port must be >= 0: ' + options.port);<tr><td><a name="l246" href="#l246">246</a><td><tr><td><a name="l247" href="#l247">247</a><td> var port = options.port || portprober.findFreePort();<tr><td><a name="l248" href="#l248">248</a><td> var args = promise.when(options.jvmArgs || [], function(jvmArgs) {<tr><td><a name="l249" href="#l249">249</a><td> return promise.when(options.args || [], function(args) {<tr><td><a name="l250" href="#l250">250</a><td> return promise.when(port, function(port) {<tr><td><a name="l251" href="#l251">251</a><td> return jvmArgs.concat(['-jar', jar, '-port', port]).concat(args);<tr><td><a name="l252" href="#l252">252</a><td> });<tr><td><a name="l253" href="#l253">253</a><td> });<tr><td><a name="l254" href="#l254">254</a><td> });<tr><td><a name="l255" href="#l255">255</a><td><tr><td><a name="l256" href="#l256">256</a><td> DriverService.call(this, 'java', {<tr><td><a name="l257" href="#l257">257</a><td> port: port,<tr><td><a name="l258" href="#l258">258</a><td> args: args,<tr><td><a name="l259" href="#l259">259</a><td> path: '/wd/hub',<tr><td><a name="l260" href="#l260">260</a><td> env: options.env,<tr><td><a name="l261" href="#l261">261</a><td> stdio: options.stdio<tr><td><a name="l262" href="#l262">262</a><td> });<tr><td><a name="l263" href="#l263">263</a><td>}<tr><td><a name="l264" href="#l264">264</a><td>util.inherits(SeleniumServer, DriverService);<tr><td><a name="l265" href="#l265">265</a><td><tr><td><a name="l266" href="#l266">266</a><td><tr><td><a name="l267" href="#l267">267</a><td>/**<tr><td><a name="l268" href="#l268">268</a><td> * Options for the Selenium server:<tr><td><a name="l269" href="#l269">269</a><td> * <ul><tr><td><a name="l270" href="#l270">270</a><td> * <li>{@code port} - The port to start the server on (must be > 0). If the<tr><td><a name="l271" href="#l271">271</a><td> * port is provided as a promise, the service will wait for the promise to<tr><td><a name="l272" href="#l272">272</a><td> * resolve before starting.<tr><td><a name="l273" href="#l273">273</a><td> * <li>{@code args} - The arguments to pass to the service. If a promise is<tr><td><a name="l274" href="#l274">274</a><td> * provided, the service will wait for it to resolve before starting.<tr><td><a name="l275" href="#l275">275</a><td> * <li>{@code jvmArgs} - The arguments to pass to the JVM. If a promise is<tr><td><a name="l276" href="#l276">276</a><td> * provided, the service will wait for it to resolve before starting.<tr><td><a name="l277" href="#l277">277</a><td> * <li>{@code env} - The environment variables that should be visible to the<tr><td><a name="l278" href="#l278">278</a><td> * server process. Defaults to inheriting the current process's<tr><td><a name="l279" href="#l279">279</a><td> * environment.<tr><td><a name="l280" href="#l280">280</a><td> * <li>{@code stdio} - IO configuration for the spawned server process. For<tr><td><a name="l281" href="#l281">281</a><td> * more information, refer to the documentation of<tr><td><a name="l282" href="#l282">282</a><td> * {@code child_process.spawn}.<tr><td><a name="l283" href="#l283">283</a><td> * </ul><tr><td><a name="l284" href="#l284">284</a><td> *<tr><td><a name="l285" href="#l285">285</a><td> * @typedef {{<tr><td><a name="l286" href="#l286">286</a><td> * port: (number|!webdriver.promise.Promise.<number>),<tr><td><a name="l287" href="#l287">287</a><td> * args: !(Array.<string>|webdriver.promise.Promise.<!Array.<string>>),<tr><td><a name="l288" href="#l288">288</a><td> * jvmArgs: (!Array.<string>|<tr><td><a name="l289" href="#l289">289</a><td> * !webdriver.promise.Promise.<!Array.<string>>|<tr><td><a name="l290" href="#l290">290</a><td> * undefined),<tr><td><a name="l291" href="#l291">291</a><td> * env: (!Object.<string, string>|undefined),<tr><td><a name="l292" href="#l292">292</a><td> * stdio: (string|!Array.<string|number|!Stream|null|undefined>|undefined)<tr><td><a name="l293" href="#l293">293</a><td> * }}<tr><td><a name="l294" href="#l294">294</a><td> */<tr><td><a name="l295" href="#l295">295</a><td>SeleniumServer.Options;<tr><td><a name="l296" href="#l296">296</a><td><tr><td><a name="l297" href="#l297">297</a><td><tr><td><a name="l298" href="#l298">298</a><td>// PUBLIC API<tr><td><a name="l299" href="#l299">299</a><td><tr><td><a name="l300" href="#l300">300</a><td>exports.DriverService = DriverService;<tr><td><a name="l301" href="#l301">301</a><td>exports.SeleniumServer = SeleniumServer;</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
|
|
1
|
+
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>remote/index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>'use strict';<tr><td><a name="l16" href="#l16">16</a><td><tr><td><a name="l17" href="#l17">17</a><td>var path = require('path'),<tr><td><a name="l18" href="#l18">18</a><td> url = require('url'),<tr><td><a name="l19" href="#l19">19</a><td> util = require('util');<tr><td><a name="l20" href="#l20">20</a><td><tr><td><a name="l21" href="#l21">21</a><td>var promise = require('../').promise,<tr><td><a name="l22" href="#l22">22</a><td> httpUtil = require('../http/util'),<tr><td><a name="l23" href="#l23">23</a><td> exec = require('../io/exec'),<tr><td><a name="l24" href="#l24">24</a><td> net = require('../net'),<tr><td><a name="l25" href="#l25">25</a><td> portprober = require('../net/portprober');<tr><td><a name="l26" href="#l26">26</a><td><tr><td><a name="l27" href="#l27">27</a><td><tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td>/**<tr><td><a name="l30" href="#l30">30</a><td> * Configuration options for a DriverService instance.<tr><td><a name="l31" href="#l31">31</a><td> * <ul><tr><td><a name="l32" href="#l32">32</a><td> * <li><tr><td><a name="l33" href="#l33">33</a><td> * <li>{@code loopback} - Whether the service should only be accessed on this<tr><td><a name="l34" href="#l34">34</a><td> * host's loopback address.<tr><td><a name="l35" href="#l35">35</a><td> * <li>{@code port} - The port to start the server on (must be > 0). If the<tr><td><a name="l36" href="#l36">36</a><td> * port is provided as a promise, the service will wait for the promise to<tr><td><a name="l37" href="#l37">37</a><td> * resolve before starting.<tr><td><a name="l38" href="#l38">38</a><td> * <li>{@code args} - The arguments to pass to the service. If a promise is<tr><td><a name="l39" href="#l39">39</a><td> * provided, the service will wait for it to resolve before starting.<tr><td><a name="l40" href="#l40">40</a><td> * <li>{@code path} - The base path on the server for the WebDriver wire<tr><td><a name="l41" href="#l41">41</a><td> * protocol (e.g. '/wd/hub'). Defaults to '/'.<tr><td><a name="l42" href="#l42">42</a><td> * <li>{@code env} - The environment variables that should be visible to the<tr><td><a name="l43" href="#l43">43</a><td> * server process. Defaults to inheriting the current process's<tr><td><a name="l44" href="#l44">44</a><td> * environment.<tr><td><a name="l45" href="#l45">45</a><td> * <li>{@code stdio} - IO configuration for the spawned server process. For<tr><td><a name="l46" href="#l46">46</a><td> * more information, refer to the documentation of<tr><td><a name="l47" href="#l47">47</a><td> * {@code child_process.spawn}.<tr><td><a name="l48" href="#l48">48</a><td> * </ul><tr><td><a name="l49" href="#l49">49</a><td> *<tr><td><a name="l50" href="#l50">50</a><td> * @typedef {{<tr><td><a name="l51" href="#l51">51</a><td> * port: (number|!webdriver.promise.Promise.<number>),<tr><td><a name="l52" href="#l52">52</a><td> * args: !(Array.<string>|webdriver.promise.Promise.<!Array.<string>>),<tr><td><a name="l53" href="#l53">53</a><td> * path: (string|undefined),<tr><td><a name="l54" href="#l54">54</a><td> * env: (!Object.<string, string>|undefined),<tr><td><a name="l55" href="#l55">55</a><td> * stdio: (string|!Array.<string|number|!Stream|null|undefined>|undefined)<tr><td><a name="l56" href="#l56">56</a><td> * }}<tr><td><a name="l57" href="#l57">57</a><td> */<tr><td><a name="l58" href="#l58">58</a><td>var ServiceOptions;<tr><td><a name="l59" href="#l59">59</a><td><tr><td><a name="l60" href="#l60">60</a><td><tr><td><a name="l61" href="#l61">61</a><td>/**<tr><td><a name="l62" href="#l62">62</a><td> * Manages the life and death of a native executable WebDriver server.<tr><td><a name="l63" href="#l63">63</a><td> *<tr><td><a name="l64" href="#l64">64</a><td> * <p>It is expected that the driver server implements the<tr><td><a name="l65" href="#l65">65</a><td> * <a href="http://code.google.com/p/selenium/wiki/JsonWireProtocol">WebDriver<tr><td><a name="l66" href="#l66">66</a><td> * Wire Protocol</a>. Furthermore, the managed server should support multiple<tr><td><a name="l67" href="#l67">67</a><td> * concurrent sessions, so that this class may be reused for multiple clients.<tr><td><a name="l68" href="#l68">68</a><td> *<tr><td><a name="l69" href="#l69">69</a><td> * @param {string} executable Path to the executable to run.<tr><td><a name="l70" href="#l70">70</a><td> * @param {!ServiceOptions} options Configuration options for the service.<tr><td><a name="l71" href="#l71">71</a><td> * @constructor<tr><td><a name="l72" href="#l72">72</a><td> */<tr><td><a name="l73" href="#l73">73</a><td>function DriverService(executable, options) {<tr><td><a name="l74" href="#l74">74</a><td><tr><td><a name="l75" href="#l75">75</a><td> /** @private {string} */<tr><td><a name="l76" href="#l76">76</a><td> this.executable_ = executable;<tr><td><a name="l77" href="#l77">77</a><td><tr><td><a name="l78" href="#l78">78</a><td> /** @private {boolean} */<tr><td><a name="l79" href="#l79">79</a><td> this.loopbackOnly_ = !!options.loopback;<tr><td><a name="l80" href="#l80">80</a><td><tr><td><a name="l81" href="#l81">81</a><td> /** @private {(number|!webdriver.promise.Promise.<number>)} */<tr><td><a name="l82" href="#l82">82</a><td> this.port_ = options.port;<tr><td><a name="l83" href="#l83">83</a><td><tr><td><a name="l84" href="#l84">84</a><td> /**<tr><td><a name="l85" href="#l85">85</a><td> * @private {!(Array.<string>|webdriver.promise.Promise.<!Array.<string>>)}<tr><td><a name="l86" href="#l86">86</a><td> */<tr><td><a name="l87" href="#l87">87</a><td> this.args_ = options.args;<tr><td><a name="l88" href="#l88">88</a><td><tr><td><a name="l89" href="#l89">89</a><td> /** @private {string} */<tr><td><a name="l90" href="#l90">90</a><td> this.path_ = options.path || '/';<tr><td><a name="l91" href="#l91">91</a><td><tr><td><a name="l92" href="#l92">92</a><td> /** @private {!Object.<string, string>} */<tr><td><a name="l93" href="#l93">93</a><td> this.env_ = options.env || process.env;<tr><td><a name="l94" href="#l94">94</a><td><tr><td><a name="l95" href="#l95">95</a><td> /** @private {(string|!Array.<string|number|!Stream|null|undefined>)} */<tr><td><a name="l96" href="#l96">96</a><td> this.stdio_ = options.stdio || 'ignore';<tr><td><a name="l97" href="#l97">97</a><td><tr><td><a name="l98" href="#l98">98</a><td> /**<tr><td><a name="l99" href="#l99">99</a><td> * A promise for the managed subprocess, or null if the server has not been<tr><td><a name="l100" href="#l100">100</a><td> * started yet. This promise will never be rejected.<tr><td><a name="l101" href="#l101">101</a><td> * @private {promise.Promise.<!exec.Command>}<tr><td><a name="l102" href="#l102">102</a><td> */<tr><td><a name="l103" href="#l103">103</a><td> this.command_ = null;<tr><td><a name="l104" href="#l104">104</a><td><tr><td><a name="l105" href="#l105">105</a><td> /**<tr><td><a name="l106" href="#l106">106</a><td> * Promise that resolves to the server's address or null if the server has<tr><td><a name="l107" href="#l107">107</a><td> * not been started. This promise will be rejected if the server terminates<tr><td><a name="l108" href="#l108">108</a><td> * before it starts accepting WebDriver requests.<tr><td><a name="l109" href="#l109">109</a><td> * @private {promise.Promise.<string>}<tr><td><a name="l110" href="#l110">110</a><td> */<tr><td><a name="l111" href="#l111">111</a><td> this.address_ = null;<tr><td><a name="l112" href="#l112">112</a><td>}<tr><td><a name="l113" href="#l113">113</a><td><tr><td><a name="l114" href="#l114">114</a><td><tr><td><a name="l115" href="#l115">115</a><td>/**<tr><td><a name="l116" href="#l116">116</a><td> * The default amount of time, in milliseconds, to wait for the server to<tr><td><a name="l117" href="#l117">117</a><td> * start.<tr><td><a name="l118" href="#l118">118</a><td> * @type {number}<tr><td><a name="l119" href="#l119">119</a><td> */<tr><td><a name="l120" href="#l120">120</a><td>DriverService.DEFAULT_START_TIMEOUT_MS = 30 * 1000;<tr><td><a name="l121" href="#l121">121</a><td><tr><td><a name="l122" href="#l122">122</a><td><tr><td><a name="l123" href="#l123">123</a><td>/**<tr><td><a name="l124" href="#l124">124</a><td> * @return {!webdriver.promise.Promise.<string>} A promise that resolves to<tr><td><a name="l125" href="#l125">125</a><td> * the server's address.<tr><td><a name="l126" href="#l126">126</a><td> * @throws {Error} If the server has not been started.<tr><td><a name="l127" href="#l127">127</a><td> */<tr><td><a name="l128" href="#l128">128</a><td>DriverService.prototype.address = function() {<tr><td><a name="l129" href="#l129">129</a><td> if (this.address_) {<tr><td><a name="l130" href="#l130">130</a><td> return this.address_;<tr><td><a name="l131" href="#l131">131</a><td> }<tr><td><a name="l132" href="#l132">132</a><td> throw Error('Server has not been started.');<tr><td><a name="l133" href="#l133">133</a><td>};<tr><td><a name="l134" href="#l134">134</a><td><tr><td><a name="l135" href="#l135">135</a><td><tr><td><a name="l136" href="#l136">136</a><td>/**<tr><td><a name="l137" href="#l137">137</a><td> * Returns whether the underlying process is still running. This does not take<tr><td><a name="l138" href="#l138">138</a><td> * into account whether the process is in the process of shutting down.<tr><td><a name="l139" href="#l139">139</a><td> * @return {boolean} Whether the underlying service process is running.<tr><td><a name="l140" href="#l140">140</a><td> */<tr><td><a name="l141" href="#l141">141</a><td>DriverService.prototype.isRunning = function() {<tr><td><a name="l142" href="#l142">142</a><td> return !!this.address_;<tr><td><a name="l143" href="#l143">143</a><td>};<tr><td><a name="l144" href="#l144">144</a><td><tr><td><a name="l145" href="#l145">145</a><td><tr><td><a name="l146" href="#l146">146</a><td>/**<tr><td><a name="l147" href="#l147">147</a><td> * Starts the server if it is not already running.<tr><td><a name="l148" href="#l148">148</a><td> * @param {number=} opt_timeoutMs How long to wait, in milliseconds, for the<tr><td><a name="l149" href="#l149">149</a><td> * server to start accepting requests. Defaults to 30 seconds.<tr><td><a name="l150" href="#l150">150</a><td> * @return {!promise.Promise.<string>} A promise that will resolve<tr><td><a name="l151" href="#l151">151</a><td> * to the server's base URL when it has started accepting requests. If the<tr><td><a name="l152" href="#l152">152</a><td> * timeout expires before the server has started, the promise will be<tr><td><a name="l153" href="#l153">153</a><td> * rejected.<tr><td><a name="l154" href="#l154">154</a><td> */<tr><td><a name="l155" href="#l155">155</a><td>DriverService.prototype.start = function(opt_timeoutMs) {<tr><td><a name="l156" href="#l156">156</a><td> if (this.address_) {<tr><td><a name="l157" href="#l157">157</a><td> return this.address_;<tr><td><a name="l158" href="#l158">158</a><td> }<tr><td><a name="l159" href="#l159">159</a><td><tr><td><a name="l160" href="#l160">160</a><td> var timeout = opt_timeoutMs || DriverService.DEFAULT_START_TIMEOUT_MS;<tr><td><a name="l161" href="#l161">161</a><td><tr><td><a name="l162" href="#l162">162</a><td> var self = this;<tr><td><a name="l163" href="#l163">163</a><td> this.command_ = promise.defer();<tr><td><a name="l164" href="#l164">164</a><td> this.address_ = promise.defer();<tr><td><a name="l165" href="#l165">165</a><td> this.address_.fulfill(promise.when(this.port_, function(port) {<tr><td><a name="l166" href="#l166">166</a><td> if (port <= 0) {<tr><td><a name="l167" href="#l167">167</a><td> throw Error('Port must be > 0: ' + port);<tr><td><a name="l168" href="#l168">168</a><td> }<tr><td><a name="l169" href="#l169">169</a><td> return promise.when(self.args_, function(args) {<tr><td><a name="l170" href="#l170">170</a><td> var command = exec(self.executable_, {<tr><td><a name="l171" href="#l171">171</a><td> args: args,<tr><td><a name="l172" href="#l172">172</a><td> env: self.env_,<tr><td><a name="l173" href="#l173">173</a><td> stdio: self.stdio_<tr><td><a name="l174" href="#l174">174</a><td> });<tr><td><a name="l175" href="#l175">175</a><td><tr><td><a name="l176" href="#l176">176</a><td> self.command_.fulfill(command);<tr><td><a name="l177" href="#l177">177</a><td><tr><td><a name="l178" href="#l178">178</a><td> command.result().then(function(result) {<tr><td><a name="l179" href="#l179">179</a><td> self.address_.reject(result.code == null ?<tr><td><a name="l180" href="#l180">180</a><td> Error('Server was killed with ' + result.signal) :<tr><td><a name="l181" href="#l181">181</a><td> Error('Server exited with ' + result.code));<tr><td><a name="l182" href="#l182">182</a><td> self.address_ = null;<tr><td><a name="l183" href="#l183">183</a><td> self.command_ = null;<tr><td><a name="l184" href="#l184">184</a><td> });<tr><td><a name="l185" href="#l185">185</a><td><tr><td><a name="l186" href="#l186">186</a><td> var serverUrl = url.format({<tr><td><a name="l187" href="#l187">187</a><td> protocol: 'http',<tr><td><a name="l188" href="#l188">188</a><td> hostname: !self.loopbackOnly_ && net.getAddress() ||<tr><td><a name="l189" href="#l189">189</a><td> net.getLoopbackAddress(),<tr><td><a name="l190" href="#l190">190</a><td> port: port,<tr><td><a name="l191" href="#l191">191</a><td> pathname: self.path_<tr><td><a name="l192" href="#l192">192</a><td> });<tr><td><a name="l193" href="#l193">193</a><td><tr><td><a name="l194" href="#l194">194</a><td> return httpUtil.waitForServer(serverUrl, timeout).then(function() {<tr><td><a name="l195" href="#l195">195</a><td> return serverUrl;<tr><td><a name="l196" href="#l196">196</a><td> });<tr><td><a name="l197" href="#l197">197</a><td> });<tr><td><a name="l198" href="#l198">198</a><td> }));<tr><td><a name="l199" href="#l199">199</a><td><tr><td><a name="l200" href="#l200">200</a><td> return this.address_;<tr><td><a name="l201" href="#l201">201</a><td>};<tr><td><a name="l202" href="#l202">202</a><td><tr><td><a name="l203" href="#l203">203</a><td><tr><td><a name="l204" href="#l204">204</a><td>/**<tr><td><a name="l205" href="#l205">205</a><td> * Stops the service if it is not currently running. This function will kill<tr><td><a name="l206" href="#l206">206</a><td> * the server immediately. To synchronize with the active control flow, use<tr><td><a name="l207" href="#l207">207</a><td> * {@link #stop()}.<tr><td><a name="l208" href="#l208">208</a><td> * @return {!webdriver.promise.Promise} A promise that will be resolved when<tr><td><a name="l209" href="#l209">209</a><td> * the server has been stopped.<tr><td><a name="l210" href="#l210">210</a><td> */<tr><td><a name="l211" href="#l211">211</a><td>DriverService.prototype.kill = function() {<tr><td><a name="l212" href="#l212">212</a><td> if (!this.address_ || !this.command_) {<tr><td><a name="l213" href="#l213">213</a><td> return promise.fulfilled(); // Not currently running.<tr><td><a name="l214" href="#l214">214</a><td> }<tr><td><a name="l215" href="#l215">215</a><td> return this.command_.then(function(command) {<tr><td><a name="l216" href="#l216">216</a><td> command.kill('SIGTERM');<tr><td><a name="l217" href="#l217">217</a><td> });<tr><td><a name="l218" href="#l218">218</a><td>};<tr><td><a name="l219" href="#l219">219</a><td><tr><td><a name="l220" href="#l220">220</a><td><tr><td><a name="l221" href="#l221">221</a><td>/**<tr><td><a name="l222" href="#l222">222</a><td> * Schedules a task in the current control flow to stop the server if it is<tr><td><a name="l223" href="#l223">223</a><td> * currently running.<tr><td><a name="l224" href="#l224">224</a><td> * @return {!webdriver.promise.Promise} A promise that will be resolved when<tr><td><a name="l225" href="#l225">225</a><td> * the server has been stopped.<tr><td><a name="l226" href="#l226">226</a><td> */<tr><td><a name="l227" href="#l227">227</a><td>DriverService.prototype.stop = function() {<tr><td><a name="l228" href="#l228">228</a><td> return promise.controlFlow().execute(this.kill.bind(this));<tr><td><a name="l229" href="#l229">229</a><td>};<tr><td><a name="l230" href="#l230">230</a><td><tr><td><a name="l231" href="#l231">231</a><td><tr><td><a name="l232" href="#l232">232</a><td><tr><td><a name="l233" href="#l233">233</a><td>/**<tr><td><a name="l234" href="#l234">234</a><td> * Manages the life and death of the Selenium standalone server. The server<tr><td><a name="l235" href="#l235">235</a><td> * may be obtained from http://selenium-release.storage.googleapis.com/index.html.<tr><td><a name="l236" href="#l236">236</a><td> * @param {string} jar Path to the Selenium server jar.<tr><td><a name="l237" href="#l237">237</a><td> * @param {!SeleniumServer.Options} options Configuration options for the<tr><td><a name="l238" href="#l238">238</a><td> * server.<tr><td><a name="l239" href="#l239">239</a><td> * @throws {Error} If an invalid port is specified.<tr><td><a name="l240" href="#l240">240</a><td> * @constructor<tr><td><a name="l241" href="#l241">241</a><td> * @extends {DriverService}<tr><td><a name="l242" href="#l242">242</a><td> */<tr><td><a name="l243" href="#l243">243</a><td>function SeleniumServer(jar, options) {<tr><td><a name="l244" href="#l244">244</a><td> if (options.port < 0)<tr><td><a name="l245" href="#l245">245</a><td> throw Error('Port must be >= 0: ' + options.port);<tr><td><a name="l246" href="#l246">246</a><td><tr><td><a name="l247" href="#l247">247</a><td> var port = options.port || portprober.findFreePort();<tr><td><a name="l248" href="#l248">248</a><td> var args = promise.when(options.jvmArgs || [], function(jvmArgs) {<tr><td><a name="l249" href="#l249">249</a><td> return promise.when(options.args || [], function(args) {<tr><td><a name="l250" href="#l250">250</a><td> return promise.when(port, function(port) {<tr><td><a name="l251" href="#l251">251</a><td> return jvmArgs.concat(['-jar', jar, '-port', port]).concat(args);<tr><td><a name="l252" href="#l252">252</a><td> });<tr><td><a name="l253" href="#l253">253</a><td> });<tr><td><a name="l254" href="#l254">254</a><td> });<tr><td><a name="l255" href="#l255">255</a><td><tr><td><a name="l256" href="#l256">256</a><td> DriverService.call(this, 'java', {<tr><td><a name="l257" href="#l257">257</a><td> port: port,<tr><td><a name="l258" href="#l258">258</a><td> args: args,<tr><td><a name="l259" href="#l259">259</a><td> path: '/wd/hub',<tr><td><a name="l260" href="#l260">260</a><td> env: options.env,<tr><td><a name="l261" href="#l261">261</a><td> stdio: options.stdio<tr><td><a name="l262" href="#l262">262</a><td> });<tr><td><a name="l263" href="#l263">263</a><td>}<tr><td><a name="l264" href="#l264">264</a><td>util.inherits(SeleniumServer, DriverService);<tr><td><a name="l265" href="#l265">265</a><td><tr><td><a name="l266" href="#l266">266</a><td><tr><td><a name="l267" href="#l267">267</a><td>/**<tr><td><a name="l268" href="#l268">268</a><td> * Options for the Selenium server:<tr><td><a name="l269" href="#l269">269</a><td> * <ul><tr><td><a name="l270" href="#l270">270</a><td> * <li>{@code port} - The port to start the server on (must be > 0). If the<tr><td><a name="l271" href="#l271">271</a><td> * port is provided as a promise, the service will wait for the promise to<tr><td><a name="l272" href="#l272">272</a><td> * resolve before starting.<tr><td><a name="l273" href="#l273">273</a><td> * <li>{@code args} - The arguments to pass to the service. If a promise is<tr><td><a name="l274" href="#l274">274</a><td> * provided, the service will wait for it to resolve before starting.<tr><td><a name="l275" href="#l275">275</a><td> * <li>{@code jvmArgs} - The arguments to pass to the JVM. If a promise is<tr><td><a name="l276" href="#l276">276</a><td> * provided, the service will wait for it to resolve before starting.<tr><td><a name="l277" href="#l277">277</a><td> * <li>{@code env} - The environment variables that should be visible to the<tr><td><a name="l278" href="#l278">278</a><td> * server process. Defaults to inheriting the current process's<tr><td><a name="l279" href="#l279">279</a><td> * environment.<tr><td><a name="l280" href="#l280">280</a><td> * <li>{@code stdio} - IO configuration for the spawned server process. For<tr><td><a name="l281" href="#l281">281</a><td> * more information, refer to the documentation of<tr><td><a name="l282" href="#l282">282</a><td> * {@code child_process.spawn}.<tr><td><a name="l283" href="#l283">283</a><td> * </ul><tr><td><a name="l284" href="#l284">284</a><td> *<tr><td><a name="l285" href="#l285">285</a><td> * @typedef {{<tr><td><a name="l286" href="#l286">286</a><td> * port: (number|!webdriver.promise.Promise.<number>),<tr><td><a name="l287" href="#l287">287</a><td> * args: !(Array.<string>|webdriver.promise.Promise.<!Array.<string>>),<tr><td><a name="l288" href="#l288">288</a><td> * jvmArgs: (!Array.<string>|<tr><td><a name="l289" href="#l289">289</a><td> * !webdriver.promise.Promise.<!Array.<string>>|<tr><td><a name="l290" href="#l290">290</a><td> * undefined),<tr><td><a name="l291" href="#l291">291</a><td> * env: (!Object.<string, string>|undefined),<tr><td><a name="l292" href="#l292">292</a><td> * stdio: (string|!Array.<string|number|!Stream|null|undefined>|undefined)<tr><td><a name="l293" href="#l293">293</a><td> * }}<tr><td><a name="l294" href="#l294">294</a><td> */<tr><td><a name="l295" href="#l295">295</a><td>SeleniumServer.Options;<tr><td><a name="l296" href="#l296">296</a><td><tr><td><a name="l297" href="#l297">297</a><td><tr><td><a name="l298" href="#l298">298</a><td>// PUBLIC API<tr><td><a name="l299" href="#l299">299</a><td><tr><td><a name="l300" href="#l300">300</a><td>exports.DriverService = DriverService;<tr><td><a name="l301" href="#l301">301</a><td>exports.SeleniumServer = SeleniumServer;</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="../../license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>assert.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>testing/assert.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview Defines a library that simplifies writing assertions against<tr><td><a name="l17" href="#l17">17</a><td> * promised values.<tr><td><a name="l18" href="#l18">18</a><td> *<tr><td><a name="l19" href="#l19">19</a><td> * <blockquote><tr><td><a name="l20" href="#l20">20</a><td> * <hr><tr><td><a name="l21" href="#l21">21</a><td> * <b>NOTE:</b> This module is considered experimental and is subject to<tr><td><a name="l22" href="#l22">22</a><td> * change, or removal, at any time!<tr><td><a name="l23" href="#l23">23</a><td> * <hr><tr><td><a name="l24" href="#l24">24</a><td> * </blockquote><tr><td><a name="l25" href="#l25">25</a><td> *<tr><td><a name="l26" href="#l26">26</a><td> * Sample usage:<tr><td><a name="l27" href="#l27">27</a><td> * <pre><code><tr><td><a name="l28" href="#l28">28</a><td> * var driver = new webdriver.Builder().build();<tr><td><a name="l29" href="#l29">29</a><td> * driver.get('http://www.google.com');<tr><td><a name="l30" href="#l30">30</a><td> *<tr><td><a name="l31" href="#l31">31</a><td> * assert(driver.getTitle()).equalTo('Google');<tr><td><a name="l32" href="#l32">32</a><td> * </code></pre><tr><td><a name="l33" href="#l33">33</a><td> */<tr><td><a name="l34" href="#l34">34</a><td><tr><td><a name="l35" href="#l35">35</a><td>var base = require('../_base'),<tr><td><a name="l36" href="#l36">36</a><td> assert = base.require('webdriver.testing.assert');<tr><td><a name="l37" href="#l37">37</a><td><tr><td><a name="l38" href="#l38">38</a><td><tr><td><a name="l39" href="#l39">39</a><td>// PUBLIC API<tr><td><a name="l40" href="#l40">40</a><td><tr><td><a name="l41" href="#l41">41</a><td><tr><td><a name="l42" href="#l42">42</a><td>/** @type {webdriver.testing.assert.} */<tr><td><a name="l43" href="#l43">43</a><td>module.exports = assert;</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
|
|
1
|
+
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>assert.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>testing/assert.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview Defines a library that simplifies writing assertions against<tr><td><a name="l17" href="#l17">17</a><td> * promised values.<tr><td><a name="l18" href="#l18">18</a><td> *<tr><td><a name="l19" href="#l19">19</a><td> * <blockquote><tr><td><a name="l20" href="#l20">20</a><td> * <hr><tr><td><a name="l21" href="#l21">21</a><td> * <b>NOTE:</b> This module is considered experimental and is subject to<tr><td><a name="l22" href="#l22">22</a><td> * change, or removal, at any time!<tr><td><a name="l23" href="#l23">23</a><td> * <hr><tr><td><a name="l24" href="#l24">24</a><td> * </blockquote><tr><td><a name="l25" href="#l25">25</a><td> *<tr><td><a name="l26" href="#l26">26</a><td> * Sample usage:<tr><td><a name="l27" href="#l27">27</a><td> * <pre><code><tr><td><a name="l28" href="#l28">28</a><td> * var driver = new webdriver.Builder().build();<tr><td><a name="l29" href="#l29">29</a><td> * driver.get('http://www.google.com');<tr><td><a name="l30" href="#l30">30</a><td> *<tr><td><a name="l31" href="#l31">31</a><td> * assert(driver.getTitle()).equalTo('Google');<tr><td><a name="l32" href="#l32">32</a><td> * </code></pre><tr><td><a name="l33" href="#l33">33</a><td> */<tr><td><a name="l34" href="#l34">34</a><td><tr><td><a name="l35" href="#l35">35</a><td>var base = require('../_base'),<tr><td><a name="l36" href="#l36">36</a><td> assert = base.require('webdriver.testing.assert');<tr><td><a name="l37" href="#l37">37</a><td><tr><td><a name="l38" href="#l38">38</a><td><tr><td><a name="l39" href="#l39">39</a><td>// PUBLIC API<tr><td><a name="l40" href="#l40">40</a><td><tr><td><a name="l41" href="#l41">41</a><td><tr><td><a name="l42" href="#l42">42</a><td>/** @type {webdriver.testing.assert.} */<tr><td><a name="l43" href="#l43">43</a><td>module.exports = assert;</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="../../license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>testing/index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an "AS IS" BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>/**<tr><td><a name="l17" href="#l17">17</a><td> * @fileoverview Provides wrappers around the following global functions from<tr><td><a name="l18" href="#l18">18</a><td> * <a href="http://visionmedia.github.io/mocha/">Mocha's BDD interface</a>:<tr><td><a name="l19" href="#l19">19</a><td> * <ul><tr><td><a name="l20" href="#l20">20</a><td> * <li>after<tr><td><a name="l21" href="#l21">21</a><td> * <li>afterEach<tr><td><a name="l22" href="#l22">22</a><td> * <li>before<tr><td><a name="l23" href="#l23">23</a><td> * <li>beforeEach<tr><td><a name="l24" href="#l24">24</a><td> * <li>it<tr><td><a name="l25" href="#l25">25</a><td> * <li>it.only<tr><td><a name="l26" href="#l26">26</a><td> * <li>it.skip<tr><td><a name="l27" href="#l27">27</a><td> * <li>xit<tr><td><a name="l28" href="#l28">28</a><td> * </ul><tr><td><a name="l29" href="#l29">29</a><td> *<tr><td><a name="l30" href="#l30">30</a><td> * <p>The provided wrappers leverage the {@link webdriver.promise.ControlFlow}<tr><td><a name="l31" href="#l31">31</a><td> * to simplify writing asynchronous tests:<tr><td><a name="l32" href="#l32">32</a><td> * <pre><code><tr><td><a name="l33" href="#l33">33</a><td> * var webdriver = require('selenium-webdriver'),<tr><td><a name="l34" href="#l34">34</a><td> * portprober = require('selenium-webdriver/net/portprober'),<tr><td><a name="l35" href="#l35">35</a><td> * remote = require('selenium-webdriver/remote'),<tr><td><a name="l36" href="#l36">36</a><td> * test = require('selenium-webdriver/testing');<tr><td><a name="l37" href="#l37">37</a><td> *<tr><td><a name="l38" href="#l38">38</a><td> * test.describe('Google Search', function() {<tr><td><a name="l39" href="#l39">39</a><td> * var driver, server;<tr><td><a name="l40" href="#l40">40</a><td> *<tr><td><a name="l41" href="#l41">41</a><td> * test.before(function() {<tr><td><a name="l42" href="#l42">42</a><td> * server = new remote.SeleniumServer(<tr><td><a name="l43" href="#l43">43</a><td> * 'path/to/selenium-server-standalone.jar',<tr><td><a name="l44" href="#l44">44</a><td> * {port: portprober.findFreePort()});<tr><td><a name="l45" href="#l45">45</a><td> * server.start();<tr><td><a name="l46" href="#l46">46</a><td> *<tr><td><a name="l47" href="#l47">47</a><td> * driver = new webdriver.Builder().<tr><td><a name="l48" href="#l48">48</a><td> * withCapabilities({'browserName': 'firefox'}).<tr><td><a name="l49" href="#l49">49</a><td> * usingServer(server.address()).<tr><td><a name="l50" href="#l50">50</a><td> * build();<tr><td><a name="l51" href="#l51">51</a><td> * });<tr><td><a name="l52" href="#l52">52</a><td> *<tr><td><a name="l53" href="#l53">53</a><td> * test.after(function() {<tr><td><a name="l54" href="#l54">54</a><td> * driver.quit();<tr><td><a name="l55" href="#l55">55</a><td> * server.stop();<tr><td><a name="l56" href="#l56">56</a><td> * });<tr><td><a name="l57" href="#l57">57</a><td> *<tr><td><a name="l58" href="#l58">58</a><td> * test.it('should append query to title', function() {<tr><td><a name="l59" href="#l59">59</a><td> * driver.get('http://www.google.com');<tr><td><a name="l60" href="#l60">60</a><td> * driver.findElement(webdriver.By.name('q')).sendKeys('webdriver');<tr><td><a name="l61" href="#l61">61</a><td> * driver.findElement(webdriver.By.name('btnG')).click();<tr><td><a name="l62" href="#l62">62</a><td> * driver.wait(function() {<tr><td><a name="l63" href="#l63">63</a><td> * return driver.getTitle().then(function(title) {<tr><td><a name="l64" href="#l64">64</a><td> * return 'webdriver - Google Search' === title;<tr><td><a name="l65" href="#l65">65</a><td> * });<tr><td><a name="l66" href="#l66">66</a><td> * }, 1000, 'Waiting for title to update');<tr><td><a name="l67" href="#l67">67</a><td> * });<tr><td><a name="l68" href="#l68">68</a><td> * });<tr><td><a name="l69" href="#l69">69</a><td> * </code></pre><tr><td><a name="l70" href="#l70">70</a><td> *<tr><td><a name="l71" href="#l71">71</a><td> * <p>You may conditionally suppress a test function using the exported<tr><td><a name="l72" href="#l72">72</a><td> * "ignore" function. If the provided predicate returns true, the attached<tr><td><a name="l73" href="#l73">73</a><td> * test case will be skipped:<tr><td><a name="l74" href="#l74">74</a><td> * <pre><code><tr><td><a name="l75" href="#l75">75</a><td> * test.ignore(maybe()).it('is flaky', function() {<tr><td><a name="l76" href="#l76">76</a><td> * if (Math.random() < 0.5) throw Error();<tr><td><a name="l77" href="#l77">77</a><td> * });<tr><td><a name="l78" href="#l78">78</a><td> *<tr><td><a name="l79" href="#l79">79</a><td> * function maybe() { return Math.random() < 0.5; }<tr><td><a name="l80" href="#l80">80</a><td> * </code></pre><tr><td><a name="l81" href="#l81">81</a><td> */<tr><td><a name="l82" href="#l82">82</a><td><tr><td><a name="l83" href="#l83">83</a><td>var promise = require('..').promise;<tr><td><a name="l84" href="#l84">84</a><td>var flow = promise.controlFlow();<tr><td><a name="l85" href="#l85">85</a><td><tr><td><a name="l86" href="#l86">86</a><td><tr><td><a name="l87" href="#l87">87</a><td>/**<tr><td><a name="l88" href="#l88">88</a><td> * Wraps a function so that all passed arguments are ignored.<tr><td><a name="l89" href="#l89">89</a><td> * @param {!Function} fn The function to wrap.<tr><td><a name="l90" href="#l90">90</a><td> * @return {!Function} The wrapped function.<tr><td><a name="l91" href="#l91">91</a><td> */<tr><td><a name="l92" href="#l92">92</a><td>function seal(fn) {<tr><td><a name="l93" href="#l93">93</a><td> return function() {<tr><td><a name="l94" href="#l94">94</a><td> fn();<tr><td><a name="l95" href="#l95">95</a><td> };<tr><td><a name="l96" href="#l96">96</a><td>}<tr><td><a name="l97" href="#l97">97</a><td><tr><td><a name="l98" href="#l98">98</a><td><tr><td><a name="l99" href="#l99">99</a><td>/**<tr><td><a name="l100" href="#l100">100</a><td> * Wraps a function on Mocha's BDD interface so it runs inside a<tr><td><a name="l101" href="#l101">101</a><td> * webdriver.promise.ControlFlow and waits for the flow to complete before<tr><td><a name="l102" href="#l102">102</a><td> * continuing.<tr><td><a name="l103" href="#l103">103</a><td> * @param {!Function} globalFn The function to wrap.<tr><td><a name="l104" href="#l104">104</a><td> * @return {!Function} The new function.<tr><td><a name="l105" href="#l105">105</a><td> */<tr><td><a name="l106" href="#l106">106</a><td>function wrapped(globalFn) {<tr><td><a name="l107" href="#l107">107</a><td> return function() {<tr><td><a name="l108" href="#l108">108</a><td> if (arguments.length === 1) {<tr><td><a name="l109" href="#l109">109</a><td> return globalFn(asyncTestFn(arguments[0]));<tr><td><a name="l110" href="#l110">110</a><td> }<tr><td><a name="l111" href="#l111">111</a><td> else if (arguments.length === 2) {<tr><td><a name="l112" href="#l112">112</a><td> return globalFn(arguments[0], asyncTestFn(arguments[1]));<tr><td><a name="l113" href="#l113">113</a><td> }<tr><td><a name="l114" href="#l114">114</a><td> else {<tr><td><a name="l115" href="#l115">115</a><td> throw Error('Invalid # arguments: ' + arguments.length);<tr><td><a name="l116" href="#l116">116</a><td> }<tr><td><a name="l117" href="#l117">117</a><td> };<tr><td><a name="l118" href="#l118">118</a><td><tr><td><a name="l119" href="#l119">119</a><td> function asyncTestFn(fn) {<tr><td><a name="l120" href="#l120">120</a><td> var ret = function(done) {<tr><td><a name="l121" href="#l121">121</a><td> function cleanupBeforeCallback() {<tr><td><a name="l122" href="#l122">122</a><td> flow.reset();<tr><td><a name="l123" href="#l123">123</a><td> return cleanupBeforeCallback.mochaCallback.apply(this, arguments);<tr><td><a name="l124" href="#l124">124</a><td> }<tr><td><a name="l125" href="#l125">125</a><td> // We set this as an attribute of the callback function to allow us to<tr><td><a name="l126" href="#l126">126</a><td> // test this properly.<tr><td><a name="l127" href="#l127">127</a><td> cleanupBeforeCallback.mochaCallback = this.runnable().callback;<tr><td><a name="l128" href="#l128">128</a><td><tr><td><a name="l129" href="#l129">129</a><td> this.runnable().callback = cleanupBeforeCallback;<tr><td><a name="l130" href="#l130">130</a><td><tr><td><a name="l131" href="#l131">131</a><td> var testFn = fn.bind(this);<tr><td><a name="l132" href="#l132">132</a><td> flow.execute(function() {<tr><td><a name="l133" href="#l133">133</a><td> var done = promise.defer();<tr><td><a name="l134" href="#l134">134</a><td> promise.asap(testFn(done.reject), done.fulfill, done.reject);<tr><td><a name="l135" href="#l135">135</a><td> return done.promise;<tr><td><a name="l136" href="#l136">136</a><td> }).then(seal(done), done);<tr><td><a name="l137" href="#l137">137</a><td> };<tr><td><a name="l138" href="#l138">138</a><td><tr><td><a name="l139" href="#l139">139</a><td> ret.toString = function() {<tr><td><a name="l140" href="#l140">140</a><td> return fn.toString();<tr><td><a name="l141" href="#l141">141</a><td> };<tr><td><a name="l142" href="#l142">142</a><td><tr><td><a name="l143" href="#l143">143</a><td> return ret;<tr><td><a name="l144" href="#l144">144</a><td> }<tr><td><a name="l145" href="#l145">145</a><td>}<tr><td><a name="l146" href="#l146">146</a><td><tr><td><a name="l147" href="#l147">147</a><td><tr><td><a name="l148" href="#l148">148</a><td>/**<tr><td><a name="l149" href="#l149">149</a><td> * Ignores the test chained to this function if the provided predicate returns<tr><td><a name="l150" href="#l150">150</a><td> * true.<tr><td><a name="l151" href="#l151">151</a><td> * @param {function(): boolean} predicateFn A predicate to call to determine<tr><td><a name="l152" href="#l152">152</a><td> * if the test should be suppressed. This function MUST be synchronous.<tr><td><a name="l153" href="#l153">153</a><td> * @return {!Object} An object with wrapped versions of {@link #it()} and<tr><td><a name="l154" href="#l154">154</a><td> * {@link #describe()} that ignore tests as indicated by the predicate.<tr><td><a name="l155" href="#l155">155</a><td> */<tr><td><a name="l156" href="#l156">156</a><td>function ignore(predicateFn) {<tr><td><a name="l157" href="#l157">157</a><td> var describe = wrap(exports.xdescribe, exports.describe);<tr><td><a name="l158" href="#l158">158</a><td> describe.only = wrap(exports.xdescribe, exports.describe.only);<tr><td><a name="l159" href="#l159">159</a><td><tr><td><a name="l160" href="#l160">160</a><td> var it = wrap(exports.xit, exports.it);<tr><td><a name="l161" href="#l161">161</a><td> it.only = wrap(exports.xit, exports.it.only);<tr><td><a name="l162" href="#l162">162</a><td><tr><td><a name="l163" href="#l163">163</a><td> return {<tr><td><a name="l164" href="#l164">164</a><td> describe: describe,<tr><td><a name="l165" href="#l165">165</a><td> it: it<tr><td><a name="l166" href="#l166">166</a><td> };<tr><td><a name="l167" href="#l167">167</a><td><tr><td><a name="l168" href="#l168">168</a><td> function wrap(onSkip, onRun) {<tr><td><a name="l169" href="#l169">169</a><td> return function(title, fn) {<tr><td><a name="l170" href="#l170">170</a><td> if (predicateFn()) {<tr><td><a name="l171" href="#l171">171</a><td> onSkip(title, fn);<tr><td><a name="l172" href="#l172">172</a><td> } else {<tr><td><a name="l173" href="#l173">173</a><td> onRun(title, fn);<tr><td><a name="l174" href="#l174">174</a><td> }<tr><td><a name="l175" href="#l175">175</a><td> };<tr><td><a name="l176" href="#l176">176</a><td> }<tr><td><a name="l177" href="#l177">177</a><td>}<tr><td><a name="l178" href="#l178">178</a><td><tr><td><a name="l179" href="#l179">179</a><td><tr><td><a name="l180" href="#l180">180</a><td>// PUBLIC API<tr><td><a name="l181" href="#l181">181</a><td><tr><td><a name="l182" href="#l182">182</a><td>/**<tr><td><a name="l183" href="#l183">183</a><td> * Registers a new test suite.<tr><td><a name="l184" href="#l184">184</a><td> * @param {string} name The suite name.<tr><td><a name="l185" href="#l185">185</a><td> * @param {function()=} fn The suite function, or {@code undefined} to define<tr><td><a name="l186" href="#l186">186</a><td> * a pending test suite.<tr><td><a name="l187" href="#l187">187</a><td> */<tr><td><a name="l188" href="#l188">188</a><td>exports.describe = global.describe;<tr><td><a name="l189" href="#l189">189</a><td><tr><td><a name="l190" href="#l190">190</a><td>/**<tr><td><a name="l191" href="#l191">191</a><td> * Defines a suppressed test suite.<tr><td><a name="l192" href="#l192">192</a><td> * @param {string} name The suite name.<tr><td><a name="l193" href="#l193">193</a><td> * @param {function()=} fn The suite function, or {@code undefined} to define<tr><td><a name="l194" href="#l194">194</a><td> * a pending test suite.<tr><td><a name="l195" href="#l195">195</a><td> */<tr><td><a name="l196" href="#l196">196</a><td>exports.xdescribe = global.xdescribe;<tr><td><a name="l197" href="#l197">197</a><td>exports.describe.skip = global.describe.skip;<tr><td><a name="l198" href="#l198">198</a><td><tr><td><a name="l199" href="#l199">199</a><td>/**<tr><td><a name="l200" href="#l200">200</a><td> * Register a function to call after the current suite finishes.<tr><td><a name="l201" href="#l201">201</a><td> * @param {function()} fn .<tr><td><a name="l202" href="#l202">202</a><td> */<tr><td><a name="l203" href="#l203">203</a><td>exports.after = wrapped(global.after);<tr><td><a name="l204" href="#l204">204</a><td><tr><td><a name="l205" href="#l205">205</a><td>/**<tr><td><a name="l206" href="#l206">206</a><td> * Register a function to call after each test in a suite.<tr><td><a name="l207" href="#l207">207</a><td> * @param {function()} fn .<tr><td><a name="l208" href="#l208">208</a><td> */<tr><td><a name="l209" href="#l209">209</a><td>exports.afterEach = wrapped(global.afterEach);<tr><td><a name="l210" href="#l210">210</a><td><tr><td><a name="l211" href="#l211">211</a><td>/**<tr><td><a name="l212" href="#l212">212</a><td> * Register a function to call before the current suite starts.<tr><td><a name="l213" href="#l213">213</a><td> * @param {function()} fn .<tr><td><a name="l214" href="#l214">214</a><td> */<tr><td><a name="l215" href="#l215">215</a><td>exports.before = wrapped(global.before);<tr><td><a name="l216" href="#l216">216</a><td><tr><td><a name="l217" href="#l217">217</a><td>/**<tr><td><a name="l218" href="#l218">218</a><td> * Register a function to call before each test in a suite.<tr><td><a name="l219" href="#l219">219</a><td> * @param {function()} fn .<tr><td><a name="l220" href="#l220">220</a><td> */<tr><td><a name="l221" href="#l221">221</a><td>exports.beforeEach = wrapped(global.beforeEach);<tr><td><a name="l222" href="#l222">222</a><td><tr><td><a name="l223" href="#l223">223</a><td>/**<tr><td><a name="l224" href="#l224">224</a><td> * Add a test to the current suite.<tr><td><a name="l225" href="#l225">225</a><td> * @param {string} name The test name.<tr><td><a name="l226" href="#l226">226</a><td> * @param {function()=} fn The test function, or {@code undefined} to define<tr><td><a name="l227" href="#l227">227</a><td> * a pending test case.<tr><td><a name="l228" href="#l228">228</a><td> */<tr><td><a name="l229" href="#l229">229</a><td>exports.it = wrapped(global.it);<tr><td><a name="l230" href="#l230">230</a><td><tr><td><a name="l231" href="#l231">231</a><td>/**<tr><td><a name="l232" href="#l232">232</a><td> * An alias for {@link #it()} that flags the test as the only one that should<tr><td><a name="l233" href="#l233">233</a><td> * be run within the current suite.<tr><td><a name="l234" href="#l234">234</a><td> * @param {string} name The test name.<tr><td><a name="l235" href="#l235">235</a><td> * @param {function()=} fn The test function, or {@code undefined} to define<tr><td><a name="l236" href="#l236">236</a><td> * a pending test case.<tr><td><a name="l237" href="#l237">237</a><td> */<tr><td><a name="l238" href="#l238">238</a><td>exports.iit = exports.it.only = wrapped(global.it.only);<tr><td><a name="l239" href="#l239">239</a><td><tr><td><a name="l240" href="#l240">240</a><td>/**<tr><td><a name="l241" href="#l241">241</a><td> * Adds a test to the current suite while suppressing it so it is not run.<tr><td><a name="l242" href="#l242">242</a><td> * @param {string} name The test name.<tr><td><a name="l243" href="#l243">243</a><td> * @param {function()=} fn The test function, or {@code undefined} to define<tr><td><a name="l244" href="#l244">244</a><td> * a pending test case.<tr><td><a name="l245" href="#l245">245</a><td> */<tr><td><a name="l246" href="#l246">246</a><td>exports.xit = exports.it.skip = wrapped(global.xit);<tr><td><a name="l247" href="#l247">247</a><td><tr><td><a name="l248" href="#l248">248</a><td>exports.ignore = ignore;</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
|
|
1
|
+
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>testing/index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an "AS IS" BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>/**<tr><td><a name="l17" href="#l17">17</a><td> * @fileoverview Provides wrappers around the following global functions from<tr><td><a name="l18" href="#l18">18</a><td> * <a href="http://visionmedia.github.io/mocha/">Mocha's BDD interface</a>:<tr><td><a name="l19" href="#l19">19</a><td> * <ul><tr><td><a name="l20" href="#l20">20</a><td> * <li>after<tr><td><a name="l21" href="#l21">21</a><td> * <li>afterEach<tr><td><a name="l22" href="#l22">22</a><td> * <li>before<tr><td><a name="l23" href="#l23">23</a><td> * <li>beforeEach<tr><td><a name="l24" href="#l24">24</a><td> * <li>it<tr><td><a name="l25" href="#l25">25</a><td> * <li>it.only<tr><td><a name="l26" href="#l26">26</a><td> * <li>it.skip<tr><td><a name="l27" href="#l27">27</a><td> * <li>xit<tr><td><a name="l28" href="#l28">28</a><td> * </ul><tr><td><a name="l29" href="#l29">29</a><td> *<tr><td><a name="l30" href="#l30">30</a><td> * <p>The provided wrappers leverage the {@link webdriver.promise.ControlFlow}<tr><td><a name="l31" href="#l31">31</a><td> * to simplify writing asynchronous tests:<tr><td><a name="l32" href="#l32">32</a><td> * <pre><code><tr><td><a name="l33" href="#l33">33</a><td> * var By = require('selenium-webdriver').By,<tr><td><a name="l34" href="#l34">34</a><td> * until = require('selenium-webdriver').until,<tr><td><a name="l35" href="#l35">35</a><td> * firefox = require('selenium-webdriver/firefox'),<tr><td><a name="l36" href="#l36">36</a><td> * test = require('selenium-webdriver/testing');<tr><td><a name="l37" href="#l37">37</a><td> *<tr><td><a name="l38" href="#l38">38</a><td> * test.describe('Google Search', function() {<tr><td><a name="l39" href="#l39">39</a><td> * var driver;<tr><td><a name="l40" href="#l40">40</a><td> *<tr><td><a name="l41" href="#l41">41</a><td> * test.before(function() {<tr><td><a name="l42" href="#l42">42</a><td> * driver = new firefox.Driver();<tr><td><a name="l43" href="#l43">43</a><td> * });<tr><td><a name="l44" href="#l44">44</a><td> *<tr><td><a name="l45" href="#l45">45</a><td> * test.after(function() {<tr><td><a name="l46" href="#l46">46</a><td> * driver.quit();<tr><td><a name="l47" href="#l47">47</a><td> * });<tr><td><a name="l48" href="#l48">48</a><td> *<tr><td><a name="l49" href="#l49">49</a><td> * test.it('should append query to title', function() {<tr><td><a name="l50" href="#l50">50</a><td> * driver.get('http://www.google.com/ncr');<tr><td><a name="l51" href="#l51">51</a><td> * driver.findElement(By.name('q')).sendKeys('webdriver');<tr><td><a name="l52" href="#l52">52</a><td> * driver.findElement(By.name('btnG')).click();<tr><td><a name="l53" href="#l53">53</a><td> * driver.wait(until.titleIs('webdriver - Google Search'), 1000);<tr><td><a name="l54" href="#l54">54</a><td> * });<tr><td><a name="l55" href="#l55">55</a><td> * });<tr><td><a name="l56" href="#l56">56</a><td> * </code></pre><tr><td><a name="l57" href="#l57">57</a><td> *<tr><td><a name="l58" href="#l58">58</a><td> * <p>You may conditionally suppress a test function using the exported<tr><td><a name="l59" href="#l59">59</a><td> * "ignore" function. If the provided predicate returns true, the attached<tr><td><a name="l60" href="#l60">60</a><td> * test case will be skipped:<tr><td><a name="l61" href="#l61">61</a><td> * <pre><code><tr><td><a name="l62" href="#l62">62</a><td> * test.ignore(maybe()).it('is flaky', function() {<tr><td><a name="l63" href="#l63">63</a><td> * if (Math.random() < 0.5) throw Error();<tr><td><a name="l64" href="#l64">64</a><td> * });<tr><td><a name="l65" href="#l65">65</a><td> *<tr><td><a name="l66" href="#l66">66</a><td> * function maybe() { return Math.random() < 0.5; }<tr><td><a name="l67" href="#l67">67</a><td> * </code></pre><tr><td><a name="l68" href="#l68">68</a><td> */<tr><td><a name="l69" href="#l69">69</a><td><tr><td><a name="l70" href="#l70">70</a><td>var promise = require('..').promise;<tr><td><a name="l71" href="#l71">71</a><td>var flow = promise.controlFlow();<tr><td><a name="l72" href="#l72">72</a><td><tr><td><a name="l73" href="#l73">73</a><td><tr><td><a name="l74" href="#l74">74</a><td>/**<tr><td><a name="l75" href="#l75">75</a><td> * Wraps a function so that all passed arguments are ignored.<tr><td><a name="l76" href="#l76">76</a><td> * @param {!Function} fn The function to wrap.<tr><td><a name="l77" href="#l77">77</a><td> * @return {!Function} The wrapped function.<tr><td><a name="l78" href="#l78">78</a><td> */<tr><td><a name="l79" href="#l79">79</a><td>function seal(fn) {<tr><td><a name="l80" href="#l80">80</a><td> return function() {<tr><td><a name="l81" href="#l81">81</a><td> fn();<tr><td><a name="l82" href="#l82">82</a><td> };<tr><td><a name="l83" href="#l83">83</a><td>}<tr><td><a name="l84" href="#l84">84</a><td><tr><td><a name="l85" href="#l85">85</a><td><tr><td><a name="l86" href="#l86">86</a><td>/**<tr><td><a name="l87" href="#l87">87</a><td> * Wraps a function on Mocha's BDD interface so it runs inside a<tr><td><a name="l88" href="#l88">88</a><td> * webdriver.promise.ControlFlow and waits for the flow to complete before<tr><td><a name="l89" href="#l89">89</a><td> * continuing.<tr><td><a name="l90" href="#l90">90</a><td> * @param {!Function} globalFn The function to wrap.<tr><td><a name="l91" href="#l91">91</a><td> * @return {!Function} The new function.<tr><td><a name="l92" href="#l92">92</a><td> */<tr><td><a name="l93" href="#l93">93</a><td>function wrapped(globalFn) {<tr><td><a name="l94" href="#l94">94</a><td> return function() {<tr><td><a name="l95" href="#l95">95</a><td> if (arguments.length === 1) {<tr><td><a name="l96" href="#l96">96</a><td> return globalFn(asyncTestFn(arguments[0]));<tr><td><a name="l97" href="#l97">97</a><td> }<tr><td><a name="l98" href="#l98">98</a><td> else if (arguments.length === 2) {<tr><td><a name="l99" href="#l99">99</a><td> return globalFn(arguments[0], asyncTestFn(arguments[1]));<tr><td><a name="l100" href="#l100">100</a><td> }<tr><td><a name="l101" href="#l101">101</a><td> else {<tr><td><a name="l102" href="#l102">102</a><td> throw Error('Invalid # arguments: ' + arguments.length);<tr><td><a name="l103" href="#l103">103</a><td> }<tr><td><a name="l104" href="#l104">104</a><td> };<tr><td><a name="l105" href="#l105">105</a><td><tr><td><a name="l106" href="#l106">106</a><td> function asyncTestFn(fn) {<tr><td><a name="l107" href="#l107">107</a><td> var ret = function(done) {<tr><td><a name="l108" href="#l108">108</a><td> function cleanupBeforeCallback() {<tr><td><a name="l109" href="#l109">109</a><td> flow.reset();<tr><td><a name="l110" href="#l110">110</a><td> return cleanupBeforeCallback.mochaCallback.apply(this, arguments);<tr><td><a name="l111" href="#l111">111</a><td> }<tr><td><a name="l112" href="#l112">112</a><td> // We set this as an attribute of the callback function to allow us to<tr><td><a name="l113" href="#l113">113</a><td> // test this properly.<tr><td><a name="l114" href="#l114">114</a><td> cleanupBeforeCallback.mochaCallback = this.runnable().callback;<tr><td><a name="l115" href="#l115">115</a><td><tr><td><a name="l116" href="#l116">116</a><td> this.runnable().callback = cleanupBeforeCallback;<tr><td><a name="l117" href="#l117">117</a><td><tr><td><a name="l118" href="#l118">118</a><td> var testFn = fn.bind(this);<tr><td><a name="l119" href="#l119">119</a><td> flow.execute(function() {<tr><td><a name="l120" href="#l120">120</a><td> var done = promise.defer();<tr><td><a name="l121" href="#l121">121</a><td> promise.asap(testFn(done.reject), done.fulfill, done.reject);<tr><td><a name="l122" href="#l122">122</a><td> return done.promise;<tr><td><a name="l123" href="#l123">123</a><td> }).then(seal(done), done);<tr><td><a name="l124" href="#l124">124</a><td> };<tr><td><a name="l125" href="#l125">125</a><td><tr><td><a name="l126" href="#l126">126</a><td> ret.toString = function() {<tr><td><a name="l127" href="#l127">127</a><td> return fn.toString();<tr><td><a name="l128" href="#l128">128</a><td> };<tr><td><a name="l129" href="#l129">129</a><td><tr><td><a name="l130" href="#l130">130</a><td> return ret;<tr><td><a name="l131" href="#l131">131</a><td> }<tr><td><a name="l132" href="#l132">132</a><td>}<tr><td><a name="l133" href="#l133">133</a><td><tr><td><a name="l134" href="#l134">134</a><td><tr><td><a name="l135" href="#l135">135</a><td>/**<tr><td><a name="l136" href="#l136">136</a><td> * Ignores the test chained to this function if the provided predicate returns<tr><td><a name="l137" href="#l137">137</a><td> * true.<tr><td><a name="l138" href="#l138">138</a><td> * @param {function(): boolean} predicateFn A predicate to call to determine<tr><td><a name="l139" href="#l139">139</a><td> * if the test should be suppressed. This function MUST be synchronous.<tr><td><a name="l140" href="#l140">140</a><td> * @return {!Object} An object with wrapped versions of {@link #it()} and<tr><td><a name="l141" href="#l141">141</a><td> * {@link #describe()} that ignore tests as indicated by the predicate.<tr><td><a name="l142" href="#l142">142</a><td> */<tr><td><a name="l143" href="#l143">143</a><td>function ignore(predicateFn) {<tr><td><a name="l144" href="#l144">144</a><td> var describe = wrap(exports.xdescribe, exports.describe);<tr><td><a name="l145" href="#l145">145</a><td> describe.only = wrap(exports.xdescribe, exports.describe.only);<tr><td><a name="l146" href="#l146">146</a><td><tr><td><a name="l147" href="#l147">147</a><td> var it = wrap(exports.xit, exports.it);<tr><td><a name="l148" href="#l148">148</a><td> it.only = wrap(exports.xit, exports.it.only);<tr><td><a name="l149" href="#l149">149</a><td><tr><td><a name="l150" href="#l150">150</a><td> return {<tr><td><a name="l151" href="#l151">151</a><td> describe: describe,<tr><td><a name="l152" href="#l152">152</a><td> it: it<tr><td><a name="l153" href="#l153">153</a><td> };<tr><td><a name="l154" href="#l154">154</a><td><tr><td><a name="l155" href="#l155">155</a><td> function wrap(onSkip, onRun) {<tr><td><a name="l156" href="#l156">156</a><td> return function(title, fn) {<tr><td><a name="l157" href="#l157">157</a><td> if (predicateFn()) {<tr><td><a name="l158" href="#l158">158</a><td> onSkip(title, fn);<tr><td><a name="l159" href="#l159">159</a><td> } else {<tr><td><a name="l160" href="#l160">160</a><td> onRun(title, fn);<tr><td><a name="l161" href="#l161">161</a><td> }<tr><td><a name="l162" href="#l162">162</a><td> };<tr><td><a name="l163" href="#l163">163</a><td> }<tr><td><a name="l164" href="#l164">164</a><td>}<tr><td><a name="l165" href="#l165">165</a><td><tr><td><a name="l166" href="#l166">166</a><td><tr><td><a name="l167" href="#l167">167</a><td>// PUBLIC API<tr><td><a name="l168" href="#l168">168</a><td><tr><td><a name="l169" href="#l169">169</a><td>/**<tr><td><a name="l170" href="#l170">170</a><td> * Registers a new test suite.<tr><td><a name="l171" href="#l171">171</a><td> * @param {string} name The suite name.<tr><td><a name="l172" href="#l172">172</a><td> * @param {function()=} fn The suite function, or {@code undefined} to define<tr><td><a name="l173" href="#l173">173</a><td> * a pending test suite.<tr><td><a name="l174" href="#l174">174</a><td> */<tr><td><a name="l175" href="#l175">175</a><td>exports.describe = global.describe;<tr><td><a name="l176" href="#l176">176</a><td><tr><td><a name="l177" href="#l177">177</a><td>/**<tr><td><a name="l178" href="#l178">178</a><td> * Defines a suppressed test suite.<tr><td><a name="l179" href="#l179">179</a><td> * @param {string} name The suite name.<tr><td><a name="l180" href="#l180">180</a><td> * @param {function()=} fn The suite function, or {@code undefined} to define<tr><td><a name="l181" href="#l181">181</a><td> * a pending test suite.<tr><td><a name="l182" href="#l182">182</a><td> */<tr><td><a name="l183" href="#l183">183</a><td>exports.xdescribe = global.xdescribe;<tr><td><a name="l184" href="#l184">184</a><td>exports.describe.skip = global.describe.skip;<tr><td><a name="l185" href="#l185">185</a><td><tr><td><a name="l186" href="#l186">186</a><td>/**<tr><td><a name="l187" href="#l187">187</a><td> * Register a function to call after the current suite finishes.<tr><td><a name="l188" href="#l188">188</a><td> * @param {function()} fn .<tr><td><a name="l189" href="#l189">189</a><td> */<tr><td><a name="l190" href="#l190">190</a><td>exports.after = wrapped(global.after);<tr><td><a name="l191" href="#l191">191</a><td><tr><td><a name="l192" href="#l192">192</a><td>/**<tr><td><a name="l193" href="#l193">193</a><td> * Register a function to call after each test in a suite.<tr><td><a name="l194" href="#l194">194</a><td> * @param {function()} fn .<tr><td><a name="l195" href="#l195">195</a><td> */<tr><td><a name="l196" href="#l196">196</a><td>exports.afterEach = wrapped(global.afterEach);<tr><td><a name="l197" href="#l197">197</a><td><tr><td><a name="l198" href="#l198">198</a><td>/**<tr><td><a name="l199" href="#l199">199</a><td> * Register a function to call before the current suite starts.<tr><td><a name="l200" href="#l200">200</a><td> * @param {function()} fn .<tr><td><a name="l201" href="#l201">201</a><td> */<tr><td><a name="l202" href="#l202">202</a><td>exports.before = wrapped(global.before);<tr><td><a name="l203" href="#l203">203</a><td><tr><td><a name="l204" href="#l204">204</a><td>/**<tr><td><a name="l205" href="#l205">205</a><td> * Register a function to call before each test in a suite.<tr><td><a name="l206" href="#l206">206</a><td> * @param {function()} fn .<tr><td><a name="l207" href="#l207">207</a><td> */<tr><td><a name="l208" href="#l208">208</a><td>exports.beforeEach = wrapped(global.beforeEach);<tr><td><a name="l209" href="#l209">209</a><td><tr><td><a name="l210" href="#l210">210</a><td>/**<tr><td><a name="l211" href="#l211">211</a><td> * Add a test to the current suite.<tr><td><a name="l212" href="#l212">212</a><td> * @param {string} name The test name.<tr><td><a name="l213" href="#l213">213</a><td> * @param {function()=} fn The test function, or {@code undefined} to define<tr><td><a name="l214" href="#l214">214</a><td> * a pending test case.<tr><td><a name="l215" href="#l215">215</a><td> */<tr><td><a name="l216" href="#l216">216</a><td>exports.it = wrapped(global.it);<tr><td><a name="l217" href="#l217">217</a><td><tr><td><a name="l218" href="#l218">218</a><td>/**<tr><td><a name="l219" href="#l219">219</a><td> * An alias for {@link #it()} that flags the test as the only one that should<tr><td><a name="l220" href="#l220">220</a><td> * be run within the current suite.<tr><td><a name="l221" href="#l221">221</a><td> * @param {string} name The test name.<tr><td><a name="l222" href="#l222">222</a><td> * @param {function()=} fn The test function, or {@code undefined} to define<tr><td><a name="l223" href="#l223">223</a><td> * a pending test case.<tr><td><a name="l224" href="#l224">224</a><td> */<tr><td><a name="l225" href="#l225">225</a><td>exports.iit = exports.it.only = wrapped(global.it.only);<tr><td><a name="l226" href="#l226">226</a><td><tr><td><a name="l227" href="#l227">227</a><td>/**<tr><td><a name="l228" href="#l228">228</a><td> * Adds a test to the current suite while suppressing it so it is not run.<tr><td><a name="l229" href="#l229">229</a><td> * @param {string} name The test name.<tr><td><a name="l230" href="#l230">230</a><td> * @param {function()=} fn The test function, or {@code undefined} to define<tr><td><a name="l231" href="#l231">231</a><td> * a pending test case.<tr><td><a name="l232" href="#l232">232</a><td> */<tr><td><a name="l233" href="#l233">233</a><td>exports.xit = exports.it.skip = wrapped(global.xit);<tr><td><a name="l234" href="#l234">234</a><td><tr><td><a name="l235" href="#l235">235</a><td>exports.ignore = ignore;</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="../../license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
|