selenium-webdriver 3.5.0 → 4.0.0-alpha.4
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 +246 -0
- package/LICENSE +1 -1
- package/NOTICE +1 -1
- package/README.md +40 -40
- package/chrome.js +118 -134
- package/edge.js +43 -117
- package/example/chrome_android.js +8 -9
- package/example/chrome_mobile_emulation.js +8 -9
- package/example/firefox_channels.js +23 -19
- package/example/google_search.js +3 -3
- package/example/google_search_test.js +38 -27
- package/example/{chrome_headless.js → headless.js} +15 -7
- package/example/logging.js +40 -7
- package/firefox.js +789 -0
- package/http/index.js +62 -9
- package/http/util.js +11 -6
- package/ie.js +83 -97
- package/index.js +198 -114
- package/io/exec.js +29 -15
- package/io/index.js +1 -1
- package/io/zip.js +1 -1
- package/lib/actions.js +68 -63
- package/lib/atoms/get-attribute.js +86 -0
- package/lib/atoms/is-displayed.js +76 -76
- package/lib/by.js +7 -4
- package/lib/capabilities.js +310 -210
- package/lib/command.js +27 -51
- package/lib/error.js +100 -41
- package/lib/http.js +161 -120
- package/lib/input.js +1044 -8
- package/lib/logging.js +1 -5
- package/lib/promise.js +222 -3331
- package/lib/proxy.js +134 -39
- package/lib/session.js +2 -2
- package/lib/symbols.js +0 -0
- package/lib/until.js +1 -1
- package/lib/webdriver.js +717 -953
- package/net/index.js +21 -25
- package/net/portprober.js +51 -68
- package/package.json +17 -12
- package/proxy.js +0 -0
- package/remote/index.js +63 -44
- package/safari.js +41 -128
- package/testing/index.js +386 -315
- package/.npmignore +0 -2
- package/example/async_await_test.js +0 -68
- package/example/google_search_generator.js +0 -50
- package/example/parallel_flows.js +0 -54
- package/firefox/binary.js +0 -344
- package/firefox/extension.js +0 -224
- package/firefox/index.js +0 -626
- package/firefox/profile.js +0 -394
- package/lib/README +0 -5
- package/lib/atoms/getAttribute.js +0 -9
- package/lib/devmode.js +0 -34
- package/lib/events.js +0 -210
- package/lib/firefox/webdriver.json +0 -70
- package/lib/test/build.js +0 -151
- package/lib/test/data/ClickTest_testClicksASurroundingStrongTag.html +0 -11
- package/lib/test/data/Page.aspx +0 -17
- package/lib/test/data/Page.aspx.cs +0 -22
- package/lib/test/data/Redirect.aspx +0 -11
- package/lib/test/data/Redirect.aspx.cs +0 -9
- package/lib/test/data/Settings.StyleCop +0 -759
- package/lib/test/data/Web.Config +0 -59
- package/lib/test/data/actualXhtmlPage.xhtml +0 -14
- package/lib/test/data/ajaxy_page.html +0 -81
- package/lib/test/data/alerts.html +0 -85
- package/lib/test/data/banner.gif +0 -0
- package/lib/test/data/beach.jpg +0 -0
- package/lib/test/data/blank.html +0 -1
- package/lib/test/data/bodyTypingTest.html +0 -41
- package/lib/test/data/booleanAttributes.html +0 -19
- package/lib/test/data/child/childPage.html +0 -8
- package/lib/test/data/child/grandchild/grandchildPage.html +0 -8
- package/lib/test/data/clickEventPage.html +0 -26
- package/lib/test/data/click_frames.html +0 -10
- package/lib/test/data/click_jacker.html +0 -38
- package/lib/test/data/click_out_of_bounds.html +0 -23
- package/lib/test/data/click_out_of_bounds_overflow.html +0 -85
- package/lib/test/data/click_rtl.html +0 -19
- package/lib/test/data/click_source.html +0 -18
- package/lib/test/data/click_tests/click_iframe.html +0 -6
- package/lib/test/data/click_tests/click_in_iframe.html +0 -8
- package/lib/test/data/click_tests/disabled_element.html +0 -12
- package/lib/test/data/click_tests/disappearing_element.html +0 -62
- package/lib/test/data/click_tests/google_map.html +0 -15
- package/lib/test/data/click_tests/google_map.png +0 -0
- package/lib/test/data/click_tests/html5_submit_buttons.html +0 -16
- package/lib/test/data/click_tests/issue5237.html +0 -9
- package/lib/test/data/click_tests/issue5237_frame.html +0 -1
- package/lib/test/data/click_tests/issue5237_target.html +0 -10
- package/lib/test/data/click_tests/link_that_wraps.html +0 -11
- package/lib/test/data/click_tests/mapped_page1.html +0 -9
- package/lib/test/data/click_tests/mapped_page2.html +0 -9
- package/lib/test/data/click_tests/mapped_page3.html +0 -9
- package/lib/test/data/click_tests/overlapping_elements.html +0 -70
- package/lib/test/data/click_tests/partially_overlapping_elements.html +0 -124
- package/lib/test/data/click_tests/span_that_wraps.html +0 -11
- package/lib/test/data/click_tests/submitted_page.html +0 -9
- package/lib/test/data/click_tests/wrapped_overlapping_elements.html +0 -13
- package/lib/test/data/click_too_big.html +0 -10
- package/lib/test/data/click_too_big_in_frame.html +0 -11
- package/lib/test/data/clicks.html +0 -35
- package/lib/test/data/closeable_window.html +0 -8
- package/lib/test/data/cn-test.html +0 -156
- package/lib/test/data/colorPage.html +0 -20
- package/lib/test/data/cookies.html +0 -30
- package/lib/test/data/coordinates_tests/element_in_frame.html +0 -9
- package/lib/test/data/coordinates_tests/element_in_nested_frame.html +0 -9
- package/lib/test/data/coordinates_tests/page_with_element_out_of_view.html +0 -11
- package/lib/test/data/coordinates_tests/page_with_empty_element.html +0 -10
- package/lib/test/data/coordinates_tests/page_with_fixed_element.html +0 -12
- package/lib/test/data/coordinates_tests/page_with_hidden_element.html +0 -10
- package/lib/test/data/coordinates_tests/page_with_invisible_element.html +0 -10
- package/lib/test/data/coordinates_tests/page_with_transparent_element.html +0 -10
- package/lib/test/data/coordinates_tests/simple_page.html +0 -10
- package/lib/test/data/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
- package/lib/test/data/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
- package/lib/test/data/css/ui-lightness/jquery-ui-1.8.10.custom.css +0 -573
- package/lib/test/data/cssTransform.html +0 -61
- package/lib/test/data/cssTransform2.html +0 -20
- package/lib/test/data/document_write_in_onload.html +0 -13
- package/lib/test/data/dragAndDropInsideScrolledDiv.html +0 -67
- package/lib/test/data/dragAndDropTest.html +0 -102
- package/lib/test/data/dragDropOverflow.html +0 -104
- package/lib/test/data/draggableLists.html +0 -67
- package/lib/test/data/droppableItems.html +0 -65
- package/lib/test/data/dynamic.html +0 -39
- package/lib/test/data/dynamicallyModifiedPage.html +0 -42
- package/lib/test/data/errors.html +0 -15
- package/lib/test/data/firefox/jetpack-sample.xpi +0 -0
- package/lib/test/data/firefox/sample.xpi +0 -0
- package/lib/test/data/firefox/webextension.xpi +0 -0
- package/lib/test/data/fixedFooterNoScroll.html +0 -13
- package/lib/test/data/fixedFooterNoScrollQuirksMode.html +0 -12
- package/lib/test/data/formPage.html +0 -175
- package/lib/test/data/formSelectionPage.html +0 -46
- package/lib/test/data/form_handling_js_submit.html +0 -30
- package/lib/test/data/framePage3.html +0 -7
- package/lib/test/data/frameScrollChild.html +0 -26
- package/lib/test/data/frameScrollPage.html +0 -14
- package/lib/test/data/frameScrollParent.html +0 -11
- package/lib/test/data/frameWithAnimals.html +0 -11
- package/lib/test/data/frame_switching_tests/bug4876.html +0 -9
- package/lib/test/data/frame_switching_tests/bug4876_iframe.html +0 -9
- package/lib/test/data/frame_switching_tests/deletingFrame.html +0 -29
- package/lib/test/data/frame_switching_tests/deletingFrame_iframe.html +0 -8
- package/lib/test/data/frame_switching_tests/deletingFrame_iframe2.html +0 -7
- package/lib/test/data/frameset.html +0 -14
- package/lib/test/data/framesetPage2.html +0 -7
- package/lib/test/data/framesetPage3.html +0 -4
- package/lib/test/data/globalscope.html +0 -15
- package/lib/test/data/hidden.html +0 -5
- package/lib/test/data/hidden_partially.html +0 -45
- package/lib/test/data/html5/blue.jpg +0 -0
- package/lib/test/data/html5/database.js +0 -84
- package/lib/test/data/html5/geolocation.js +0 -18
- package/lib/test/data/html5/green.jpg +0 -0
- package/lib/test/data/html5/red.jpg +0 -0
- package/lib/test/data/html5/status.html +0 -1
- package/lib/test/data/html5/test.appcache +0 -11
- package/lib/test/data/html5/yellow.jpg +0 -0
- package/lib/test/data/html5Page.html +0 -32
- package/lib/test/data/icon.gif +0 -0
- package/lib/test/data/idElements.html +0 -2
- package/lib/test/data/iframeAtBottom.html +0 -15
- package/lib/test/data/iframeWithAlert.html +0 -1
- package/lib/test/data/iframeWithIframe.html +0 -1
- package/lib/test/data/iframes.html +0 -11
- package/lib/test/data/injectableContent.html +0 -22
- package/lib/test/data/javascriptEnhancedForm.html +0 -30
- package/lib/test/data/javascriptPage.html +0 -285
- package/lib/test/data/jquery-1.3.2.js +0 -4376
- package/lib/test/data/js/jquery-1.4.4.min.js +0 -167
- package/lib/test/data/js/jquery-ui-1.8.10.custom.min.js +0 -782
- package/lib/test/data/js/skins/lightgray/content.inline.min.css +0 -1
- package/lib/test/data/js/skins/lightgray/content.min.css +0 -1
- package/lib/test/data/js/skins/lightgray/fonts/readme.md +0 -1
- package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.dev.svg +0 -175
- package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.eot +0 -0
- package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.svg +0 -62
- package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.ttf +0 -0
- package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.woff +0 -0
- package/lib/test/data/js/skins/lightgray/fonts/tinymce.dev.svg +0 -153
- package/lib/test/data/js/skins/lightgray/fonts/tinymce.eot +0 -0
- package/lib/test/data/js/skins/lightgray/fonts/tinymce.svg +0 -63
- package/lib/test/data/js/skins/lightgray/fonts/tinymce.ttf +0 -0
- package/lib/test/data/js/skins/lightgray/fonts/tinymce.woff +0 -0
- package/lib/test/data/js/skins/lightgray/img/anchor.gif +0 -0
- package/lib/test/data/js/skins/lightgray/img/loader.gif +0 -0
- package/lib/test/data/js/skins/lightgray/img/object.gif +0 -0
- package/lib/test/data/js/skins/lightgray/img/trans.gif +0 -0
- package/lib/test/data/js/skins/lightgray/skin.ie7.min.css +0 -1
- package/lib/test/data/js/skins/lightgray/skin.min.css +0 -1
- package/lib/test/data/js/themes/modern/theme.min.js +0 -1
- package/lib/test/data/js/tinymce.min.js +0 -10
- package/lib/test/data/key_logger.html +0 -34
- package/lib/test/data/key_tests/remove_on_keypress.html +0 -36
- package/lib/test/data/keyboard_shortcut.html +0 -36
- package/lib/test/data/linked_image.html +0 -16
- package/lib/test/data/locators_tests/boolean_attribute_selected.html +0 -13
- package/lib/test/data/locators_tests/boolean_attribute_selected_html4.html +0 -13
- package/lib/test/data/longContentPage.html +0 -55
- package/lib/test/data/macbeth.html +0 -5255
- package/lib/test/data/map.png +0 -0
- package/lib/test/data/map_visibility.html +0 -8
- package/lib/test/data/markerTransparent.png +0 -0
- package/lib/test/data/messages.html +0 -15
- package/lib/test/data/meta-redirect.html +0 -11
- package/lib/test/data/missedJsReference.html +0 -11
- package/lib/test/data/modal_dialogs/modal_1.html +0 -21
- package/lib/test/data/modal_dialogs/modal_2.html +0 -21
- package/lib/test/data/modal_dialogs/modal_3.html +0 -15
- package/lib/test/data/modal_dialogs/modalindex.html +0 -21
- package/lib/test/data/mouseOver.html +0 -17
- package/lib/test/data/mousePositionTracker.html +0 -33
- package/lib/test/data/nestedElements.html +0 -164
- package/lib/test/data/overflow/x_auto_y_auto.html +0 -30
- package/lib/test/data/overflow/x_auto_y_hidden.html +0 -30
- package/lib/test/data/overflow/x_auto_y_scroll.html +0 -30
- package/lib/test/data/overflow/x_hidden_y_auto.html +0 -30
- package/lib/test/data/overflow/x_hidden_y_hidden.html +0 -30
- package/lib/test/data/overflow/x_hidden_y_scroll.html +0 -30
- package/lib/test/data/overflow/x_scroll_y_auto.html +0 -30
- package/lib/test/data/overflow/x_scroll_y_hidden.html +0 -30
- package/lib/test/data/overflow/x_scroll_y_scroll.html +0 -30
- package/lib/test/data/overflow-body.html +0 -15
- package/lib/test/data/pageWithOnBeforeUnloadMessage.html +0 -20
- package/lib/test/data/pageWithOnLoad.html +0 -6
- package/lib/test/data/pageWithOnUnload.html +0 -6
- package/lib/test/data/page_with_link_to_slow_loading_page.html +0 -6
- package/lib/test/data/plain.txt +0 -1
- package/lib/test/data/proxy/page1.html +0 -20
- package/lib/test/data/proxy/page2.html +0 -24
- package/lib/test/data/proxy/page3.html +0 -5
- package/lib/test/data/readOnlyPage.html +0 -24
- package/lib/test/data/rectangles.html +0 -40
- package/lib/test/data/resultPage.html +0 -25
- package/lib/test/data/rich_text.html +0 -161
- package/lib/test/data/safari/frames_benchmark.html +0 -31
- package/lib/test/data/screen/screen.css +0 -19
- package/lib/test/data/screen/screen.html +0 -72
- package/lib/test/data/screen/screen.js +0 -7
- package/lib/test/data/screen/screen_frame1.html +0 -72
- package/lib/test/data/screen/screen_frame2.html +0 -72
- package/lib/test/data/screen/screen_frames.html +0 -11
- package/lib/test/data/screen/screen_iframes.html +0 -12
- package/lib/test/data/screen/screen_too_long.html +0 -68
- package/lib/test/data/screen/screen_x_long.html +0 -72
- package/lib/test/data/screen/screen_x_too_long.html +0 -72
- package/lib/test/data/screen/screen_y_long.html +0 -72
- package/lib/test/data/screen/screen_y_too_long.html +0 -72
- package/lib/test/data/scroll.html +0 -27
- package/lib/test/data/scroll2.html +0 -21
- package/lib/test/data/scroll3.html +0 -8
- package/lib/test/data/scroll4.html +0 -7
- package/lib/test/data/scroll5.html +0 -18
- package/lib/test/data/scrolling_tests/frame_with_height_above_200.html +0 -26
- package/lib/test/data/scrolling_tests/frame_with_height_above_2000.html +0 -26
- package/lib/test/data/scrolling_tests/frame_with_nested_scrolling_frame.html +0 -11
- package/lib/test/data/scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html +0 -12
- package/lib/test/data/scrolling_tests/frame_with_small_height.html +0 -10
- package/lib/test/data/scrolling_tests/page_with_double_overflow_auto.html +0 -19
- package/lib/test/data/scrolling_tests/page_with_frame_out_of_view.html +0 -12
- package/lib/test/data/scrolling_tests/page_with_nested_scrolling_frames.html +0 -11
- package/lib/test/data/scrolling_tests/page_with_nested_scrolling_frames_out_of_view.html +0 -12
- package/lib/test/data/scrolling_tests/page_with_non_scrolling_frame.html +0 -11
- package/lib/test/data/scrolling_tests/page_with_scrolling_frame.html +0 -11
- package/lib/test/data/scrolling_tests/page_with_scrolling_frame_out_of_view.html +0 -12
- package/lib/test/data/scrolling_tests/page_with_tall_frame.html +0 -11
- package/lib/test/data/scrolling_tests/page_with_y_overflow_auto.html +0 -14
- package/lib/test/data/scrolling_tests/target_page.html +0 -9
- package/lib/test/data/selectPage.html +0 -58
- package/lib/test/data/selectableItems.html +0 -65
- package/lib/test/data/sessionCookie.html +0 -21
- package/lib/test/data/sessionCookieDest.html +0 -34
- package/lib/test/data/simple.xml +0 -5
- package/lib/test/data/simpleTest.html +0 -98
- package/lib/test/data/single_text_input.html +0 -12
- package/lib/test/data/slowLoadingAlert.html +0 -10
- package/lib/test/data/slowLoadingResourcePage.html +0 -12
- package/lib/test/data/slow_loading_iframes.html +0 -14
- package/lib/test/data/styledPage.html +0 -28
- package/lib/test/data/svgPiechart.xhtml +0 -81
- package/lib/test/data/svgTest.svg +0 -4
- package/lib/test/data/tables.html +0 -36
- package/lib/test/data/tinymce.html +0 -10
- package/lib/test/data/transformable.xml +0 -11
- package/lib/test/data/transformable.xsl +0 -37
- package/lib/test/data/transparentUpload.html +0 -70
- package/lib/test/data/underscore.html +0 -9
- package/lib/test/data/unicode_ltr.html +0 -8
- package/lib/test/data/upload.html +0 -45
- package/lib/test/data/userDefinedProperty.html +0 -8
- package/lib/test/data/veryLargeCanvas.html +0 -81
- package/lib/test/data/visibility-css.html +0 -21
- package/lib/test/data/win32frameset.html +0 -8
- package/lib/test/data/window_switching_tests/page_with_frame.html +0 -12
- package/lib/test/data/window_switching_tests/simple_page.html +0 -9
- package/lib/test/data/xhtmlFormPage.xhtml +0 -17
- package/lib/test/data/xhtmlTest.html +0 -76
- package/lib/test/fileserver.js +0 -321
- package/lib/test/httpserver.js +0 -120
- package/lib/test/index.js +0 -270
- package/lib/test/promise.js +0 -79
- package/lib/test/resources.js +0 -44
- package/opera.js +0 -405
- package/phantomjs.js +0 -282
- package/test/actions_test.js +0 -52
- package/test/chrome/options_test.js +0 -227
- package/test/chrome/service_test.js +0 -45
- package/test/cookie_test.js +0 -214
- package/test/element_finding_test.js +0 -426
- package/test/execute_script_test.js +0 -350
- package/test/fingerprint_test.js +0 -62
- package/test/firefox/extension_test.js +0 -120
- package/test/firefox/firefox_test.js +0 -261
- package/test/firefox/profile_test.js +0 -140
- package/test/http/http_test.js +0 -223
- package/test/http/util_test.js +0 -178
- package/test/io/io_test.js +0 -360
- package/test/io/zip_test.js +0 -128
- package/test/lib/by_test.js +0 -160
- package/test/lib/capabilities_test.js +0 -111
- package/test/lib/error_test.js +0 -305
- package/test/lib/events_test.js +0 -177
- package/test/lib/http_test.js +0 -696
- package/test/lib/logging_test.js +0 -272
- package/test/lib/promise_aplus_test.js +0 -78
- package/test/lib/promise_error_test.js +0 -884
- package/test/lib/promise_flow_test.js +0 -2288
- package/test/lib/promise_generator_test.js +0 -310
- package/test/lib/promise_test.js +0 -1109
- package/test/lib/testutil.js +0 -90
- package/test/lib/until_test.js +0 -478
- package/test/lib/webdriver_test.js +0 -2311
- package/test/logging_test.js +0 -167
- package/test/net/index_test.js +0 -60
- package/test/net/portprober_test.js +0 -128
- package/test/page_loading_test.js +0 -166
- package/test/phantomjs/execute_phantomjs_test.js +0 -59
- package/test/proxy_test.js +0 -180
- package/test/rect_test.js +0 -60
- package/test/remote_test.js +0 -117
- package/test/safari_test.js +0 -108
- package/test/session_test.js +0 -99
- package/test/stale_element_test.js +0 -63
- package/test/tag_name_test.js +0 -36
- package/test/testing/assert_test.js +0 -373
- package/test/testing/index_test.js +0 -224
- package/test/upload_test.js +0 -86
- package/test/window_test.js +0 -161
- package/testing/assert.js +0 -378
package/http/index.js
CHANGED
|
@@ -59,6 +59,15 @@ function getRequestOptions(aUrl) {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
|
|
62
|
+
/** @const {string} */
|
|
63
|
+
const USER_AGENT = (function() {
|
|
64
|
+
const version = require('../package.json').version;
|
|
65
|
+
const platform =
|
|
66
|
+
({'darwin': 'mac', 'win32': 'windows'}[process.platform]) || 'linux';
|
|
67
|
+
return `selenium/${version} (js ${platform})`;
|
|
68
|
+
})();
|
|
69
|
+
|
|
70
|
+
|
|
62
71
|
/**
|
|
63
72
|
* A basic HTTP client used to send messages to a remote end.
|
|
64
73
|
*
|
|
@@ -93,10 +102,14 @@ class HttpClient {
|
|
|
93
102
|
let data;
|
|
94
103
|
|
|
95
104
|
let headers = {};
|
|
96
|
-
httpRequest.headers.forEach(function(value, name) {
|
|
97
|
-
headers[name] = value;
|
|
98
|
-
});
|
|
99
105
|
|
|
106
|
+
if (httpRequest.headers) {
|
|
107
|
+
httpRequest.headers.forEach(function(value, name) {
|
|
108
|
+
headers[name] = value;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
headers['User-Agent'] = USER_AGENT;
|
|
100
113
|
headers['Content-Length'] = 0;
|
|
101
114
|
if (httpRequest.method == 'POST' || httpRequest.method == 'PUT') {
|
|
102
115
|
data = JSON.stringify(httpRequest.data);
|
|
@@ -144,8 +157,9 @@ class HttpClient {
|
|
|
144
157
|
* @param {function(!Error)} onError The function to call if the request fails.
|
|
145
158
|
* @param {?string=} opt_data The data to send with the request.
|
|
146
159
|
* @param {?RequestOptions=} opt_proxy The proxy server to use for the request.
|
|
160
|
+
* @param {number=} opt_retries The current number of retries.
|
|
147
161
|
*/
|
|
148
|
-
function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
|
|
162
|
+
function sendRequest(options, onOk, onError, opt_data, opt_proxy, opt_retries) {
|
|
149
163
|
var hostname = options.hostname;
|
|
150
164
|
var port = options.port;
|
|
151
165
|
|
|
@@ -161,7 +175,7 @@ function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
|
|
|
161
175
|
// An HTTP/1.1 proxy MUST ensure that any request message it forwards does
|
|
162
176
|
// contain an appropriate Host header field that identifies the service
|
|
163
177
|
// being requested by the proxy.
|
|
164
|
-
let targetHost = options.hostname
|
|
178
|
+
let targetHost = options.hostname;
|
|
165
179
|
if (options.port) {
|
|
166
180
|
targetHost += ':' + options.port;
|
|
167
181
|
}
|
|
@@ -208,7 +222,8 @@ function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
|
|
|
208
222
|
search: location.search,
|
|
209
223
|
hash: location.hash,
|
|
210
224
|
headers: {
|
|
211
|
-
'Accept': 'application/json; charset=utf-8'
|
|
225
|
+
'Accept': 'application/json; charset=utf-8',
|
|
226
|
+
'User-Agent': USER_AGENT,
|
|
212
227
|
}
|
|
213
228
|
}, onOk, onError, undefined, opt_proxy);
|
|
214
229
|
return;
|
|
@@ -220,15 +235,20 @@ function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
|
|
|
220
235
|
var resp = new httpLib.Response(
|
|
221
236
|
/** @type {number} */(response.statusCode),
|
|
222
237
|
/** @type {!Object<string>} */(response.headers),
|
|
223
|
-
body.
|
|
238
|
+
Buffer.concat(body).toString('utf8').replace(/\0/g, ''));
|
|
224
239
|
onOk(resp);
|
|
225
240
|
});
|
|
226
241
|
});
|
|
227
242
|
|
|
228
243
|
request.on('error', function(e) {
|
|
229
|
-
if (
|
|
244
|
+
if (typeof opt_retries === 'undefined') {
|
|
245
|
+
opt_retries = 0;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (shouldRetryRequest(opt_retries, e)) {
|
|
249
|
+
opt_retries += 1;
|
|
230
250
|
setTimeout(function() {
|
|
231
|
-
sendRequest(options, onOk, onError, opt_data, opt_proxy);
|
|
251
|
+
sendRequest(options, onOk, onError, opt_data, opt_proxy, opt_retries);
|
|
232
252
|
}, 15);
|
|
233
253
|
} else {
|
|
234
254
|
var message = e.message;
|
|
@@ -247,8 +267,41 @@ function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
|
|
|
247
267
|
}
|
|
248
268
|
|
|
249
269
|
|
|
270
|
+
const MAX_RETRIES = 3;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* A retry is sometimes needed on Windows where we may quickly run out of
|
|
274
|
+
* ephemeral ports. A more robust solution is bumping the MaxUserPort setting
|
|
275
|
+
* as described here: http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
|
|
276
|
+
*
|
|
277
|
+
* @param {!number} retries
|
|
278
|
+
* @param {!Error} err
|
|
279
|
+
* @return {boolean}
|
|
280
|
+
*/
|
|
281
|
+
function shouldRetryRequest(retries, err) {
|
|
282
|
+
return retries < MAX_RETRIES && isRetryableNetworkError(err);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* @param {!Error} err
|
|
287
|
+
* @return {boolean}
|
|
288
|
+
*/
|
|
289
|
+
function isRetryableNetworkError(err) {
|
|
290
|
+
if (err && err.code) {
|
|
291
|
+
return err.code === 'ECONNABORTED' ||
|
|
292
|
+
err.code === 'ECONNRESET' ||
|
|
293
|
+
err.code === 'ECONNREFUSED' ||
|
|
294
|
+
err.code === 'EADDRINUSE' ||
|
|
295
|
+
err.code === 'EPIPE';
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
|
|
250
302
|
// PUBLIC API
|
|
251
303
|
|
|
304
|
+
exports.Agent = http.Agent;
|
|
252
305
|
exports.Executor = httpLib.Executor;
|
|
253
306
|
exports.HttpClient = HttpClient;
|
|
254
307
|
exports.Request = httpLib.Request;
|
package/http/util.js
CHANGED
|
@@ -26,8 +26,7 @@ const Executor = require('./index').Executor,
|
|
|
26
26
|
HttpRequest = require('./index').Request,
|
|
27
27
|
Command = require('../lib/command').Command,
|
|
28
28
|
CommandName = require('../lib/command').Name,
|
|
29
|
-
error = require('../lib/error')
|
|
30
|
-
promise = require('../lib/promise');
|
|
29
|
+
error = require('../lib/error');
|
|
31
30
|
|
|
32
31
|
|
|
33
32
|
|
|
@@ -45,6 +44,9 @@ function getStatus(url) {
|
|
|
45
44
|
}
|
|
46
45
|
|
|
47
46
|
|
|
47
|
+
class CancellationError {}
|
|
48
|
+
|
|
49
|
+
|
|
48
50
|
// PUBLIC API
|
|
49
51
|
|
|
50
52
|
|
|
@@ -57,13 +59,16 @@ function getStatus(url) {
|
|
|
57
59
|
exports.getStatus = getStatus;
|
|
58
60
|
|
|
59
61
|
|
|
62
|
+
exports.CancellationError = CancellationError;
|
|
63
|
+
|
|
64
|
+
|
|
60
65
|
/**
|
|
61
66
|
* Waits for a WebDriver server to be healthy and accepting requests.
|
|
62
67
|
* @param {string} url Base URL of the server to query.
|
|
63
68
|
* @param {number} timeout How long to wait for the server.
|
|
64
69
|
* @param {Promise=} opt_cancelToken A promise used as a cancellation signal:
|
|
65
70
|
* if resolved before the server is ready, the wait will be terminated
|
|
66
|
-
* early with a {@link
|
|
71
|
+
* early with a {@link CancellationError}.
|
|
67
72
|
* @return {!Promise} A promise that will resolve when the server is ready, or
|
|
68
73
|
* if the wait is cancelled.
|
|
69
74
|
*/
|
|
@@ -82,7 +87,7 @@ exports.waitForServer = function(url, timeout, opt_cancelToken) {
|
|
|
82
87
|
};
|
|
83
88
|
|
|
84
89
|
if (opt_cancelToken) {
|
|
85
|
-
opt_cancelToken.then(_ => reject(new
|
|
90
|
+
opt_cancelToken.then(_ => reject(new CancellationError));
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
checkServerStatus();
|
|
@@ -119,7 +124,7 @@ exports.waitForServer = function(url, timeout, opt_cancelToken) {
|
|
|
119
124
|
* @param {number} timeout How long to wait, in milliseconds.
|
|
120
125
|
* @param {Promise=} opt_cancelToken A promise used as a cancellation signal:
|
|
121
126
|
* if resolved before the a 2xx response is received, the wait will be
|
|
122
|
-
* terminated early with a {@link
|
|
127
|
+
* terminated early with a {@link CancellationError}.
|
|
123
128
|
* @return {!Promise} A promise that will resolve when a 2xx is received from
|
|
124
129
|
* the given URL, or if the wait is cancelled.
|
|
125
130
|
*/
|
|
@@ -140,7 +145,7 @@ exports.waitForUrl = function(url, timeout, opt_cancelToken) {
|
|
|
140
145
|
};
|
|
141
146
|
|
|
142
147
|
if (opt_cancelToken) {
|
|
143
|
-
opt_cancelToken.then(_ => reject(new
|
|
148
|
+
opt_cancelToken.then(_ => reject(new CancellationError));
|
|
144
149
|
}
|
|
145
150
|
|
|
146
151
|
testUrl();
|
package/ie.js
CHANGED
|
@@ -27,16 +27,16 @@
|
|
|
27
27
|
|
|
28
28
|
'use strict';
|
|
29
29
|
|
|
30
|
-
const fs = require('fs')
|
|
31
|
-
|
|
30
|
+
const fs = require('fs');
|
|
31
|
+
const util = require('util');
|
|
32
32
|
|
|
33
|
-
const http = require('./http')
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
const http = require('./http');
|
|
34
|
+
const io = require('./io');
|
|
35
|
+
const portprober = require('./net/portprober');
|
|
36
|
+
const promise = require('./lib/promise');
|
|
37
|
+
const remote = require('./remote');
|
|
38
|
+
const webdriver = require('./lib/webdriver');
|
|
39
|
+
const {Browser, Capabilities, Capability} = require('./lib/capabilities');
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
const IEDRIVER_EXE = 'IEDriverServer.exe';
|
|
@@ -86,37 +86,14 @@ const Key = {
|
|
|
86
86
|
/**
|
|
87
87
|
* Class for managing IEDriver specific options.
|
|
88
88
|
*/
|
|
89
|
-
class Options {
|
|
90
|
-
constructor() {
|
|
91
|
-
/** @private {!Object<(boolean|number|string|!Array<string>)>} */
|
|
92
|
-
this.options_ = {};
|
|
93
|
-
|
|
94
|
-
/** @private {(capabilities.ProxyConfig|null)} */
|
|
95
|
-
this.proxy_ = null;
|
|
96
|
-
}
|
|
97
|
-
|
|
89
|
+
class Options extends Capabilities {
|
|
98
90
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* @param {!capabilities.Capabilities} caps The capabilities object.
|
|
102
|
-
* @return {!Options} The IEDriver options.
|
|
91
|
+
* @param {(Capabilities|Map<string, ?>|Object)=} other Another set of
|
|
92
|
+
* capabilities to initialize this instance from.
|
|
103
93
|
*/
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
Object.keys(Key).forEach(function(key) {
|
|
109
|
-
key = Key[key];
|
|
110
|
-
if (caps.has(key)) {
|
|
111
|
-
map[key] = caps.get(key);
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
if (caps.has(capabilities.Capability.PROXY)) {
|
|
116
|
-
options.setProxy(caps.get(capabilities.Capability.PROXY));
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return options;
|
|
94
|
+
constructor(other = undefined) {
|
|
95
|
+
super(other);
|
|
96
|
+
this.setBrowserName(Browser.IE);
|
|
120
97
|
}
|
|
121
98
|
|
|
122
99
|
/**
|
|
@@ -132,7 +109,7 @@ class Options {
|
|
|
132
109
|
* @return {!Options} A self reference.
|
|
133
110
|
*/
|
|
134
111
|
introduceFlakinessByIgnoringProtectedModeSettings(ignoreSettings) {
|
|
135
|
-
this.
|
|
112
|
+
this.set(Key.IGNORE_PROTECTED_MODE_SETTINGS, !!ignoreSettings);
|
|
136
113
|
return this;
|
|
137
114
|
}
|
|
138
115
|
|
|
@@ -144,7 +121,7 @@ class Options {
|
|
|
144
121
|
* @return {!Options} A self reference.
|
|
145
122
|
*/
|
|
146
123
|
ignoreZoomSetting(ignore) {
|
|
147
|
-
this.
|
|
124
|
+
this.set(Key.IGNORE_ZOOM_SETTING, !!ignore);
|
|
148
125
|
return this;
|
|
149
126
|
}
|
|
150
127
|
|
|
@@ -159,7 +136,7 @@ class Options {
|
|
|
159
136
|
* @return {!Options} A self reference.
|
|
160
137
|
*/
|
|
161
138
|
initialBrowserUrl(url) {
|
|
162
|
-
this.
|
|
139
|
+
this.set(Key.INITIAL_BROWSER_URL, url);
|
|
163
140
|
return this;
|
|
164
141
|
}
|
|
165
142
|
|
|
@@ -172,7 +149,7 @@ class Options {
|
|
|
172
149
|
* @return {!Options} A self reference.
|
|
173
150
|
*/
|
|
174
151
|
enablePersistentHover(enable) {
|
|
175
|
-
this.
|
|
152
|
+
this.set(Key.ENABLE_PERSISTENT_HOVER, !!enable);
|
|
176
153
|
return this;
|
|
177
154
|
}
|
|
178
155
|
|
|
@@ -186,7 +163,7 @@ class Options {
|
|
|
186
163
|
* @return {!Options} A self reference.
|
|
187
164
|
*/
|
|
188
165
|
enableElementCacheCleanup(enable) {
|
|
189
|
-
this.
|
|
166
|
+
this.set(Key.ENABLE_ELEMENT_CACHE_CLEANUP, !!enable);
|
|
190
167
|
return this;
|
|
191
168
|
}
|
|
192
169
|
|
|
@@ -200,7 +177,7 @@ class Options {
|
|
|
200
177
|
* @return {!Options} A self reference.
|
|
201
178
|
*/
|
|
202
179
|
requireWindowFocus(require) {
|
|
203
|
-
this.
|
|
180
|
+
this.set(Key.REQUIRE_WINDOW_FOCUS, !!require);
|
|
204
181
|
return this;
|
|
205
182
|
}
|
|
206
183
|
|
|
@@ -213,7 +190,7 @@ class Options {
|
|
|
213
190
|
* @return {!Options} A self reference.
|
|
214
191
|
*/
|
|
215
192
|
browserAttachTimeout(timeout) {
|
|
216
|
-
this.
|
|
193
|
+
this.set(Key.BROWSER_ATTACH_TIMEOUT, Math.max(timeout, 0));
|
|
217
194
|
return this;
|
|
218
195
|
}
|
|
219
196
|
|
|
@@ -227,7 +204,7 @@ class Options {
|
|
|
227
204
|
* @return {!Options} A self reference.
|
|
228
205
|
*/
|
|
229
206
|
forceCreateProcessApi(force) {
|
|
230
|
-
this.
|
|
207
|
+
this.set(Key.FORCE_CREATE_PROCESS, !!force);
|
|
231
208
|
return this;
|
|
232
209
|
}
|
|
233
210
|
|
|
@@ -235,13 +212,14 @@ class Options {
|
|
|
235
212
|
* Specifies command-line switches to use when launching Internet Explorer.
|
|
236
213
|
* This is only valid when used with {@link #forceCreateProcessApi}.
|
|
237
214
|
*
|
|
238
|
-
* @param {...(string|!Array.<string>)}
|
|
215
|
+
* @param {...(string|!Array.<string>)} args The arguments to add.
|
|
239
216
|
* @return {!Options} A self reference.
|
|
240
217
|
*/
|
|
241
|
-
addArguments(
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
218
|
+
addArguments(...args) {
|
|
219
|
+
let current = this.get(Key.BROWSER_COMMAND_LINE_SWITCHES) || [];
|
|
220
|
+
this.set(
|
|
221
|
+
Key.BROWSER_COMMAND_LINE_SWITCHES,
|
|
222
|
+
current.concat.apply(current, args));
|
|
245
223
|
return this;
|
|
246
224
|
}
|
|
247
225
|
|
|
@@ -254,7 +232,7 @@ class Options {
|
|
|
254
232
|
* @return {!Options} A self reference.
|
|
255
233
|
*/
|
|
256
234
|
usePerProcessProxy(enable) {
|
|
257
|
-
this.
|
|
235
|
+
this.set(Key.USE_PER_PROCESS_PROXY, !!enable);
|
|
258
236
|
return this;
|
|
259
237
|
}
|
|
260
238
|
|
|
@@ -268,7 +246,7 @@ class Options {
|
|
|
268
246
|
* @return {!Options} A self reference.
|
|
269
247
|
*/
|
|
270
248
|
ensureCleanSession(cleanSession) {
|
|
271
|
-
this.
|
|
249
|
+
this.set(Key.ENSURE_CLEAN_SESSION, !!cleanSession);
|
|
272
250
|
return this;
|
|
273
251
|
}
|
|
274
252
|
|
|
@@ -278,7 +256,7 @@ class Options {
|
|
|
278
256
|
* @return {!Options} A self reference.
|
|
279
257
|
*/
|
|
280
258
|
setLogFile(file) {
|
|
281
|
-
this.
|
|
259
|
+
this.set(Key.LOG_FILE, file);
|
|
282
260
|
return this;
|
|
283
261
|
}
|
|
284
262
|
|
|
@@ -288,7 +266,7 @@ class Options {
|
|
|
288
266
|
* @return {!Options} A self reference.
|
|
289
267
|
*/
|
|
290
268
|
setLogLevel(level) {
|
|
291
|
-
this.
|
|
269
|
+
this.set(Key.LOG_LEVEL, level);
|
|
292
270
|
return this;
|
|
293
271
|
}
|
|
294
272
|
|
|
@@ -298,7 +276,7 @@ class Options {
|
|
|
298
276
|
* @return {!Options} A self reference.
|
|
299
277
|
*/
|
|
300
278
|
setHost(host) {
|
|
301
|
-
this.
|
|
279
|
+
this.set(Key.HOST, host);
|
|
302
280
|
return this;
|
|
303
281
|
}
|
|
304
282
|
|
|
@@ -308,7 +286,7 @@ class Options {
|
|
|
308
286
|
* @return {!Options} A self reference.
|
|
309
287
|
*/
|
|
310
288
|
setExtractPath(path) {
|
|
311
|
-
this.
|
|
289
|
+
this.set(Key.EXTRACT_PATH, path);
|
|
312
290
|
return this;
|
|
313
291
|
}
|
|
314
292
|
|
|
@@ -318,37 +296,21 @@ class Options {
|
|
|
318
296
|
* @return {!Options} A self reference.
|
|
319
297
|
*/
|
|
320
298
|
silent(silent) {
|
|
321
|
-
this.
|
|
299
|
+
this.set(Key.SILENT, silent);
|
|
322
300
|
return this;
|
|
323
301
|
}
|
|
302
|
+
}
|
|
324
303
|
|
|
325
|
-
/**
|
|
326
|
-
* Sets the proxy settings for the new session.
|
|
327
|
-
* @param {capabilities.ProxyConfig} proxy The proxy configuration to use.
|
|
328
|
-
* @return {!Options} A self reference.
|
|
329
|
-
*/
|
|
330
|
-
setProxy(proxy) {
|
|
331
|
-
this.proxy_ = proxy;
|
|
332
|
-
return this;
|
|
333
|
-
}
|
|
334
304
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
if (this.proxy_) {
|
|
345
|
-
caps.set(capabilities.Capability.PROXY, this.proxy_);
|
|
346
|
-
}
|
|
347
|
-
Object.keys(this.options_).forEach(function(key) {
|
|
348
|
-
caps.set(key, this.options_[key]);
|
|
349
|
-
}, this);
|
|
350
|
-
return caps;
|
|
351
|
-
}
|
|
305
|
+
/**
|
|
306
|
+
* _Synchronously_ attempts to locate the IE driver executable on the current
|
|
307
|
+
* system.
|
|
308
|
+
*
|
|
309
|
+
* @return {?string} the located executable, or `null`.
|
|
310
|
+
*/
|
|
311
|
+
function locateSynchronously() {
|
|
312
|
+
return process.platform === 'win32'
|
|
313
|
+
? io.findInPath(IEDRIVER_EXE, true) : null;
|
|
352
314
|
}
|
|
353
315
|
|
|
354
316
|
|
|
@@ -360,7 +322,7 @@ function createServiceFromCapabilities(capabilities) {
|
|
|
360
322
|
'WebDriver server?');
|
|
361
323
|
}
|
|
362
324
|
|
|
363
|
-
let exe =
|
|
325
|
+
let exe = locateSynchronously();
|
|
364
326
|
if (!exe || !fs.existsSync(exe)) {
|
|
365
327
|
throw Error(
|
|
366
328
|
`${IEDRIVER_EXE} could not be found on the current PATH. Please ` +
|
|
@@ -398,6 +360,23 @@ function createServiceFromCapabilities(capabilities) {
|
|
|
398
360
|
}
|
|
399
361
|
|
|
400
362
|
|
|
363
|
+
/**
|
|
364
|
+
* Creates {@link selenium-webdriver/remote.DriverService} instances that manage
|
|
365
|
+
* an [IEDriverServer](https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver)
|
|
366
|
+
* server in a child process.
|
|
367
|
+
*/
|
|
368
|
+
class ServiceBuilder extends remote.DriverService.Builder {
|
|
369
|
+
/**
|
|
370
|
+
* @param {string=} opt_exe Path to the server executable to use. If omitted,
|
|
371
|
+
* the builder will attempt to locate the IEDriverServer on the system PATH.
|
|
372
|
+
*/
|
|
373
|
+
constructor(opt_exe) {
|
|
374
|
+
super(opt_exe || IEDRIVER_EXE);
|
|
375
|
+
this.setLoopback(true); // Required.
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
|
|
401
380
|
/**
|
|
402
381
|
* A WebDriver client for Microsoft's Internet Explorer.
|
|
403
382
|
*/
|
|
@@ -405,23 +384,27 @@ class Driver extends webdriver.WebDriver {
|
|
|
405
384
|
/**
|
|
406
385
|
* Creates a new session for Microsoft's Internet Explorer.
|
|
407
386
|
*
|
|
408
|
-
* @param {(
|
|
409
|
-
*
|
|
410
|
-
*
|
|
411
|
-
* or {@code null} to use the currently active flow.
|
|
387
|
+
* @param {(Capabilities|Options)=} options The configuration options.
|
|
388
|
+
* @param {(remote.DriverService)=} opt_service The `DriverService` to use
|
|
389
|
+
* to start the IEDriverServer in a child process, optionally.
|
|
412
390
|
* @return {!Driver} A new driver instance.
|
|
413
391
|
*/
|
|
414
|
-
static createSession(
|
|
415
|
-
|
|
416
|
-
opt_config.toCapabilities() :
|
|
417
|
-
(opt_config || capabilities.Capabilities.ie());
|
|
392
|
+
static createSession(options, opt_service) {
|
|
393
|
+
options = options || new Options();
|
|
418
394
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
395
|
+
let service;
|
|
396
|
+
|
|
397
|
+
if (opt_service instanceof remote.DriverService) {
|
|
398
|
+
service = opt_service;
|
|
399
|
+
} else {
|
|
400
|
+
service = createServiceFromCapabilities(options);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
let client = service.start().then(url => new http.HttpClient(url));
|
|
404
|
+
let executor = new http.Executor(client);
|
|
422
405
|
|
|
423
406
|
return /** @type {!Driver} */(super.createSession(
|
|
424
|
-
executor,
|
|
407
|
+
executor, options, () => service.kill()));
|
|
425
408
|
}
|
|
426
409
|
|
|
427
410
|
/**
|
|
@@ -439,3 +422,6 @@ class Driver extends webdriver.WebDriver {
|
|
|
439
422
|
exports.Driver = Driver;
|
|
440
423
|
exports.Options = Options;
|
|
441
424
|
exports.Level = Level;
|
|
425
|
+
exports.ServiceBuilder = ServiceBuilder;
|
|
426
|
+
exports.locateSynchronously = locateSynchronously;
|
|
427
|
+
|