selenium-webdriver 2.48.2 → 2.53.3
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 +116 -0
- package/NOTICE +1 -1
- package/README.md +59 -9
- package/builder.js +375 -358
- package/chrome.js +549 -586
- package/edge.js +378 -0
- package/error.js +9 -6
- package/example/google_search.js +1 -1
- package/example/google_search_generator.js +2 -4
- package/example/logging.js +6 -2
- package/example/sample.js +21 -0
- package/executors.js +11 -27
- package/firefox/binary.js +149 -98
- package/firefox/extension.js +15 -19
- package/firefox/index.js +256 -163
- package/firefox/profile.js +223 -243
- package/http/index.js +487 -81
- package/http/util.js +40 -36
- package/ie.js +288 -309
- package/index.js +34 -125
- package/io/exec.js +58 -39
- package/io/index.js +72 -60
- package/lib/README +4 -0
- package/lib/actions.js +596 -0
- package/lib/by.js +277 -0
- package/lib/capabilities.js +450 -0
- package/lib/{webdriver/command.js → command.js} +91 -72
- package/lib/{webdriver/button.js → devmode.js} +13 -8
- package/lib/error.js +690 -0
- package/lib/events.js +212 -0
- package/lib/firefox/amd64/libnoblur64.so +0 -0
- package/lib/firefox/i386/libnoblur.so +0 -0
- package/lib/firefox/webdriver.json +5 -1
- package/lib/firefox/webdriver.xpi +0 -0
- package/lib/{webdriver/key.js → input.js} +84 -2
- package/lib/logging.js +670 -0
- package/lib/{webdriver/promise.js → promise.js} +817 -644
- package/lib/safari/client.js +266 -214
- package/lib/session.js +80 -0
- package/lib/{webdriver/serializable.js → symbols.js} +16 -19
- package/lib/test/build.js +4 -4
- package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
- package/lib/test/data/click_tests/overlapping_elements.html +15 -4
- package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
- package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
- package/lib/test/data/hidden_partially.html +45 -0
- package/lib/test/data/readOnlyPage.html +1 -1
- package/lib/test/data/selectPage.html +18 -2
- package/lib/test/fileserver.js +3 -4
- package/lib/test/index.js +7 -3
- package/lib/test/resources.js +1 -1
- package/lib/until.js +376 -0
- package/lib/webdriver.js +2440 -0
- package/net/index.js +4 -0
- package/net/portprober.js +16 -12
- package/opera.js +295 -314
- package/package.json +6 -5
- package/phantomjs.js +144 -147
- package/proxy.js +10 -6
- package/remote/index.js +289 -238
- package/safari.js +326 -311
- package/test/chrome/options_test.js +11 -9
- package/test/element_finding_test.js +51 -13
- package/test/execute_script_test.js +17 -3
- package/test/firefox/firefox_test.js +0 -32
- package/test/http/http_test.js +671 -61
- package/test/http/util_test.js +25 -23
- package/test/io_test.js +67 -1
- package/test/lib/by_test.js +139 -0
- package/test/lib/capabilities_test.js +111 -0
- package/test/lib/error_test.js +325 -0
- package/test/lib/events_test.js +177 -0
- package/test/lib/logging_test.js +272 -0
- package/test/{promise_aplus_test.js → lib/promise_aplus_test.js} +4 -13
- package/test/lib/promise_error_test.js +808 -0
- package/test/lib/promise_flow_test.js +2282 -0
- package/test/lib/promise_generator_test.js +308 -0
- package/test/lib/promise_test.js +996 -0
- package/test/lib/testutil.js +90 -0
- package/test/lib/until_test.js +400 -0
- package/test/lib/webdriver_test.js +2157 -0
- package/test/page_loading_test.js +7 -9
- package/test/remote_test.js +50 -3
- package/test/session_test.js +53 -0
- package/test/stale_element_test.js +2 -2
- package/test/testing/assert_test.js +374 -0
- package/test/testing/index_test.js +9 -11
- package/testing/assert.js +334 -17
- package/testing/index.js +12 -2
- package/_base.js +0 -200
- package/docs/Changes.html +0 -356
- package/docs/class_bot_Error.html +0 -15
- package/docs/class_webdriver_ActionSequence.html +0 -115
- package/docs/class_webdriver_Alert.html +0 -24
- package/docs/class_webdriver_AlertPromise.html +0 -92
- package/docs/class_webdriver_Capabilities.html +0 -60
- package/docs/class_webdriver_Command.html +0 -15
- package/docs/class_webdriver_EventEmitter.html +0 -35
- package/docs/class_webdriver_FileDetector.html +0 -21
- package/docs/class_webdriver_Locator.html +0 -12
- package/docs/class_webdriver_Serializable.html +0 -9
- package/docs/class_webdriver_Session.html +0 -13
- package/docs/class_webdriver_TouchSequence.html +0 -49
- package/docs/class_webdriver_UnhandledAlertError.html +0 -18
- package/docs/class_webdriver_WebDriver.html +0 -313
- package/docs/class_webdriver_WebDriver_Logs.html +0 -15
- package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
- package/docs/class_webdriver_WebDriver_Options.html +0 -41
- package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
- package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
- package/docs/class_webdriver_WebDriver_Window.html +0 -27
- package/docs/class_webdriver_WebElement.html +0 -223
- package/docs/class_webdriver_WebElementPromise.html +0 -274
- package/docs/class_webdriver_http_Executor.html +0 -22
- package/docs/class_webdriver_http_Request.html +0 -12
- package/docs/class_webdriver_http_Response.html +0 -13
- package/docs/class_webdriver_logging_Entry.html +0 -15
- package/docs/class_webdriver_logging_Level.html +0 -55
- package/docs/class_webdriver_logging_LogRecord.html +0 -45
- package/docs/class_webdriver_logging_Logger.html +0 -119
- package/docs/class_webdriver_logging_Preferences.html +0 -8
- package/docs/class_webdriver_promise_CancellationError.html +0 -17
- package/docs/class_webdriver_promise_ControlFlow.html +0 -153
- package/docs/class_webdriver_promise_Deferred.html +0 -84
- package/docs/class_webdriver_promise_MultipleUnhandledRejectionError.html +0 -14
- package/docs/class_webdriver_promise_Promise.html +0 -75
- package/docs/class_webdriver_stacktrace_Frame.html +0 -20
- package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
- package/docs/class_webdriver_testing_Assertion.html +0 -99
- package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
- package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
- package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
- package/docs/class_webdriver_until_Condition.html +0 -7
- package/docs/dossier.css +0 -1
- package/docs/dossier.js +0 -86
- package/docs/enum_bot_ErrorCode.html +0 -3
- package/docs/enum_bot_Error_State.html +0 -2
- package/docs/enum_webdriver_Browser.html +0 -2
- package/docs/enum_webdriver_Button.html +0 -2
- package/docs/enum_webdriver_Capability.html +0 -33
- package/docs/enum_webdriver_CommandName.html +0 -3
- package/docs/enum_webdriver_Key.html +0 -12
- package/docs/enum_webdriver_logging_Type.html +0 -6
- package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
- package/docs/index.html +0 -125
- package/docs/interface_webdriver_CommandExecutor.html +0 -9
- package/docs/interface_webdriver_http_Client.html +0 -10
- package/docs/interface_webdriver_promise_Thenable.html +0 -77
- package/docs/module_selenium-webdriver.html +0 -23
- package/docs/module_selenium-webdriver__base.html +0 -23
- package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
- package/docs/module_selenium-webdriver_builder.html +0 -2
- package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
- package/docs/module_selenium-webdriver_chrome.html +0 -90
- package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
- package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
- package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
- package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
- package/docs/module_selenium-webdriver_class_Builder.html +0 -138
- package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
- package/docs/module_selenium-webdriver_class_Command.html +0 -15
- package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
- package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
- package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
- package/docs/module_selenium-webdriver_class_Session.html +0 -13
- package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
- package/docs/module_selenium-webdriver_class_WebElement.html +0 -223
- package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -274
- package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
- package/docs/module_selenium-webdriver_enum_Button.html +0 -2
- package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
- package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
- package/docs/module_selenium-webdriver_enum_Key.html +0 -12
- package/docs/module_selenium-webdriver_error.html +0 -4
- package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
- package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
- package/docs/module_selenium-webdriver_executors.html +0 -10
- package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
- package/docs/module_selenium-webdriver_firefox.html +0 -68
- package/docs/module_selenium-webdriver_firefox_binary.html +0 -5
- package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -20
- package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -20
- package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
- package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
- package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
- package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
- package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
- package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
- package/docs/module_selenium-webdriver_http.html +0 -9
- package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
- package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
- package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
- package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
- package/docs/module_selenium-webdriver_http_util.html +0 -17
- package/docs/module_selenium-webdriver_ie.html +0 -11
- package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
- package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
- package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
- package/docs/module_selenium-webdriver_io.html +0 -37
- package/docs/module_selenium-webdriver_io_exec.html +0 -6
- package/docs/module_selenium-webdriver_namespace_By.html +0 -56
- package/docs/module_selenium-webdriver_namespace_error.html +0 -4
- package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
- package/docs/module_selenium-webdriver_namespace_promise.html +0 -163
- package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
- package/docs/module_selenium-webdriver_namespace_until.html +0 -82
- package/docs/module_selenium-webdriver_net.html +0 -7
- package/docs/module_selenium-webdriver_net_portprober.html +0 -12
- package/docs/module_selenium-webdriver_opera.html +0 -62
- package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
- package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
- package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
- package/docs/module_selenium-webdriver_phantomjs.html +0 -2
- package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
- package/docs/module_selenium-webdriver_proxy.html +0 -28
- package/docs/module_selenium-webdriver_remote.html +0 -8
- package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
- package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
- package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -41
- package/docs/module_selenium-webdriver_safari.html +0 -9
- package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
- package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
- package/docs/module_selenium-webdriver_testing.html +0 -74
- package/docs/module_selenium-webdriver_testing_assert.html +0 -9
- package/docs/namespace_bot.html +0 -4
- package/docs/namespace_bot_json.html +0 -20
- package/docs/namespace_bot_response.html +0 -18
- package/docs/namespace_bot_userAgent.html +0 -33
- package/docs/namespace_webdriver.html +0 -30
- package/docs/namespace_webdriver_By.html +0 -56
- package/docs/namespace_webdriver_http.html +0 -6
- package/docs/namespace_webdriver_logging.html +0 -70
- package/docs/namespace_webdriver_promise.html +0 -688
- package/docs/namespace_webdriver_stacktrace.html +0 -17
- package/docs/namespace_webdriver_testing.html +0 -7
- package/docs/namespace_webdriver_testing_assert.html +0 -9
- package/docs/namespace_webdriver_testing_asserts.html +0 -18
- package/docs/namespace_webdriver_until.html +0 -82
- package/docs/source/_base.js.src.html +0 -1
- package/docs/source/builder.js.src.html +0 -1
- package/docs/source/chrome.js.src.html +0 -1
- package/docs/source/error.js.src.html +0 -1
- package/docs/source/executors.js.src.html +0 -1
- package/docs/source/firefox/binary.js.src.html +0 -1
- package/docs/source/firefox/extension.js.src.html +0 -1
- package/docs/source/firefox/index.js.src.html +0 -1
- package/docs/source/firefox/profile.js.src.html +0 -1
- package/docs/source/http/index.js.src.html +0 -1
- package/docs/source/http/util.js.src.html +0 -1
- package/docs/source/ie.js.src.html +0 -1
- package/docs/source/index.js.src.html +0 -1
- package/docs/source/io/exec.js.src.html +0 -1
- package/docs/source/io/index.js.src.html +0 -1
- package/docs/source/lib/atoms/error.js.src.html +0 -1
- package/docs/source/lib/atoms/json.js.src.html +0 -1
- package/docs/source/lib/atoms/response.js.src.html +0 -1
- package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
- package/docs/source/lib/goog/array/array.js.src.html +0 -1
- package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
- package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
- package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
- package/docs/source/lib/goog/async/run.js.src.html +0 -1
- package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
- package/docs/source/lib/goog/base.js.src.html +0 -1
- package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
- package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
- package/docs/source/lib/goog/debug/error.js.src.html +0 -1
- package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
- package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
- package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
- package/docs/source/lib/goog/deps.js.src.html +0 -1
- package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
- package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
- package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
- package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
- package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
- package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
- package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
- package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
- package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
- package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
- package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
- package/docs/source/lib/goog/events/event.js.src.html +0 -1
- package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
- package/docs/source/lib/goog/events/events.js.src.html +0 -1
- package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
- package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
- package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
- package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
- package/docs/source/lib/goog/events/listener.js.src.html +0 -1
- package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
- package/docs/source/lib/goog/fs/url.js.src.html +0 -1
- package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
- package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
- package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
- package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
- package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
- package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
- package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
- package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
- package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
- package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
- package/docs/source/lib/goog/json/json.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
- package/docs/source/lib/goog/log/log.js.src.html +0 -1
- package/docs/source/lib/goog/math/box.js.src.html +0 -1
- package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
- package/docs/source/lib/goog/math/math.js.src.html +0 -1
- package/docs/source/lib/goog/math/rect.js.src.html +0 -1
- package/docs/source/lib/goog/math/size.js.src.html +0 -1
- package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
- package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
- package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
- package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
- package/docs/source/lib/goog/object/object.js.src.html +0 -1
- package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
- package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
- package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
- package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
- package/docs/source/lib/goog/string/const.js.src.html +0 -1
- package/docs/source/lib/goog/string/string.js.src.html +0 -1
- package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
- package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
- package/docs/source/lib/goog/structs/map.js.src.html +0 -1
- package/docs/source/lib/goog/structs/set.js.src.html +0 -1
- package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
- package/docs/source/lib/goog/style/style.js.src.html +0 -1
- package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
- package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
- package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
- package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
- package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
- package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
- package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
- package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
- package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
- package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
- package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
- package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
- package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
- package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
- package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
- package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
- package/docs/source/lib/webdriver/button.js.src.html +0 -1
- package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
- package/docs/source/lib/webdriver/command.js.src.html +0 -1
- package/docs/source/lib/webdriver/events.js.src.html +0 -1
- package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
- package/docs/source/lib/webdriver/key.js.src.html +0 -1
- package/docs/source/lib/webdriver/locators.js.src.html +0 -1
- package/docs/source/lib/webdriver/logging.js.src.html +0 -1
- package/docs/source/lib/webdriver/promise.js.src.html +0 -1
- package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
- package/docs/source/lib/webdriver/session.js.src.html +0 -1
- package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
- package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
- package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
- package/docs/source/lib/webdriver/until.js.src.html +0 -1
- package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
- package/docs/source/net/index.js.src.html +0 -1
- package/docs/source/net/portprober.js.src.html +0 -1
- package/docs/source/opera.js.src.html +0 -1
- package/docs/source/phantomjs.js.src.html +0 -1
- package/docs/source/proxy.js.src.html +0 -1
- package/docs/source/remote/index.js.src.html +0 -1
- package/docs/source/safari.js.src.html +0 -1
- package/docs/source/testing/assert.js.src.html +0 -1
- package/docs/source/testing/index.js.src.html +0 -1
- package/docs/types.js +0 -1
- package/lib/atoms/error.js +0 -202
- package/lib/atoms/json.js +0 -80
- package/lib/atoms/response.js +0 -110
- package/lib/atoms/userAgent.js +0 -257
- package/lib/goog/LICENSE +0 -176
- package/lib/goog/array/array.js +0 -1654
- package/lib/goog/asserts/asserts.js +0 -365
- package/lib/goog/async/freelist.js +0 -88
- package/lib/goog/async/nexttick.js +0 -241
- package/lib/goog/async/run.js +0 -133
- package/lib/goog/async/workqueue.js +0 -139
- package/lib/goog/base.js +0 -2548
- package/lib/goog/debug/debug.js +0 -653
- package/lib/goog/debug/entrypointregistry.js +0 -158
- package/lib/goog/debug/error.js +0 -63
- package/lib/goog/debug/logbuffer.js +0 -148
- package/lib/goog/debug/logger.js +0 -873
- package/lib/goog/debug/logrecord.js +0 -242
- package/lib/goog/deps.js +0 -151
- package/lib/goog/disposable/disposable.js +0 -307
- package/lib/goog/disposable/idisposable.js +0 -45
- package/lib/goog/dom/browserfeature.js +0 -72
- package/lib/goog/dom/dom.js +0 -2991
- package/lib/goog/dom/nodetype.js +0 -48
- package/lib/goog/dom/safe.js +0 -347
- package/lib/goog/dom/tagname.js +0 -160
- package/lib/goog/dom/tags.js +0 -41
- package/lib/goog/dom/vendor.js +0 -96
- package/lib/goog/events/browserevent.js +0 -400
- package/lib/goog/events/browserfeature.js +0 -85
- package/lib/goog/events/event.js +0 -143
- package/lib/goog/events/eventid.js +0 -47
- package/lib/goog/events/events.js +0 -984
- package/lib/goog/events/eventtarget.js +0 -394
- package/lib/goog/events/eventtype.js +0 -237
- package/lib/goog/events/keycodes.js +0 -427
- package/lib/goog/events/listenable.js +0 -335
- package/lib/goog/events/listener.js +0 -131
- package/lib/goog/events/listenermap.js +0 -308
- package/lib/goog/fs/url.js +0 -109
- package/lib/goog/functions/functions.js +0 -442
- package/lib/goog/html/safehtml.js +0 -757
- package/lib/goog/html/safescript.js +0 -234
- package/lib/goog/html/safestyle.js +0 -442
- package/lib/goog/html/safestylesheet.js +0 -276
- package/lib/goog/html/safeurl.js +0 -398
- package/lib/goog/html/trustedresourceurl.js +0 -224
- package/lib/goog/html/uncheckedconversions.js +0 -232
- package/lib/goog/i18n/bidi.js +0 -908
- package/lib/goog/iter/iter.js +0 -1302
- package/lib/goog/json/json.js +0 -363
- package/lib/goog/labs/testing/assertthat.js +0 -58
- package/lib/goog/labs/testing/logicmatcher.js +0 -212
- package/lib/goog/labs/testing/matcher.js +0 -80
- package/lib/goog/labs/testing/numbermatcher.js +0 -346
- package/lib/goog/labs/testing/objectmatcher.js +0 -317
- package/lib/goog/labs/testing/stringmatcher.js +0 -415
- package/lib/goog/labs/useragent/browser.js +0 -341
- package/lib/goog/labs/useragent/engine.js +0 -160
- package/lib/goog/labs/useragent/platform.js +0 -160
- package/lib/goog/labs/useragent/util.js +0 -148
- package/lib/goog/log/log.js +0 -197
- package/lib/goog/math/box.js +0 -398
- package/lib/goog/math/coordinate.js +0 -268
- package/lib/goog/math/math.js +0 -451
- package/lib/goog/math/rect.js +0 -476
- package/lib/goog/math/size.js +0 -227
- package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
- package/lib/goog/net/xhrlike.js +0 -124
- package/lib/goog/net/xmlhttp.js +0 -246
- package/lib/goog/net/xmlhttpfactory.js +0 -67
- package/lib/goog/object/object.js +0 -686
- package/lib/goog/promise/promise.js +0 -1350
- package/lib/goog/promise/resolver.js +0 -48
- package/lib/goog/promise/thenable.js +0 -126
- package/lib/goog/reflect/reflect.js +0 -77
- package/lib/goog/string/const.js +0 -182
- package/lib/goog/string/string.js +0 -1599
- package/lib/goog/string/typedstring.js +0 -48
- package/lib/goog/structs/collection.js +0 -56
- package/lib/goog/structs/map.js +0 -457
- package/lib/goog/structs/set.js +0 -279
- package/lib/goog/structs/structs.js +0 -354
- package/lib/goog/style/style.js +0 -2037
- package/lib/goog/testing/asserts.js +0 -1278
- package/lib/goog/testing/events/events.js +0 -767
- package/lib/goog/testing/functionmock.js +0 -175
- package/lib/goog/testing/jsunit.js +0 -162
- package/lib/goog/testing/loosemock.js +0 -242
- package/lib/goog/testing/mock.js +0 -645
- package/lib/goog/testing/mockclock.js +0 -606
- package/lib/goog/testing/mockcontrol.js +0 -220
- package/lib/goog/testing/mockinterface.js +0 -45
- package/lib/goog/testing/mockmatchers.js +0 -400
- package/lib/goog/testing/objectpropertystring.js +0 -68
- package/lib/goog/testing/propertyreplacer.js +0 -262
- package/lib/goog/testing/recordfunction.js +0 -215
- package/lib/goog/testing/stacktrace.js +0 -594
- package/lib/goog/testing/strictmock.js +0 -130
- package/lib/goog/testing/testcase.js +0 -1629
- package/lib/goog/testing/testrunner.js +0 -440
- package/lib/goog/uri/uri.js +0 -1524
- package/lib/goog/uri/utils.js +0 -1064
- package/lib/goog/useragent/product.js +0 -183
- package/lib/goog/useragent/product_isversion.js +0 -144
- package/lib/goog/useragent/useragent.js +0 -572
- package/lib/webdriver/actionsequence.js +0 -356
- package/lib/webdriver/builder.js +0 -207
- package/lib/webdriver/capabilities.js +0 -412
- package/lib/webdriver/events.js +0 -179
- package/lib/webdriver/firefoxdomexecutor.js +0 -175
- package/lib/webdriver/http/corsclient.js +0 -133
- package/lib/webdriver/http/http.js +0 -525
- package/lib/webdriver/http/xhrclient.js +0 -67
- package/lib/webdriver/locators.js +0 -257
- package/lib/webdriver/logging.js +0 -347
- package/lib/webdriver/session.js +0 -74
- package/lib/webdriver/stacktrace.js +0 -619
- package/lib/webdriver/test/builder_test.js +0 -53
- package/lib/webdriver/test/capabilities_test.js +0 -72
- package/lib/webdriver/test/events_test.js +0 -203
- package/lib/webdriver/test/http/corsclient_test.js +0 -151
- package/lib/webdriver/test/http/http_test.js +0 -428
- package/lib/webdriver/test/http/xhrclient_test.js +0 -196
- package/lib/webdriver/test/locators_test.js +0 -59
- package/lib/webdriver/test/logging_test.js +0 -85
- package/lib/webdriver/test/promise_error_test.js +0 -892
- package/lib/webdriver/test/promise_flow_test.js +0 -2365
- package/lib/webdriver/test/promise_generator_test.js +0 -323
- package/lib/webdriver/test/promise_test.js +0 -2012
- package/lib/webdriver/test/stacktrace_test.js +0 -480
- package/lib/webdriver/test/test_bootstrap.js +0 -67
- package/lib/webdriver/test/testing/asserts_test.js +0 -117
- package/lib/webdriver/test/testing/client_test.js +0 -88
- package/lib/webdriver/test/testing/testcase_test.js +0 -229
- package/lib/webdriver/test/testutil.js +0 -209
- package/lib/webdriver/test/testutil_test.js +0 -104
- package/lib/webdriver/test/until_test.js +0 -411
- package/lib/webdriver/test/webdriver_generator_test.js +0 -92
- package/lib/webdriver/test/webdriver_test.js +0 -2369
- package/lib/webdriver/testing/asserts.js +0 -487
- package/lib/webdriver/testing/client.js +0 -179
- package/lib/webdriver/testing/jsunit.js +0 -363
- package/lib/webdriver/testing/testcase.js +0 -168
- package/lib/webdriver/testing/window.js +0 -244
- package/lib/webdriver/touchsequence.js +0 -248
- package/lib/webdriver/until.js +0 -412
- package/lib/webdriver/webdriver.js +0 -2511
- package/test/_base_test.js +0 -129
package/safari.js
CHANGED
|
@@ -26,37 +26,48 @@
|
|
|
26
26
|
|
|
27
27
|
'use strict';
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
29
|
+
const events = require('events');
|
|
30
|
+
const fs = require('fs');
|
|
31
|
+
const http = require('http');
|
|
32
|
+
const path = require('path');
|
|
33
|
+
const url = require('url');
|
|
34
|
+
const util = require('util');
|
|
35
|
+
const ws = require('ws');
|
|
36
|
+
|
|
37
|
+
const error = require('./error');
|
|
38
|
+
const io = require('./io');
|
|
39
|
+
const exec = require('./io/exec');
|
|
40
|
+
const isDevMode = require('./lib/devmode');
|
|
41
|
+
const Capabilities = require('./lib/capabilities').Capabilities;
|
|
42
|
+
const Capability = require('./lib/capabilities').Capability;
|
|
43
|
+
const command = require('./lib/command');
|
|
44
|
+
const promise = require('./lib/promise');
|
|
45
|
+
const Symbols = require('./lib/symbols');
|
|
46
|
+
const webdriver = require('./lib/webdriver');
|
|
47
|
+
const portprober = require('./net/portprober');
|
|
43
48
|
|
|
44
49
|
|
|
45
50
|
/** @const */
|
|
46
|
-
|
|
51
|
+
const CLIENT_PATH = isDevMode
|
|
47
52
|
? path.join(__dirname,
|
|
48
53
|
'../../../build/javascript/safari-driver/client.js')
|
|
49
54
|
: path.join(__dirname, 'lib/safari/client.js');
|
|
50
55
|
|
|
51
56
|
|
|
52
57
|
/** @const */
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
58
|
+
const LIBRARY_DIR = (function() {
|
|
59
|
+
if (process.platform === 'darwin') {
|
|
60
|
+
return path.join('/Users', process.env['USER'], 'Library/Safari');
|
|
61
|
+
} else if (process.platform === 'win32') {
|
|
62
|
+
return path.join(process.env['APPDATA'], 'Apple Computer', 'Safari');
|
|
63
|
+
} else {
|
|
64
|
+
return '/dev/null';
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
56
67
|
|
|
57
68
|
|
|
58
69
|
/** @const */
|
|
59
|
-
|
|
70
|
+
const SESSION_DATA_FILES = (function() {
|
|
60
71
|
if (process.platform === 'darwin') {
|
|
61
72
|
var libraryDir = path.join('/Users', process.env['USER'], 'Library');
|
|
62
73
|
return [
|
|
@@ -95,97 +106,95 @@ var Host;
|
|
|
95
106
|
/**
|
|
96
107
|
* A basic HTTP/WebSocket server used to communicate with the SafariDriver
|
|
97
108
|
* browser extension.
|
|
98
|
-
* @constructor
|
|
99
|
-
* @extends {events.EventEmitter}
|
|
100
109
|
*/
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
var query = url.parse(req.url).query || '';
|
|
112
|
-
if (query.indexOf('url=') == -1) {
|
|
113
|
-
var address = server.address()
|
|
114
|
-
var host = address.address + ':' + address.port;
|
|
115
|
-
res.writeHead(302, {'Location': 'http://' + host + '?url=ws://' + host});
|
|
116
|
-
res.end();
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
fs.readFile(CLIENT_PATH, 'utf8', function(err, data) {
|
|
120
|
-
if (err) {
|
|
121
|
-
res.writeHead(500, {'Content-Type': 'text/plain'});
|
|
122
|
-
res.end(err.stack);
|
|
110
|
+
class Server extends events.EventEmitter {
|
|
111
|
+
constructor() {
|
|
112
|
+
super();
|
|
113
|
+
var server = http.createServer(function(req, res) {
|
|
114
|
+
if (req.url === '/favicon.ico') {
|
|
115
|
+
res.writeHead(204);
|
|
116
|
+
res.end();
|
|
123
117
|
return;
|
|
124
118
|
}
|
|
125
|
-
var content = '<!DOCTYPE html><body><script>' + data + '</script>';
|
|
126
|
-
res.writeHead(200, {
|
|
127
|
-
'Content-Type': 'text/html; charset=utf-8',
|
|
128
|
-
'Content-Length': Buffer.byteLength(content, 'utf8'),
|
|
129
|
-
});
|
|
130
|
-
res.end(content);
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
119
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
this.start = function() {
|
|
143
|
-
if (server.address()) {
|
|
144
|
-
return promise.fulfilled(server.address());
|
|
145
|
-
}
|
|
146
|
-
return portprober.findFreePort('localhost').then(function(port) {
|
|
147
|
-
return promise.checkedNodeCall(
|
|
148
|
-
server.listen.bind(server, port, 'localhost'));
|
|
149
|
-
}).then(function() {
|
|
150
|
-
return server.address();
|
|
151
|
-
});
|
|
152
|
-
};
|
|
120
|
+
var query = url.parse(/** @type {string} */(req.url)).query || '';
|
|
121
|
+
if (query.indexOf('url=') == -1) {
|
|
122
|
+
var address = server.address()
|
|
123
|
+
var host = address.address + ':' + address.port;
|
|
124
|
+
res.writeHead(
|
|
125
|
+
302, {'Location': 'http://' + host + '?url=ws://' + host});
|
|
126
|
+
res.end();
|
|
127
|
+
}
|
|
153
128
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
129
|
+
fs.readFile(CLIENT_PATH, 'utf8', function(err, data) {
|
|
130
|
+
if (err) {
|
|
131
|
+
res.writeHead(500, {'Content-Type': 'text/plain'});
|
|
132
|
+
res.end(err.stack);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
var content = '<!DOCTYPE html><body><script>' + data + '</script>';
|
|
136
|
+
res.writeHead(200, {
|
|
137
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
138
|
+
'Content-Length': Buffer.byteLength(content, 'utf8'),
|
|
139
|
+
});
|
|
140
|
+
res.end(content);
|
|
141
|
+
});
|
|
162
142
|
});
|
|
163
|
-
};
|
|
164
143
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
|
|
144
|
+
var wss = new ws.Server({server: server});
|
|
145
|
+
wss.on('connection', this.emit.bind(this, 'connection'));
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Starts the server on a random port.
|
|
149
|
+
* @return {!promise.Promise<Host>} A promise that will resolve
|
|
150
|
+
* with the server host when it has fully started.
|
|
151
|
+
*/
|
|
152
|
+
this.start = function() {
|
|
153
|
+
if (server.address()) {
|
|
154
|
+
return promise.fulfilled(server.address());
|
|
155
|
+
}
|
|
156
|
+
return portprober.findFreePort('localhost').then(function(port) {
|
|
157
|
+
return promise.checkedNodeCall(
|
|
158
|
+
server.listen.bind(server, port, 'localhost'));
|
|
159
|
+
}).then(function() {
|
|
160
|
+
return server.address();
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Stops the server.
|
|
166
|
+
* @return {!promise.Promise} A promise that will resolve when
|
|
167
|
+
* the server has closed all connections.
|
|
168
|
+
*/
|
|
169
|
+
this.stop = function() {
|
|
170
|
+
return new promise.Promise(function(fulfill) {
|
|
171
|
+
server.close(fulfill);
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* @return {Host} This server's host info.
|
|
177
|
+
* @throws {Error} If the server is not running.
|
|
178
|
+
*/
|
|
179
|
+
this.address = function() {
|
|
180
|
+
var addr = server.address();
|
|
181
|
+
if (!addr) {
|
|
182
|
+
throw Error('There server is not running!');
|
|
183
|
+
}
|
|
184
|
+
return addr;
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
178
188
|
|
|
179
189
|
|
|
180
190
|
/**
|
|
181
|
-
* @return {!
|
|
191
|
+
* @return {!Promise<string>} A promise that will resolve with the path
|
|
182
192
|
* to Safari on the current system.
|
|
183
193
|
*/
|
|
184
194
|
function findSafariExecutable() {
|
|
185
195
|
switch (process.platform) {
|
|
186
196
|
case 'darwin':
|
|
187
|
-
return
|
|
188
|
-
'/Applications/Safari.app/Contents/MacOS/Safari');
|
|
197
|
+
return Promise.resolve('/Applications/Safari.app/Contents/MacOS/Safari');
|
|
189
198
|
|
|
190
199
|
case 'win32':
|
|
191
200
|
var files = [
|
|
@@ -204,7 +213,7 @@ function findSafariExecutable() {
|
|
|
204
213
|
});
|
|
205
214
|
|
|
206
215
|
default:
|
|
207
|
-
return
|
|
216
|
+
return Promise.reject(
|
|
208
217
|
Error('Safari is not supported on the current platform: ' +
|
|
209
218
|
process.platform));
|
|
210
219
|
}
|
|
@@ -212,16 +221,15 @@ function findSafariExecutable() {
|
|
|
212
221
|
|
|
213
222
|
|
|
214
223
|
/**
|
|
215
|
-
* @param {string}
|
|
216
|
-
* @return {!
|
|
217
|
-
*
|
|
218
|
-
* server.
|
|
224
|
+
* @param {string} serverUrl The URL to connect to.
|
|
225
|
+
* @return {!Promise<string>} A promise for the path to a file that Safari can
|
|
226
|
+
* open on start-up to trigger a new connection to the WebSocket server.
|
|
219
227
|
*/
|
|
220
|
-
function createConnectFile(
|
|
228
|
+
function createConnectFile(serverUrl) {
|
|
221
229
|
return io.tmpFile({postfix: '.html'}).then(function(f) {
|
|
222
230
|
var writeFile = promise.checkedNodeCall(fs.writeFile,
|
|
223
231
|
f,
|
|
224
|
-
'<!DOCTYPE html><script>window.location = "' +
|
|
232
|
+
'<!DOCTYPE html><script>window.location = "' + serverUrl + '";</script>',
|
|
225
233
|
{encoding: 'utf8'});
|
|
226
234
|
return writeFile.then(function() {
|
|
227
235
|
return f;
|
|
@@ -252,53 +260,68 @@ function cleanSession(desiredCapabilities) {
|
|
|
252
260
|
}
|
|
253
261
|
|
|
254
262
|
|
|
263
|
+
/** @return {string} . */
|
|
264
|
+
function getRandomString() {
|
|
265
|
+
let seed = Date.now();
|
|
266
|
+
return Math.floor(Math.random() * seed).toString(36)
|
|
267
|
+
+ Math.abs(Math.floor(Math.random() * seed) ^ Date.now()).toString(36);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
|
|
255
271
|
/**
|
|
256
|
-
* @
|
|
257
|
-
* @implements {webdriver.CommandExecutor}
|
|
272
|
+
* @implements {command.Executor}
|
|
258
273
|
*/
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
/** @private {ws.WebSocket} */
|
|
264
|
-
this.socket_ = null;
|
|
265
|
-
|
|
266
|
-
/** @private {promise.Promise.<!exec.Command>} */
|
|
267
|
-
this.safari_ = null;
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
/** @override */
|
|
272
|
-
CommandExecutor.prototype.execute = function(command, callback) {
|
|
273
|
-
var safariCommand = JSON.stringify({
|
|
274
|
-
'origin': 'webdriver',
|
|
275
|
-
'type': 'command',
|
|
276
|
-
'command': {
|
|
277
|
-
'id': _base.require('goog.string').getRandomString(),
|
|
278
|
-
'name': command.getName(),
|
|
279
|
-
'parameters': command.getParameters()
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
var self = this;
|
|
274
|
+
class CommandExecutor {
|
|
275
|
+
constructor() {
|
|
276
|
+
this.server_ = null;
|
|
283
277
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
this.startSafari_(command).then(sendCommand, callback);
|
|
287
|
-
break;
|
|
278
|
+
/** @private {ws.WebSocket} */
|
|
279
|
+
this.socket_ = null;
|
|
288
280
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
}, callback);
|
|
293
|
-
break;
|
|
281
|
+
/** @private {promise.Promise.<!exec.Command>} */
|
|
282
|
+
this.safari_ = null;
|
|
283
|
+
}
|
|
294
284
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
285
|
+
/** @override */
|
|
286
|
+
execute(cmd) {
|
|
287
|
+
var self = this;
|
|
288
|
+
return new promise.Promise(function(fulfill, reject) {
|
|
289
|
+
var safariCommand = JSON.stringify({
|
|
290
|
+
'origin': 'webdriver',
|
|
291
|
+
'type': 'command',
|
|
292
|
+
'command': {
|
|
293
|
+
'id': getRandomString(),
|
|
294
|
+
'name': cmd.getName(),
|
|
295
|
+
'parameters': cmd.getParameters()
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
switch (cmd.getName()) {
|
|
300
|
+
case command.Name.NEW_SESSION:
|
|
301
|
+
self.startSafari_(cmd)
|
|
302
|
+
.then(() => self.sendCommand_(safariCommand))
|
|
303
|
+
.then(fulfill, reject);
|
|
304
|
+
break;
|
|
305
|
+
|
|
306
|
+
case command.Name.QUIT:
|
|
307
|
+
self.destroySession_().then(() => fulfill(null), reject);
|
|
308
|
+
break;
|
|
309
|
+
|
|
310
|
+
default:
|
|
311
|
+
self.sendCommand_(safariCommand).then(fulfill, reject);
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
});
|
|
298
315
|
}
|
|
299
316
|
|
|
300
|
-
|
|
301
|
-
|
|
317
|
+
/**
|
|
318
|
+
* @param {string} data .
|
|
319
|
+
* @return {!promise.Promise} .
|
|
320
|
+
* @private
|
|
321
|
+
*/
|
|
322
|
+
sendCommand_(data) {
|
|
323
|
+
let self = this;
|
|
324
|
+
return new promise.Promise(function(fulfill, reject) {
|
|
302
325
|
// TODO: support reconnecting with the extension.
|
|
303
326
|
if (!self.socket_) {
|
|
304
327
|
self.destroySession_().thenFinally(function() {
|
|
@@ -307,7 +330,7 @@ CommandExecutor.prototype.execute = function(command, callback) {
|
|
|
307
330
|
return;
|
|
308
331
|
}
|
|
309
332
|
|
|
310
|
-
self.socket_.send(
|
|
333
|
+
self.socket_.send(data, function(err) {
|
|
311
334
|
if (err) {
|
|
312
335
|
reject(err);
|
|
313
336
|
return;
|
|
@@ -321,214 +344,206 @@ CommandExecutor.prototype.execute = function(command, callback) {
|
|
|
321
344
|
reject(Error('Failed to parse driver message: ' + data));
|
|
322
345
|
return;
|
|
323
346
|
}
|
|
324
|
-
fulfill(data['response']);
|
|
325
|
-
});
|
|
326
347
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
348
|
+
try {
|
|
349
|
+
error.checkLegacyResponse(data['response']);
|
|
350
|
+
fulfill(data['response']['value']);
|
|
351
|
+
} catch (ex) {
|
|
352
|
+
reject(ex);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
});
|
|
330
356
|
}
|
|
331
|
-
};
|
|
332
357
|
|
|
358
|
+
/**
|
|
359
|
+
* @param {!command.Command} command .
|
|
360
|
+
* @private
|
|
361
|
+
*/
|
|
362
|
+
startSafari_(command) {
|
|
363
|
+
this.server_ = new Server();
|
|
364
|
+
|
|
365
|
+
this.safari_ = this.server_.start().then(function(address) {
|
|
366
|
+
var tasks = cleanSession(
|
|
367
|
+
/** @type {!Object} */(
|
|
368
|
+
command.getParameters()['desiredCapabilities']));
|
|
369
|
+
tasks.push(
|
|
370
|
+
findSafariExecutable(),
|
|
371
|
+
createConnectFile(
|
|
372
|
+
'http://' + address.address + ':' + address.port));
|
|
373
|
+
return promise.all(tasks).then(function(tasks) {
|
|
374
|
+
var exe = tasks[tasks.length - 2];
|
|
375
|
+
var html = tasks[tasks.length - 1];
|
|
376
|
+
return exec(exe, {args: [html]});
|
|
377
|
+
});
|
|
378
|
+
});
|
|
333
379
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
return exec(exe, {args: [html]});
|
|
380
|
+
var connected = promise.defer();
|
|
381
|
+
var self = this;
|
|
382
|
+
var start = Date.now();
|
|
383
|
+
var timer = setTimeout(function() {
|
|
384
|
+
connected.reject(Error(
|
|
385
|
+
'Failed to connect to the SafariDriver after ' + (Date.now() - start) +
|
|
386
|
+
' ms; Have you installed the latest extension from ' +
|
|
387
|
+
'http://selenium-release.storage.googleapis.com/index.html?'));
|
|
388
|
+
}, 10 * 1000);
|
|
389
|
+
this.server_.once('connection', function(socket) {
|
|
390
|
+
clearTimeout(timer);
|
|
391
|
+
self.socket_ = socket;
|
|
392
|
+
socket.once('close', function() {
|
|
393
|
+
self.socket_ = null;
|
|
394
|
+
});
|
|
395
|
+
connected.fulfill();
|
|
351
396
|
});
|
|
352
|
-
|
|
397
|
+
return connected.promise;
|
|
398
|
+
}
|
|
353
399
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
400
|
+
/**
|
|
401
|
+
* Destroys the active session by stopping the WebSocket server and killing the
|
|
402
|
+
* Safari subprocess.
|
|
403
|
+
* @private
|
|
404
|
+
*/
|
|
405
|
+
destroySession_() {
|
|
406
|
+
var tasks = [];
|
|
407
|
+
if (this.server_) {
|
|
408
|
+
tasks.push(this.server_.stop());
|
|
409
|
+
}
|
|
410
|
+
if (this.safari_) {
|
|
411
|
+
tasks.push(this.safari_.then(function(safari) {
|
|
412
|
+
safari.kill();
|
|
413
|
+
return safari.result();
|
|
414
|
+
}));
|
|
415
|
+
}
|
|
416
|
+
var self = this;
|
|
417
|
+
return promise.all(tasks).finally(function() {
|
|
418
|
+
self.server_ = null;
|
|
367
419
|
self.socket_ = null;
|
|
420
|
+
self.safari_ = null;
|
|
368
421
|
});
|
|
369
|
-
connected.fulfill();
|
|
370
|
-
});
|
|
371
|
-
return connected.promise;
|
|
372
|
-
};
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* Destroys the active session by stopping the WebSocket server and killing the
|
|
377
|
-
* Safari subprocess.
|
|
378
|
-
* @private
|
|
379
|
-
*/
|
|
380
|
-
CommandExecutor.prototype.destroySession_ = function() {
|
|
381
|
-
var tasks = [];
|
|
382
|
-
if (this.server_) {
|
|
383
|
-
tasks.push(this.server_.stop());
|
|
384
422
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
safari.kill();
|
|
388
|
-
return safari.result();
|
|
389
|
-
}));
|
|
390
|
-
}
|
|
391
|
-
var self = this;
|
|
392
|
-
return promise.all(tasks).thenFinally(function() {
|
|
393
|
-
self.server_ = null;
|
|
394
|
-
self.socket_ = null;
|
|
395
|
-
self.safari_ = null;
|
|
396
|
-
});
|
|
397
|
-
};
|
|
423
|
+
}
|
|
424
|
+
|
|
398
425
|
|
|
399
426
|
|
|
400
427
|
/** @const */
|
|
401
|
-
|
|
428
|
+
const OPTIONS_CAPABILITY_KEY = 'safari.options';
|
|
402
429
|
|
|
403
430
|
|
|
404
431
|
|
|
405
432
|
/**
|
|
406
433
|
* Configuration options specific to the {@link Driver SafariDriver}.
|
|
407
|
-
* @constructor
|
|
408
|
-
* @extends {webdriver.Serializable}
|
|
409
434
|
*/
|
|
410
|
-
|
|
411
|
-
|
|
435
|
+
class Options {
|
|
436
|
+
constructor() {
|
|
437
|
+
/** @private {Object<string, *>} */
|
|
438
|
+
this.options_ = null;
|
|
412
439
|
|
|
413
|
-
|
|
414
|
-
|
|
440
|
+
/** @private {./lib/logging.Preferences} */
|
|
441
|
+
this.logPrefs_ = null;
|
|
442
|
+
}
|
|
415
443
|
|
|
416
|
-
/**
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
444
|
+
/**
|
|
445
|
+
* Extracts the SafariDriver specific options from the given capabilities
|
|
446
|
+
* object.
|
|
447
|
+
* @param {!Capabilities} capabilities The capabilities object.
|
|
448
|
+
* @return {!Options} The ChromeDriver options.
|
|
449
|
+
*/
|
|
450
|
+
static fromCapabilities(capabilities) {
|
|
451
|
+
var options = new Options();
|
|
452
|
+
|
|
453
|
+
var o = capabilities.get(OPTIONS_CAPABILITY_KEY);
|
|
454
|
+
if (o instanceof Options) {
|
|
455
|
+
options = o;
|
|
456
|
+
} else if (o) {
|
|
457
|
+
options.setCleanSession(o.cleanSession);
|
|
458
|
+
}
|
|
420
459
|
|
|
460
|
+
if (capabilities.has(Capability.LOGGING_PREFS)) {
|
|
461
|
+
options.setLoggingPrefs(capabilities.get(Capability.LOGGING_PREFS));
|
|
462
|
+
}
|
|
421
463
|
|
|
422
|
-
|
|
423
|
-
* Extracts the SafariDriver specific options from the given capabilities
|
|
424
|
-
* object.
|
|
425
|
-
* @param {!webdriver.Capabilities} capabilities The capabilities object.
|
|
426
|
-
* @return {!Options} The ChromeDriver options.
|
|
427
|
-
*/
|
|
428
|
-
Options.fromCapabilities = function(capabilities) {
|
|
429
|
-
var options = new Options();
|
|
430
|
-
|
|
431
|
-
var o = capabilities.get(OPTIONS_CAPABILITY_KEY);
|
|
432
|
-
if (o instanceof Options) {
|
|
433
|
-
options = o;
|
|
434
|
-
} else if (o) {
|
|
435
|
-
options.setCleanSession(o.cleanSession);
|
|
464
|
+
return options;
|
|
436
465
|
}
|
|
437
466
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
467
|
+
/**
|
|
468
|
+
* Sets whether to force Safari to start with a clean session. Enabling this
|
|
469
|
+
* option will cause all global browser data to be deleted.
|
|
470
|
+
* @param {boolean} clean Whether to make sure the session has no cookies,
|
|
471
|
+
* cache entries, local storage, or databases.
|
|
472
|
+
* @return {!Options} A self reference.
|
|
473
|
+
*/
|
|
474
|
+
setCleanSession(clean) {
|
|
475
|
+
if (!this.options_) {
|
|
476
|
+
this.options_ = {};
|
|
477
|
+
}
|
|
478
|
+
this.options_['cleanSession'] = clean;
|
|
479
|
+
return this;
|
|
441
480
|
}
|
|
442
481
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
* cache entries, local storage, or databases.
|
|
452
|
-
* @return {!Options} A self reference.
|
|
453
|
-
*/
|
|
454
|
-
Options.prototype.setCleanSession = function(clean) {
|
|
455
|
-
if (!this.options_) {
|
|
456
|
-
this.options_ = {};
|
|
482
|
+
/**
|
|
483
|
+
* Sets the logging preferences for the new session.
|
|
484
|
+
* @param {!./lib/logging.Preferences} prefs The logging preferences.
|
|
485
|
+
* @return {!Options} A self reference.
|
|
486
|
+
*/
|
|
487
|
+
setLoggingPrefs(prefs) {
|
|
488
|
+
this.logPrefs_ = prefs;
|
|
489
|
+
return this;
|
|
457
490
|
}
|
|
458
|
-
this.options_['cleanSession'] = clean;
|
|
459
|
-
return this;
|
|
460
|
-
};
|
|
461
|
-
|
|
462
491
|
|
|
463
|
-
/**
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
* @return {!webdriver.Capabilities} The capabilities.
|
|
479
|
-
*/
|
|
480
|
-
Options.prototype.toCapabilities = function(opt_capabilities) {
|
|
481
|
-
var capabilities = opt_capabilities || webdriver.Capabilities.safari();
|
|
482
|
-
if (this.logPrefs_) {
|
|
483
|
-
capabilities.set(webdriver.Capability.LOGGING_PREFS, this.logPrefs_);
|
|
484
|
-
}
|
|
485
|
-
if (this.options_) {
|
|
486
|
-
capabilities.set(OPTIONS_CAPABILITY_KEY, this);
|
|
492
|
+
/**
|
|
493
|
+
* Converts this options instance to a {@link Capabilities} object.
|
|
494
|
+
* @param {Capabilities=} opt_capabilities The capabilities to
|
|
495
|
+
* merge these options into, if any.
|
|
496
|
+
* @return {!Capabilities} The capabilities.
|
|
497
|
+
*/
|
|
498
|
+
toCapabilities(opt_capabilities) {
|
|
499
|
+
var caps = opt_capabilities || Capabilities.safari();
|
|
500
|
+
if (this.logPrefs_) {
|
|
501
|
+
caps.set(Capability.LOGGING_PREFS, this.logPrefs_);
|
|
502
|
+
}
|
|
503
|
+
if (this.options_) {
|
|
504
|
+
caps.set(OPTIONS_CAPABILITY_KEY, this);
|
|
505
|
+
}
|
|
506
|
+
return caps;
|
|
487
507
|
}
|
|
488
|
-
return capabilities;
|
|
489
|
-
};
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
/**
|
|
493
|
-
* Converts this instance to its JSON wire protocol representation. Note this
|
|
494
|
-
* function is an implementation detail not intended for general use.
|
|
495
|
-
* @return {!Object<string, *>} The JSON wire protocol representation of this
|
|
496
|
-
* instance.
|
|
497
|
-
* @override
|
|
498
|
-
*/
|
|
499
|
-
Options.prototype.serialize = function() {
|
|
500
|
-
return this.options_ || {};
|
|
501
|
-
};
|
|
502
508
|
|
|
509
|
+
/**
|
|
510
|
+
* Converts this instance to its JSON wire protocol representation. Note this
|
|
511
|
+
* function is an implementation detail not intended for general use.
|
|
512
|
+
* @return {!Object<string, *>} The JSON wire protocol representation of this
|
|
513
|
+
* instance.
|
|
514
|
+
*/
|
|
515
|
+
[Symbols.serialize]() {
|
|
516
|
+
return this.options_ || {};
|
|
517
|
+
}
|
|
518
|
+
}
|
|
503
519
|
|
|
504
520
|
|
|
505
521
|
/**
|
|
506
522
|
* A WebDriver client for Safari. This class should never be instantiated
|
|
507
|
-
* directly; instead, use the {@
|
|
523
|
+
* directly; instead, use the {@linkplain ./builder.Builder Builder}:
|
|
508
524
|
*
|
|
509
525
|
* var driver = new Builder()
|
|
510
526
|
* .forBrowser('safari')
|
|
511
527
|
* .build();
|
|
512
528
|
*
|
|
513
|
-
* @param {(Options|webdriver.Capabilities)=} opt_config The configuration
|
|
514
|
-
* options for the new session.
|
|
515
|
-
* @param {webdriver.promise.ControlFlow=} opt_flow The control flow to create
|
|
516
|
-
* the driver under.
|
|
517
|
-
* @constructor
|
|
518
|
-
* @extends {webdriver.WebDriver}
|
|
519
529
|
*/
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
530
|
+
class Driver extends webdriver.WebDriver {
|
|
531
|
+
/**
|
|
532
|
+
* @param {(Options|Capabilities)=} opt_config The configuration
|
|
533
|
+
* options for the new session.
|
|
534
|
+
* @param {promise.ControlFlow=} opt_flow The control flow to create
|
|
535
|
+
* the driver under.
|
|
536
|
+
*/
|
|
537
|
+
constructor(opt_config, opt_flow) {
|
|
538
|
+
var executor = new CommandExecutor();
|
|
539
|
+
var caps =
|
|
540
|
+
opt_config instanceof Options ? opt_config.toCapabilities() :
|
|
541
|
+
(opt_config || Capabilities.safari());
|
|
542
|
+
|
|
543
|
+
var driver = webdriver.WebDriver.createSession(executor, caps, opt_flow);
|
|
544
|
+
super(driver.getSession(), executor, driver.controlFlow());
|
|
545
|
+
}
|
|
546
|
+
}
|
|
532
547
|
|
|
533
548
|
|
|
534
549
|
// Public API
|