selenium-webdriver 2.47.0 → 2.52.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 +96 -0
- package/NOTICE +1 -1
- package/README.md +57 -6
- package/builder.js +375 -358
- package/chrome.js +549 -586
- package/edge.js +378 -0
- package/error.js +597 -5
- package/example/google_search_generator.js +2 -4
- package/example/logging.js +6 -2
- package/executors.js +11 -27
- package/firefox/binary.js +80 -114
- package/firefox/extension.js +10 -19
- package/firefox/index.js +175 -171
- package/firefox/profile.js +221 -239
- package/http/index.js +396 -77
- package/http/util.js +35 -35
- package/ie.js +288 -309
- package/index.js +34 -125
- package/io/exec.js +58 -39
- package/io/index.js +54 -48
- package/lib/actions.js +594 -0
- package/lib/by.js +276 -0
- package/lib/capabilities.js +404 -0
- package/lib/{webdriver/command.js → command.js} +89 -72
- package/lib/{webdriver/button.js → devmode.js} +13 -8
- package/lib/events.js +210 -0
- package/lib/firefox/amd64/libnoblur64.so +0 -0
- package/lib/firefox/i386/libnoblur.so +0 -0
- package/lib/firefox/webdriver.json +6 -1
- package/lib/firefox/webdriver.xpi +0 -0
- package/lib/{webdriver/key.js → input.js} +82 -2
- package/lib/logging.js +668 -0
- package/lib/promise.js +3093 -0
- package/lib/safari/client.js +697 -659
- package/lib/session.js +79 -0
- package/{test/promise_aplus_test.js → lib/symbols.js} +15 -25
- package/lib/test/build.js +4 -4
- package/lib/test/data/click_tests/disappearing_element.html +62 -0
- package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
- package/lib/test/data/click_tests/overlapping_elements.html +70 -0
- 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/readOnlyPage.html +3 -1
- package/lib/test/data/selectPage.html +18 -2
- package/lib/test/data/simpleTest.html +1 -0
- package/lib/test/fileserver.js +3 -4
- package/lib/test/index.js +13 -4
- package/lib/test/resources.js +1 -1
- package/lib/until.js +428 -0
- package/lib/webdriver.js +2351 -0
- package/net/portprober.js +15 -11
- package/opera.js +295 -314
- package/package.json +6 -5
- package/phantomjs.js +135 -140
- package/proxy.js +6 -4
- package/remote/index.js +234 -219
- package/safari.js +319 -310
- package/test/chrome/options_test.js +11 -9
- package/test/element_finding_test.js +51 -13
- package/test/error_test.js +163 -0
- package/test/execute_script_test.js +1 -1
- package/test/firefox/firefox_test.js +24 -0
- package/test/http/http_test.js +354 -43
- package/test/http/util_test.js +25 -23
- package/test/io_test.js +6 -1
- package/test/lib/by_test.js +127 -0
- package/test/lib/capabilities_test.js +84 -0
- package/test/lib/events_test.js +177 -0
- package/test/lib/logging_test.js +272 -0
- package/test/lib/promise_aplus_test.js +74 -0
- 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 +436 -0
- package/test/lib/webdriver_test.js +2207 -0
- package/test/page_loading_test.js +7 -9
- 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 +10 -0
- package/_base.js +0 -200
- package/docs/Changes.html +0 -317
- 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 -91
- 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 -216
- package/docs/class_webdriver_WebElementPromise.html +0 -266
- 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 -18
- package/docs/class_webdriver_promise_ControlFlow.html +0 -109
- package/docs/class_webdriver_promise_Deferred.html +0 -84
- package/docs/class_webdriver_promise_Promise.html +0 -74
- 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 -123
- 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 -216
- package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -266
- 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 -67
- package/docs/module_selenium-webdriver_firefox_binary.html +0 -4
- package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -21
- package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -21
- 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 -162
- 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 -40
- 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 -165
- 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/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/testing/watchers.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 -1655
- 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 -139
- package/lib/goog/async/workqueue.js +0 -139
- package/lib/goog/base.js +0 -2547
- 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 -2995
- 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 -42
- package/lib/goog/dom/vendor.js +0 -96
- package/lib/goog/events/browserevent.js +0 -386
- 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 -233
- package/lib/goog/events/keycodes.js +0 -420
- 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 -105
- package/lib/goog/functions/functions.js +0 -332
- package/lib/goog/html/safehtml.js +0 -756
- 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 -431
- package/lib/goog/html/trustedresourceurl.js +0 -224
- package/lib/goog/html/uncheckedconversions.js +0 -231
- package/lib/goog/i18n/bidi.js +0 -908
- package/lib/goog/iter/iter.js +0 -1305
- package/lib/goog/json/json.js +0 -365
- 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 -327
- 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/math/box.js +0 -389
- 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 -1310
- package/lib/goog/promise/resolver.js +0 -48
- package/lib/goog/promise/thenable.js +0 -126
- package/lib/goog/reflect/reflect.js +0 -78
- package/lib/goog/string/const.js +0 -182
- package/lib/goog/string/string.js +0 -1565
- package/lib/goog/string/typedstring.js +0 -48
- package/lib/goog/structs/collection.js +0 -56
- package/lib/goog/structs/map.js +0 -456
- package/lib/goog/structs/set.js +0 -279
- package/lib/goog/structs/structs.js +0 -354
- package/lib/goog/style/style.js +0 -2054
- package/lib/goog/testing/asserts.js +0 -1265
- package/lib/goog/testing/events/events.js +0 -727
- package/lib/goog/testing/functionmock.js +0 -176
- 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 -617
- 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 -245
- 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 -1569
- package/lib/goog/testing/testrunner.js +0 -440
- package/lib/goog/testing/watchers.js +0 -46
- package/lib/goog/uri/uri.js +0 -1507
- package/lib/goog/uri/utils.js +0 -1116
- package/lib/goog/useragent/product.js +0 -175
- package/lib/goog/useragent/product_isversion.js +0 -143
- package/lib/goog/useragent/useragent.js +0 -538
- package/lib/webdriver/actionsequence.js +0 -356
- package/lib/webdriver/builder.js +0 -208
- package/lib/webdriver/capabilities.js +0 -411
- 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 -523
- 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/promise.js +0 -2609
- package/lib/webdriver/serializable.js +0 -41
- 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 -719
- package/lib/webdriver/test/promise_flow_test.js +0 -1957
- package/lib/webdriver/test/promise_generator_test.js +0 -251
- package/lib/webdriver/test/promise_test.js +0 -1981
- 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 -2492
- package/test/_base_test.js +0 -129
package/safari.js
CHANGED
|
@@ -26,37 +26,47 @@
|
|
|
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 io = require('./io');
|
|
38
|
+
const exec = require('./io/exec');
|
|
39
|
+
const isDevMode = require('./lib/devmode');
|
|
40
|
+
const Capabilities = require('./lib/capabilities').Capabilities;
|
|
41
|
+
const Capability = require('./lib/capabilities').Capability;
|
|
42
|
+
const command = require('./lib/command');
|
|
43
|
+
const promise = require('./lib/promise');
|
|
44
|
+
const Symbols = require('./lib/symbols');
|
|
45
|
+
const webdriver = require('./lib/webdriver');
|
|
46
|
+
const portprober = require('./net/portprober');
|
|
43
47
|
|
|
44
48
|
|
|
45
49
|
/** @const */
|
|
46
|
-
|
|
50
|
+
const CLIENT_PATH = isDevMode
|
|
47
51
|
? path.join(__dirname,
|
|
48
52
|
'../../../build/javascript/safari-driver/client.js')
|
|
49
53
|
: path.join(__dirname, 'lib/safari/client.js');
|
|
50
54
|
|
|
51
55
|
|
|
52
56
|
/** @const */
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
const LIBRARY_DIR = (function() {
|
|
58
|
+
if (process.platform === 'darwin') {
|
|
59
|
+
return path.join('/Users', process.env['USER'], 'Library/Safari');
|
|
60
|
+
} else if (process.platform === 'win32') {
|
|
61
|
+
return path.join(process.env['APPDATA'], 'Apple Computer', 'Safari');
|
|
62
|
+
} else {
|
|
63
|
+
return '/dev/null';
|
|
64
|
+
}
|
|
65
|
+
})();
|
|
56
66
|
|
|
57
67
|
|
|
58
68
|
/** @const */
|
|
59
|
-
|
|
69
|
+
const SESSION_DATA_FILES = (function() {
|
|
60
70
|
if (process.platform === 'darwin') {
|
|
61
71
|
var libraryDir = path.join('/Users', process.env['USER'], 'Library');
|
|
62
72
|
return [
|
|
@@ -95,97 +105,95 @@ var Host;
|
|
|
95
105
|
/**
|
|
96
106
|
* A basic HTTP/WebSocket server used to communicate with the SafariDriver
|
|
97
107
|
* browser extension.
|
|
98
|
-
* @constructor
|
|
99
|
-
* @extends {events.EventEmitter}
|
|
100
108
|
*/
|
|
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);
|
|
109
|
+
class Server extends events.EventEmitter {
|
|
110
|
+
constructor() {
|
|
111
|
+
super();
|
|
112
|
+
var server = http.createServer(function(req, res) {
|
|
113
|
+
if (req.url === '/favicon.ico') {
|
|
114
|
+
res.writeHead(204);
|
|
115
|
+
res.end();
|
|
123
116
|
return;
|
|
124
117
|
}
|
|
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
|
-
|
|
134
|
-
var wss = new ws.Server({server: server});
|
|
135
|
-
wss.on('connection', this.emit.bind(this, 'connection'));
|
|
136
118
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
};
|
|
119
|
+
var query = url.parse(/** @type {string} */(req.url)).query || '';
|
|
120
|
+
if (query.indexOf('url=') == -1) {
|
|
121
|
+
var address = server.address()
|
|
122
|
+
var host = address.address + ':' + address.port;
|
|
123
|
+
res.writeHead(
|
|
124
|
+
302, {'Location': 'http://' + host + '?url=ws://' + host});
|
|
125
|
+
res.end();
|
|
126
|
+
}
|
|
153
127
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
128
|
+
fs.readFile(CLIENT_PATH, 'utf8', function(err, data) {
|
|
129
|
+
if (err) {
|
|
130
|
+
res.writeHead(500, {'Content-Type': 'text/plain'});
|
|
131
|
+
res.end(err.stack);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
var content = '<!DOCTYPE html><body><script>' + data + '</script>';
|
|
135
|
+
res.writeHead(200, {
|
|
136
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
137
|
+
'Content-Length': Buffer.byteLength(content, 'utf8'),
|
|
138
|
+
});
|
|
139
|
+
res.end(content);
|
|
140
|
+
});
|
|
162
141
|
});
|
|
163
|
-
};
|
|
164
142
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
|
|
143
|
+
var wss = new ws.Server({server: server});
|
|
144
|
+
wss.on('connection', this.emit.bind(this, 'connection'));
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Starts the server on a random port.
|
|
148
|
+
* @return {!promise.Promise<Host>} A promise that will resolve
|
|
149
|
+
* with the server host when it has fully started.
|
|
150
|
+
*/
|
|
151
|
+
this.start = function() {
|
|
152
|
+
if (server.address()) {
|
|
153
|
+
return promise.fulfilled(server.address());
|
|
154
|
+
}
|
|
155
|
+
return portprober.findFreePort('localhost').then(function(port) {
|
|
156
|
+
return promise.checkedNodeCall(
|
|
157
|
+
server.listen.bind(server, port, 'localhost'));
|
|
158
|
+
}).then(function() {
|
|
159
|
+
return server.address();
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Stops the server.
|
|
165
|
+
* @return {!promise.Promise} A promise that will resolve when
|
|
166
|
+
* the server has closed all connections.
|
|
167
|
+
*/
|
|
168
|
+
this.stop = function() {
|
|
169
|
+
return new promise.Promise(function(fulfill) {
|
|
170
|
+
server.close(fulfill);
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* @return {Host} This server's host info.
|
|
176
|
+
* @throws {Error} If the server is not running.
|
|
177
|
+
*/
|
|
178
|
+
this.address = function() {
|
|
179
|
+
var addr = server.address();
|
|
180
|
+
if (!addr) {
|
|
181
|
+
throw Error('There server is not running!');
|
|
182
|
+
}
|
|
183
|
+
return addr;
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
178
187
|
|
|
179
188
|
|
|
180
189
|
/**
|
|
181
|
-
* @return {!
|
|
190
|
+
* @return {!Promise<string>} A promise that will resolve with the path
|
|
182
191
|
* to Safari on the current system.
|
|
183
192
|
*/
|
|
184
193
|
function findSafariExecutable() {
|
|
185
194
|
switch (process.platform) {
|
|
186
195
|
case 'darwin':
|
|
187
|
-
return
|
|
188
|
-
'/Applications/Safari.app/Contents/MacOS/Safari');
|
|
196
|
+
return Promise.resolve('/Applications/Safari.app/Contents/MacOS/Safari');
|
|
189
197
|
|
|
190
198
|
case 'win32':
|
|
191
199
|
var files = [
|
|
@@ -204,7 +212,7 @@ function findSafariExecutable() {
|
|
|
204
212
|
});
|
|
205
213
|
|
|
206
214
|
default:
|
|
207
|
-
return
|
|
215
|
+
return Promise.reject(
|
|
208
216
|
Error('Safari is not supported on the current platform: ' +
|
|
209
217
|
process.platform));
|
|
210
218
|
}
|
|
@@ -212,16 +220,15 @@ function findSafariExecutable() {
|
|
|
212
220
|
|
|
213
221
|
|
|
214
222
|
/**
|
|
215
|
-
* @param {string}
|
|
216
|
-
* @return {!
|
|
217
|
-
*
|
|
218
|
-
* server.
|
|
223
|
+
* @param {string} serverUrl The URL to connect to.
|
|
224
|
+
* @return {!Promise<string>} A promise for the path to a file that Safari can
|
|
225
|
+
* open on start-up to trigger a new connection to the WebSocket server.
|
|
219
226
|
*/
|
|
220
|
-
function createConnectFile(
|
|
227
|
+
function createConnectFile(serverUrl) {
|
|
221
228
|
return io.tmpFile({postfix: '.html'}).then(function(f) {
|
|
222
229
|
var writeFile = promise.checkedNodeCall(fs.writeFile,
|
|
223
230
|
f,
|
|
224
|
-
'<!DOCTYPE html><script>window.location = "' +
|
|
231
|
+
'<!DOCTYPE html><script>window.location = "' + serverUrl + '";</script>',
|
|
225
232
|
{encoding: 'utf8'});
|
|
226
233
|
return writeFile.then(function() {
|
|
227
234
|
return f;
|
|
@@ -252,53 +259,69 @@ function cleanSession(desiredCapabilities) {
|
|
|
252
259
|
}
|
|
253
260
|
|
|
254
261
|
|
|
262
|
+
/** @return {string} . */
|
|
263
|
+
function getRandomString() {
|
|
264
|
+
let seed = Date.now();
|
|
265
|
+
return Math.floor(Math.random() * seed).toString(36)
|
|
266
|
+
+ Math.abs(Math.floor(Math.random() * seed) ^ Date.now()).toString(36);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
|
|
255
270
|
/**
|
|
256
|
-
* @
|
|
257
|
-
* @implements {webdriver.CommandExecutor}
|
|
271
|
+
* @implements {command.Executor}
|
|
258
272
|
*/
|
|
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;
|
|
273
|
+
class CommandExecutor {
|
|
274
|
+
constructor() {
|
|
275
|
+
this.server_ = null;
|
|
283
276
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
this.startSafari_(command).then(sendCommand, callback);
|
|
287
|
-
break;
|
|
277
|
+
/** @private {ws.WebSocket} */
|
|
278
|
+
this.socket_ = null;
|
|
288
279
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
}, callback);
|
|
293
|
-
break;
|
|
280
|
+
/** @private {promise.Promise.<!exec.Command>} */
|
|
281
|
+
this.safari_ = null;
|
|
282
|
+
}
|
|
294
283
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
284
|
+
/** @override */
|
|
285
|
+
execute(cmd) {
|
|
286
|
+
var self = this;
|
|
287
|
+
return new promise.Promise(function(fulfill, reject) {
|
|
288
|
+
var safariCommand = JSON.stringify({
|
|
289
|
+
'origin': 'webdriver',
|
|
290
|
+
'type': 'command',
|
|
291
|
+
'command': {
|
|
292
|
+
'id': getRandomString(),
|
|
293
|
+
'name': cmd.getName(),
|
|
294
|
+
'parameters': cmd.getParameters()
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
switch (cmd.getName()) {
|
|
299
|
+
case command.Name.NEW_SESSION:
|
|
300
|
+
self.startSafari_(cmd)
|
|
301
|
+
.then(() => self.sendCommand_(safariCommand))
|
|
302
|
+
.then(fulfill, reject);
|
|
303
|
+
break;
|
|
304
|
+
|
|
305
|
+
case command.Name.QUIT:
|
|
306
|
+
self.destroySession_()
|
|
307
|
+
.then(() => fulfill({status: 0, value: 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;
|
|
@@ -323,212 +346,198 @@ CommandExecutor.prototype.execute = function(command, callback) {
|
|
|
323
346
|
}
|
|
324
347
|
fulfill(data['response']);
|
|
325
348
|
});
|
|
326
|
-
|
|
327
|
-
}).then(function(value) {
|
|
328
|
-
callback(null, value);
|
|
329
|
-
}, callback);
|
|
349
|
+
});
|
|
330
350
|
}
|
|
331
|
-
};
|
|
332
351
|
|
|
352
|
+
/**
|
|
353
|
+
* @param {!command.Command} command .
|
|
354
|
+
* @private
|
|
355
|
+
*/
|
|
356
|
+
startSafari_(command) {
|
|
357
|
+
this.server_ = new Server();
|
|
358
|
+
|
|
359
|
+
this.safari_ = this.server_.start().then(function(address) {
|
|
360
|
+
var tasks = cleanSession(
|
|
361
|
+
/** @type {!Object} */(
|
|
362
|
+
command.getParameters()['desiredCapabilities']));
|
|
363
|
+
tasks.push(
|
|
364
|
+
findSafariExecutable(),
|
|
365
|
+
createConnectFile(
|
|
366
|
+
'http://' + address.address + ':' + address.port));
|
|
367
|
+
return promise.all(tasks).then(function(tasks) {
|
|
368
|
+
var exe = tasks[tasks.length - 2];
|
|
369
|
+
var html = tasks[tasks.length - 1];
|
|
370
|
+
return exec(exe, {args: [html]});
|
|
371
|
+
});
|
|
372
|
+
});
|
|
333
373
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
return exec(exe, {args: [html]});
|
|
374
|
+
var connected = promise.defer();
|
|
375
|
+
var self = this;
|
|
376
|
+
var start = Date.now();
|
|
377
|
+
var timer = setTimeout(function() {
|
|
378
|
+
connected.reject(Error(
|
|
379
|
+
'Failed to connect to the SafariDriver after ' + (Date.now() - start) +
|
|
380
|
+
' ms; Have you installed the latest extension from ' +
|
|
381
|
+
'http://selenium-release.storage.googleapis.com/index.html?'));
|
|
382
|
+
}, 10 * 1000);
|
|
383
|
+
this.server_.once('connection', function(socket) {
|
|
384
|
+
clearTimeout(timer);
|
|
385
|
+
self.socket_ = socket;
|
|
386
|
+
socket.once('close', function() {
|
|
387
|
+
self.socket_ = null;
|
|
388
|
+
});
|
|
389
|
+
connected.fulfill();
|
|
351
390
|
});
|
|
352
|
-
|
|
391
|
+
return connected.promise;
|
|
392
|
+
}
|
|
353
393
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
394
|
+
/**
|
|
395
|
+
* Destroys the active session by stopping the WebSocket server and killing the
|
|
396
|
+
* Safari subprocess.
|
|
397
|
+
* @private
|
|
398
|
+
*/
|
|
399
|
+
destroySession_() {
|
|
400
|
+
var tasks = [];
|
|
401
|
+
if (this.server_) {
|
|
402
|
+
tasks.push(this.server_.stop());
|
|
403
|
+
}
|
|
404
|
+
if (this.safari_) {
|
|
405
|
+
tasks.push(this.safari_.then(function(safari) {
|
|
406
|
+
safari.kill();
|
|
407
|
+
return safari.result();
|
|
408
|
+
}));
|
|
409
|
+
}
|
|
410
|
+
var self = this;
|
|
411
|
+
return promise.all(tasks).thenFinally(function() {
|
|
412
|
+
self.server_ = null;
|
|
367
413
|
self.socket_ = null;
|
|
414
|
+
self.safari_ = null;
|
|
368
415
|
});
|
|
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
|
-
}
|
|
385
|
-
if (this.safari_) {
|
|
386
|
-
tasks.push(this.safari_.then(function(safari) {
|
|
387
|
-
safari.kill();
|
|
388
|
-
return safari.result();
|
|
389
|
-
}));
|
|
390
416
|
}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
self.server_ = null;
|
|
394
|
-
self.socket_ = null;
|
|
395
|
-
self.safari_ = null;
|
|
396
|
-
});
|
|
397
|
-
};
|
|
417
|
+
}
|
|
418
|
+
|
|
398
419
|
|
|
399
420
|
|
|
400
421
|
/** @const */
|
|
401
|
-
|
|
422
|
+
const OPTIONS_CAPABILITY_KEY = 'safari.options';
|
|
402
423
|
|
|
403
424
|
|
|
404
425
|
|
|
405
426
|
/**
|
|
406
427
|
* Configuration options specific to the {@link Driver SafariDriver}.
|
|
407
|
-
* @constructor
|
|
408
|
-
* @extends {webdriver.Serializable}
|
|
409
428
|
*/
|
|
410
|
-
|
|
411
|
-
|
|
429
|
+
class Options {
|
|
430
|
+
constructor() {
|
|
431
|
+
/** @private {Object<string, *>} */
|
|
432
|
+
this.options_ = null;
|
|
412
433
|
|
|
413
|
-
|
|
414
|
-
|
|
434
|
+
/** @private {./lib/logging.Preferences} */
|
|
435
|
+
this.logPrefs_ = null;
|
|
436
|
+
}
|
|
415
437
|
|
|
416
|
-
/**
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
438
|
+
/**
|
|
439
|
+
* Extracts the SafariDriver specific options from the given capabilities
|
|
440
|
+
* object.
|
|
441
|
+
* @param {!Capabilities} capabilities The capabilities object.
|
|
442
|
+
* @return {!Options} The ChromeDriver options.
|
|
443
|
+
*/
|
|
444
|
+
static fromCapabilities(capabilities) {
|
|
445
|
+
var options = new Options();
|
|
446
|
+
|
|
447
|
+
var o = capabilities.get(OPTIONS_CAPABILITY_KEY);
|
|
448
|
+
if (o instanceof Options) {
|
|
449
|
+
options = o;
|
|
450
|
+
} else if (o) {
|
|
451
|
+
options.setCleanSession(o.cleanSession);
|
|
452
|
+
}
|
|
420
453
|
|
|
454
|
+
if (capabilities.has(Capability.LOGGING_PREFS)) {
|
|
455
|
+
options.setLoggingPrefs(capabilities.get(Capability.LOGGING_PREFS));
|
|
456
|
+
}
|
|
421
457
|
|
|
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);
|
|
458
|
+
return options;
|
|
436
459
|
}
|
|
437
460
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
461
|
+
/**
|
|
462
|
+
* Sets whether to force Safari to start with a clean session. Enabling this
|
|
463
|
+
* option will cause all global browser data to be deleted.
|
|
464
|
+
* @param {boolean} clean Whether to make sure the session has no cookies,
|
|
465
|
+
* cache entries, local storage, or databases.
|
|
466
|
+
* @return {!Options} A self reference.
|
|
467
|
+
*/
|
|
468
|
+
setCleanSession(clean) {
|
|
469
|
+
if (!this.options_) {
|
|
470
|
+
this.options_ = {};
|
|
471
|
+
}
|
|
472
|
+
this.options_['cleanSession'] = clean;
|
|
473
|
+
return this;
|
|
441
474
|
}
|
|
442
475
|
|
|
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_ = {};
|
|
476
|
+
/**
|
|
477
|
+
* Sets the logging preferences for the new session.
|
|
478
|
+
* @param {!./lib/logging.Preferences} prefs The logging preferences.
|
|
479
|
+
* @return {!Options} A self reference.
|
|
480
|
+
*/
|
|
481
|
+
setLoggingPrefs(prefs) {
|
|
482
|
+
this.logPrefs_ = prefs;
|
|
483
|
+
return this;
|
|
457
484
|
}
|
|
458
|
-
this.options_['cleanSession'] = clean;
|
|
459
|
-
return this;
|
|
460
|
-
};
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
/**
|
|
464
|
-
* Sets the logging preferences for the new session.
|
|
465
|
-
* @param {!webdriver.logging.Preferences} prefs The logging preferences.
|
|
466
|
-
* @return {!Options} A self reference.
|
|
467
|
-
*/
|
|
468
|
-
Options.prototype.setLoggingPrefs = function(prefs) {
|
|
469
|
-
this.logPrefs_ = prefs;
|
|
470
|
-
return this;
|
|
471
|
-
};
|
|
472
|
-
|
|
473
485
|
|
|
474
|
-
/**
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
486
|
+
/**
|
|
487
|
+
* Converts this options instance to a {@link Capabilities} object.
|
|
488
|
+
* @param {Capabilities=} opt_capabilities The capabilities to
|
|
489
|
+
* merge these options into, if any.
|
|
490
|
+
* @return {!Capabilities} The capabilities.
|
|
491
|
+
*/
|
|
492
|
+
toCapabilities(opt_capabilities) {
|
|
493
|
+
var caps = opt_capabilities || Capabilities.safari();
|
|
494
|
+
if (this.logPrefs_) {
|
|
495
|
+
caps.set(Capability.LOGGING_PREFS, this.logPrefs_);
|
|
496
|
+
}
|
|
497
|
+
if (this.options_) {
|
|
498
|
+
caps.set(OPTIONS_CAPABILITY_KEY, this);
|
|
499
|
+
}
|
|
500
|
+
return caps;
|
|
487
501
|
}
|
|
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
502
|
|
|
503
|
+
/**
|
|
504
|
+
* Converts this instance to its JSON wire protocol representation. Note this
|
|
505
|
+
* function is an implementation detail not intended for general use.
|
|
506
|
+
* @return {!Object<string, *>} The JSON wire protocol representation of this
|
|
507
|
+
* instance.
|
|
508
|
+
*/
|
|
509
|
+
[Symbols.serialize]() {
|
|
510
|
+
return this.options_ || {};
|
|
511
|
+
}
|
|
512
|
+
}
|
|
503
513
|
|
|
504
514
|
|
|
505
515
|
/**
|
|
506
516
|
* A WebDriver client for Safari. This class should never be instantiated
|
|
507
|
-
* directly; instead, use the {@
|
|
517
|
+
* directly; instead, use the {@linkplain ./builder.Builder Builder}:
|
|
508
518
|
*
|
|
509
519
|
* var driver = new Builder()
|
|
510
520
|
* .forBrowser('safari')
|
|
511
521
|
* .build();
|
|
512
522
|
*
|
|
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
523
|
*/
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
524
|
+
class Driver extends webdriver.WebDriver {
|
|
525
|
+
/**
|
|
526
|
+
* @param {(Options|Capabilities)=} opt_config The configuration
|
|
527
|
+
* options for the new session.
|
|
528
|
+
* @param {promise.ControlFlow=} opt_flow The control flow to create
|
|
529
|
+
* the driver under.
|
|
530
|
+
*/
|
|
531
|
+
constructor(opt_config, opt_flow) {
|
|
532
|
+
var executor = new CommandExecutor();
|
|
533
|
+
var caps =
|
|
534
|
+
opt_config instanceof Options ? opt_config.toCapabilities() :
|
|
535
|
+
(opt_config || Capabilities.safari());
|
|
536
|
+
|
|
537
|
+
var driver = webdriver.WebDriver.createSession(executor, caps, opt_flow);
|
|
538
|
+
super(driver.getSession(), executor, driver.controlFlow());
|
|
539
|
+
}
|
|
540
|
+
}
|
|
532
541
|
|
|
533
542
|
|
|
534
543
|
// Public API
|