@serenity-js/protractor 2.33.1 → 3.0.0-rc.11
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/CHANGELOG.md +481 -0
- package/lib/adapter/ProtractorFrameworkAdapter.js +5 -0
- package/lib/adapter/ProtractorFrameworkAdapter.js.map +1 -1
- package/lib/index.d.ts +0 -2
- package/lib/index.js +0 -2
- package/lib/index.js.map +1 -1
- package/lib/screenplay/abilities/{BrowseTheWeb.d.ts → BrowseTheWebWithProtractor.d.ts} +38 -191
- package/lib/screenplay/abilities/{BrowseTheWeb.js → BrowseTheWebWithProtractor.js} +129 -251
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js.map +1 -0
- package/lib/screenplay/abilities/index.d.ts +1 -1
- package/lib/screenplay/abilities/index.js +1 -1
- package/lib/screenplay/abilities/index.js.map +1 -1
- package/lib/screenplay/index.d.ts +1 -0
- package/lib/screenplay/index.js +1 -0
- package/lib/screenplay/index.js.map +1 -1
- package/lib/screenplay/interactions/UseAngular.js +2 -2
- package/lib/screenplay/interactions/UseAngular.js.map +1 -1
- package/lib/screenplay/interactions/index.d.ts +0 -19
- package/lib/screenplay/interactions/index.js +0 -19
- package/lib/screenplay/interactions/index.js.map +1 -1
- package/lib/screenplay/models/ProtractorCookie.d.ts +11 -0
- package/lib/screenplay/models/ProtractorCookie.js +39 -0
- package/lib/screenplay/models/ProtractorCookie.js.map +1 -0
- package/lib/screenplay/models/ProtractorFrame.d.ts +10 -0
- package/lib/screenplay/models/ProtractorFrame.js +39 -0
- package/lib/screenplay/models/ProtractorFrame.js.map +1 -0
- package/lib/screenplay/models/ProtractorModalDialog.d.ts +11 -0
- package/lib/screenplay/models/ProtractorModalDialog.js +43 -0
- package/lib/screenplay/models/ProtractorModalDialog.js.map +1 -0
- package/lib/screenplay/models/ProtractorPage.d.ts +26 -0
- package/lib/screenplay/models/ProtractorPage.js +98 -0
- package/lib/screenplay/models/ProtractorPage.js.map +1 -0
- package/lib/screenplay/models/ProtractorPageElement.d.ts +21 -0
- package/lib/screenplay/models/ProtractorPageElement.js +230 -0
- package/lib/screenplay/models/ProtractorPageElement.js.map +1 -0
- package/lib/screenplay/models/index.d.ts +5 -0
- package/lib/screenplay/{questions/lists → models}/index.js +5 -1
- package/lib/screenplay/models/index.js.map +1 -0
- package/lib/screenplay/models/locators/ProtractorLocator.d.ts +9 -0
- package/lib/screenplay/models/locators/ProtractorLocator.js +28 -0
- package/lib/screenplay/models/locators/ProtractorLocator.js.map +1 -0
- package/lib/screenplay/models/locators/ProtractorNativeElementRoot.d.ts +5 -0
- package/lib/screenplay/{interactions/EnterBuilder.js → models/locators/ProtractorNativeElementRoot.js} +1 -1
- package/lib/screenplay/models/locators/ProtractorNativeElementRoot.js.map +1 -0
- package/lib/screenplay/models/locators/index.d.ts +2 -0
- package/lib/{stage/crew → screenplay/models/locators}/index.js +2 -1
- package/lib/screenplay/models/locators/index.js.map +1 -0
- package/lib/{promiseOf.d.ts → screenplay/promised.d.ts} +1 -1
- package/lib/{promiseOf.js → screenplay/promised.js} +4 -4
- package/lib/screenplay/promised.js.map +1 -0
- package/lib/screenplay/questions/ProtractorParam.d.ts +24 -29
- package/lib/screenplay/questions/ProtractorParam.js +26 -33
- package/lib/screenplay/questions/ProtractorParam.js.map +1 -1
- package/lib/screenplay/questions/index.d.ts +0 -13
- package/lib/screenplay/questions/index.js +0 -16
- package/lib/screenplay/questions/index.js.map +1 -1
- package/lib/screenplay/unpromisedWebElement.d.ts +11 -0
- package/lib/screenplay/unpromisedWebElement.js +24 -0
- package/lib/screenplay/unpromisedWebElement.js.map +1 -0
- package/package.json +19 -20
- package/src/adapter/ProtractorFrameworkAdapter.ts +5 -0
- package/src/index.ts +0 -2
- package/src/screenplay/abilities/{BrowseTheWeb.ts → BrowseTheWebWithProtractor.ts} +148 -263
- package/src/screenplay/abilities/index.ts +1 -1
- package/src/screenplay/index.ts +1 -0
- package/src/screenplay/interactions/UseAngular.ts +3 -3
- package/src/screenplay/interactions/index.ts +0 -19
- package/src/screenplay/models/ProtractorCookie.ts +41 -0
- package/src/screenplay/models/ProtractorFrame.ts +44 -0
- package/src/screenplay/models/ProtractorModalDialog.ts +49 -0
- package/src/screenplay/models/ProtractorPage.ts +124 -0
- package/src/screenplay/models/ProtractorPageElement.ts +285 -0
- package/src/screenplay/models/index.ts +6 -0
- package/src/screenplay/models/locators/ProtractorLocator.ts +50 -0
- package/src/screenplay/models/locators/ProtractorNativeElementRoot.ts +6 -0
- package/src/screenplay/models/locators/index.ts +2 -0
- package/src/{promiseOf.ts → screenplay/promised.ts} +1 -1
- package/src/screenplay/questions/ProtractorParam.ts +29 -38
- package/src/screenplay/questions/index.ts +0 -13
- package/src/screenplay/unpromisedWebElement.ts +25 -0
- package/lib/expectations/ElementFinderExpectation.d.ts +0 -11
- package/lib/expectations/ElementFinderExpectation.js +0 -24
- package/lib/expectations/ElementFinderExpectation.js.map +0 -1
- package/lib/expectations/index.d.ts +0 -6
- package/lib/expectations/index.js +0 -19
- package/lib/expectations/index.js.map +0 -1
- package/lib/expectations/isActive.d.ts +0 -13
- package/lib/expectations/isActive.js +0 -19
- package/lib/expectations/isActive.js.map +0 -1
- package/lib/expectations/isClickable.d.ts +0 -13
- package/lib/expectations/isClickable.js +0 -22
- package/lib/expectations/isClickable.js.map +0 -1
- package/lib/expectations/isEnabled.d.ts +0 -13
- package/lib/expectations/isEnabled.js +0 -19
- package/lib/expectations/isEnabled.js.map +0 -1
- package/lib/expectations/isPresent.d.ts +0 -14
- package/lib/expectations/isPresent.js +0 -20
- package/lib/expectations/isPresent.js.map +0 -1
- package/lib/expectations/isSelected.d.ts +0 -13
- package/lib/expectations/isSelected.js +0 -22
- package/lib/expectations/isSelected.js.map +0 -1
- package/lib/expectations/isVisible.d.ts +0 -13
- package/lib/expectations/isVisible.js +0 -25
- package/lib/expectations/isVisible.js.map +0 -1
- package/lib/promiseOf.js.map +0 -1
- package/lib/screenplay/abilities/BrowseTheWeb.js.map +0 -1
- package/lib/screenplay/interactions/Accept.d.ts +0 -81
- package/lib/screenplay/interactions/Accept.js +0 -95
- package/lib/screenplay/interactions/Accept.js.map +0 -1
- package/lib/screenplay/interactions/Clear.d.ts +0 -88
- package/lib/screenplay/interactions/Clear.js +0 -121
- package/lib/screenplay/interactions/Clear.js.map +0 -1
- package/lib/screenplay/interactions/Click.d.ts +0 -81
- package/lib/screenplay/interactions/Click.js +0 -95
- package/lib/screenplay/interactions/Click.js.map +0 -1
- package/lib/screenplay/interactions/Close.d.ts +0 -89
- package/lib/screenplay/interactions/Close.js +0 -169
- package/lib/screenplay/interactions/Close.js.map +0 -1
- package/lib/screenplay/interactions/DeleteCookies.d.ts +0 -72
- package/lib/screenplay/interactions/DeleteCookies.js +0 -149
- package/lib/screenplay/interactions/DeleteCookies.js.map +0 -1
- package/lib/screenplay/interactions/Dismiss.d.ts +0 -85
- package/lib/screenplay/interactions/Dismiss.js +0 -99
- package/lib/screenplay/interactions/Dismiss.js.map +0 -1
- package/lib/screenplay/interactions/DoubleClick.d.ts +0 -99
- package/lib/screenplay/interactions/DoubleClick.js +0 -121
- package/lib/screenplay/interactions/DoubleClick.js.map +0 -1
- package/lib/screenplay/interactions/Enter.d.ts +0 -81
- package/lib/screenplay/interactions/Enter.js +0 -96
- package/lib/screenplay/interactions/Enter.js.map +0 -1
- package/lib/screenplay/interactions/EnterBuilder.d.ts +0 -27
- package/lib/screenplay/interactions/EnterBuilder.js.map +0 -1
- package/lib/screenplay/interactions/ExecuteScript.d.ts +0 -171
- package/lib/screenplay/interactions/ExecuteScript.js +0 -291
- package/lib/screenplay/interactions/ExecuteScript.js.map +0 -1
- package/lib/screenplay/interactions/Hover.d.ts +0 -86
- package/lib/screenplay/interactions/Hover.js +0 -103
- package/lib/screenplay/interactions/Hover.js.map +0 -1
- package/lib/screenplay/interactions/Navigate.d.ts +0 -149
- package/lib/screenplay/interactions/Navigate.js +0 -345
- package/lib/screenplay/interactions/Navigate.js.map +0 -1
- package/lib/screenplay/interactions/Press.d.ts +0 -90
- package/lib/screenplay/interactions/Press.js +0 -127
- package/lib/screenplay/interactions/Press.js.map +0 -1
- package/lib/screenplay/interactions/PressBuilder.d.ts +0 -27
- package/lib/screenplay/interactions/PressBuilder.js +0 -3
- package/lib/screenplay/interactions/PressBuilder.js.map +0 -1
- package/lib/screenplay/interactions/ResizeBrowserWindow.d.ts +0 -69
- package/lib/screenplay/interactions/ResizeBrowserWindow.js +0 -144
- package/lib/screenplay/interactions/ResizeBrowserWindow.js.map +0 -1
- package/lib/screenplay/interactions/RightClick.d.ts +0 -97
- package/lib/screenplay/interactions/RightClick.js +0 -113
- package/lib/screenplay/interactions/RightClick.js.map +0 -1
- package/lib/screenplay/interactions/Scroll.d.ts +0 -83
- package/lib/screenplay/interactions/Scroll.js +0 -98
- package/lib/screenplay/interactions/Scroll.js.map +0 -1
- package/lib/screenplay/interactions/Select.d.ts +0 -212
- package/lib/screenplay/interactions/Select.js +0 -342
- package/lib/screenplay/interactions/Select.js.map +0 -1
- package/lib/screenplay/interactions/SelectBuilder.d.ts +0 -33
- package/lib/screenplay/interactions/SelectBuilder.js +0 -3
- package/lib/screenplay/interactions/SelectBuilder.js.map +0 -1
- package/lib/screenplay/interactions/Switch.d.ts +0 -210
- package/lib/screenplay/interactions/Switch.js +0 -345
- package/lib/screenplay/interactions/Switch.js.map +0 -1
- package/lib/screenplay/interactions/TakeScreenshot.d.ts +0 -67
- package/lib/screenplay/interactions/TakeScreenshot.js +0 -86
- package/lib/screenplay/interactions/TakeScreenshot.js.map +0 -1
- package/lib/screenplay/interactions/Wait.d.ts +0 -147
- package/lib/screenplay/interactions/Wait.js +0 -247
- package/lib/screenplay/interactions/Wait.js.map +0 -1
- package/lib/screenplay/interactions/WaitBuilder.d.ts +0 -33
- package/lib/screenplay/interactions/WaitBuilder.js +0 -3
- package/lib/screenplay/interactions/WaitBuilder.js.map +0 -1
- package/lib/screenplay/questions/Attribute.d.ts +0 -29
- package/lib/screenplay/questions/Attribute.js +0 -56
- package/lib/screenplay/questions/Attribute.js.map +0 -1
- package/lib/screenplay/questions/Browser.d.ts +0 -47
- package/lib/screenplay/questions/Browser.js +0 -55
- package/lib/screenplay/questions/Browser.js.map +0 -1
- package/lib/screenplay/questions/CSSClasses.d.ts +0 -94
- package/lib/screenplay/questions/CSSClasses.js +0 -118
- package/lib/screenplay/questions/CSSClasses.js.map +0 -1
- package/lib/screenplay/questions/Cookie.d.ts +0 -9
- package/lib/screenplay/questions/Cookie.js +0 -65
- package/lib/screenplay/questions/Cookie.js.map +0 -1
- package/lib/screenplay/questions/LastScriptExecution.d.ts +0 -14
- package/lib/screenplay/questions/LastScriptExecution.js +0 -22
- package/lib/screenplay/questions/LastScriptExecution.js.map +0 -1
- package/lib/screenplay/questions/ModalDialog.d.ts +0 -120
- package/lib/screenplay/questions/ModalDialog.js +0 -142
- package/lib/screenplay/questions/ModalDialog.js.map +0 -1
- package/lib/screenplay/questions/Pick.d.ts +0 -72
- package/lib/screenplay/questions/Pick.js +0 -254
- package/lib/screenplay/questions/Pick.js.map +0 -1
- package/lib/screenplay/questions/Selected.d.ts +0 -185
- package/lib/screenplay/questions/Selected.js +0 -254
- package/lib/screenplay/questions/Selected.js.map +0 -1
- package/lib/screenplay/questions/Value.d.ts +0 -47
- package/lib/screenplay/questions/Value.js +0 -67
- package/lib/screenplay/questions/Value.js.map +0 -1
- package/lib/screenplay/questions/Website.d.ts +0 -15
- package/lib/screenplay/questions/Website.js +0 -25
- package/lib/screenplay/questions/Website.js.map +0 -1
- package/lib/screenplay/questions/Window.d.ts +0 -23
- package/lib/screenplay/questions/Window.js +0 -28
- package/lib/screenplay/questions/Window.js.map +0 -1
- package/lib/screenplay/questions/lists/ElementArrayFinderListAdapter.d.ts +0 -89
- package/lib/screenplay/questions/lists/ElementArrayFinderListAdapter.js +0 -138
- package/lib/screenplay/questions/lists/ElementArrayFinderListAdapter.js.map +0 -1
- package/lib/screenplay/questions/lists/index.d.ts +0 -1
- package/lib/screenplay/questions/lists/index.js.map +0 -1
- package/lib/screenplay/questions/targets/Target.d.ts +0 -168
- package/lib/screenplay/questions/targets/Target.js +0 -190
- package/lib/screenplay/questions/targets/Target.js.map +0 -1
- package/lib/screenplay/questions/targets/TargetElement.d.ts +0 -50
- package/lib/screenplay/questions/targets/TargetElement.js +0 -62
- package/lib/screenplay/questions/targets/TargetElement.js.map +0 -1
- package/lib/screenplay/questions/targets/TargetElements.d.ts +0 -102
- package/lib/screenplay/questions/targets/TargetElements.js +0 -124
- package/lib/screenplay/questions/targets/TargetElements.js.map +0 -1
- package/lib/screenplay/questions/targets/TargetNestedElement.d.ts +0 -49
- package/lib/screenplay/questions/targets/TargetNestedElement.js +0 -61
- package/lib/screenplay/questions/targets/TargetNestedElement.js.map +0 -1
- package/lib/screenplay/questions/targets/TargetNestedElements.d.ts +0 -101
- package/lib/screenplay/questions/targets/TargetNestedElements.js +0 -123
- package/lib/screenplay/questions/targets/TargetNestedElements.js.map +0 -1
- package/lib/screenplay/questions/targets/builders.d.ts +0 -8
- package/lib/screenplay/questions/targets/builders.js +0 -3
- package/lib/screenplay/questions/targets/builders.js.map +0 -1
- package/lib/screenplay/questions/targets/index.d.ts +0 -5
- package/lib/screenplay/questions/targets/index.js +0 -18
- package/lib/screenplay/questions/targets/index.js.map +0 -1
- package/lib/screenplay/questions/targets/override.d.ts +0 -7
- package/lib/screenplay/questions/targets/override.js +0 -21
- package/lib/screenplay/questions/targets/override.js.map +0 -1
- package/lib/screenplay/questions/text/Text.d.ts +0 -41
- package/lib/screenplay/questions/text/Text.js +0 -50
- package/lib/screenplay/questions/text/Text.js.map +0 -1
- package/lib/screenplay/questions/text/TextOfMultipleElements.d.ts +0 -23
- package/lib/screenplay/questions/text/TextOfMultipleElements.js +0 -37
- package/lib/screenplay/questions/text/TextOfMultipleElements.js.map +0 -1
- package/lib/screenplay/questions/text/TextOfSingleElement.d.ts +0 -23
- package/lib/screenplay/questions/text/TextOfSingleElement.js +0 -35
- package/lib/screenplay/questions/text/TextOfSingleElement.js.map +0 -1
- package/lib/screenplay/questions/text/index.d.ts +0 -1
- package/lib/screenplay/questions/text/index.js +0 -14
- package/lib/screenplay/questions/text/index.js.map +0 -1
- package/lib/screenplay/withAnswerOf.d.ts +0 -8
- package/lib/screenplay/withAnswerOf.js +0 -18
- package/lib/screenplay/withAnswerOf.js.map +0 -1
- package/lib/stage/crew/index.d.ts +0 -1
- package/lib/stage/crew/index.js.map +0 -1
- package/lib/stage/crew/photographer/Photographer.d.ts +0 -83
- package/lib/stage/crew/photographer/Photographer.js +0 -102
- package/lib/stage/crew/photographer/Photographer.js.map +0 -1
- package/lib/stage/crew/photographer/index.d.ts +0 -2
- package/lib/stage/crew/photographer/index.js +0 -15
- package/lib/stage/crew/photographer/index.js.map +0 -1
- package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.d.ts +0 -28
- package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.js +0 -65
- package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.js.map +0 -1
- package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.d.ts +0 -18
- package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.js +0 -30
- package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.js.map +0 -1
- package/lib/stage/crew/photographer/strategies/TakePhotosOfFailures.d.ts +0 -17
- package/lib/stage/crew/photographer/strategies/TakePhotosOfFailures.js +0 -28
- package/lib/stage/crew/photographer/strategies/TakePhotosOfFailures.js.map +0 -1
- package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.d.ts +0 -19
- package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.js +0 -28
- package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.js.map +0 -1
- package/lib/stage/crew/photographer/strategies/index.d.ts +0 -4
- package/lib/stage/crew/photographer/strategies/index.js +0 -17
- package/lib/stage/crew/photographer/strategies/index.js.map +0 -1
- package/lib/stage/index.d.ts +0 -1
- package/lib/stage/index.js +0 -14
- package/lib/stage/index.js.map +0 -1
- package/src/expectations/ElementFinderExpectation.ts +0 -29
- package/src/expectations/index.ts +0 -6
- package/src/expectations/isActive.ts +0 -24
- package/src/expectations/isClickable.ts +0 -20
- package/src/expectations/isEnabled.ts +0 -18
- package/src/expectations/isPresent.ts +0 -19
- package/src/expectations/isSelected.ts +0 -23
- package/src/expectations/isVisible.ts +0 -27
- package/src/screenplay/interactions/Accept.ts +0 -95
- package/src/screenplay/interactions/Clear.ts +0 -130
- package/src/screenplay/interactions/Click.ts +0 -96
- package/src/screenplay/interactions/Close.ts +0 -184
- package/src/screenplay/interactions/DeleteCookies.ts +0 -154
- package/src/screenplay/interactions/Dismiss.ts +0 -99
- package/src/screenplay/interactions/DoubleClick.ts +0 -124
- package/src/screenplay/interactions/Enter.ts +0 -104
- package/src/screenplay/interactions/EnterBuilder.ts +0 -29
- package/src/screenplay/interactions/ExecuteScript.ts +0 -325
- package/src/screenplay/interactions/Hover.ts +0 -106
- package/src/screenplay/interactions/Navigate.ts +0 -363
- package/src/screenplay/interactions/Press.ts +0 -137
- package/src/screenplay/interactions/PressBuilder.ts +0 -29
- package/src/screenplay/interactions/ResizeBrowserWindow.ts +0 -148
- package/src/screenplay/interactions/RightClick.ts +0 -114
- package/src/screenplay/interactions/Scroll.ts +0 -99
- package/src/screenplay/interactions/Select.ts +0 -402
- package/src/screenplay/interactions/SelectBuilder.ts +0 -35
- package/src/screenplay/interactions/Switch.ts +0 -393
- package/src/screenplay/interactions/TakeScreenshot.ts +0 -89
- package/src/screenplay/interactions/Wait.ts +0 -267
- package/src/screenplay/interactions/WaitBuilder.ts +0 -35
- package/src/screenplay/questions/Attribute.ts +0 -67
- package/src/screenplay/questions/Browser.ts +0 -55
- package/src/screenplay/questions/CSSClasses.ts +0 -121
- package/src/screenplay/questions/Cookie.ts +0 -70
- package/src/screenplay/questions/LastScriptExecution.ts +0 -21
- package/src/screenplay/questions/ModalDialog.ts +0 -149
- package/src/screenplay/questions/Pick.ts +0 -334
- package/src/screenplay/questions/Selected.ts +0 -268
- package/src/screenplay/questions/Value.ts +0 -73
- package/src/screenplay/questions/Website.ts +0 -27
- package/src/screenplay/questions/Window.ts +0 -29
- package/src/screenplay/questions/lists/ElementArrayFinderListAdapter.ts +0 -158
- package/src/screenplay/questions/lists/index.ts +0 -1
- package/src/screenplay/questions/targets/Target.ts +0 -198
- package/src/screenplay/questions/targets/TargetElement.ts +0 -70
- package/src/screenplay/questions/targets/TargetElements.ts +0 -142
- package/src/screenplay/questions/targets/TargetNestedElement.ts +0 -71
- package/src/screenplay/questions/targets/TargetNestedElements.ts +0 -142
- package/src/screenplay/questions/targets/builders.ts +0 -10
- package/src/screenplay/questions/targets/index.ts +0 -5
- package/src/screenplay/questions/targets/override.ts +0 -17
- package/src/screenplay/questions/text/Text.ts +0 -55
- package/src/screenplay/questions/text/TextOfMultipleElements.ts +0 -40
- package/src/screenplay/questions/text/TextOfSingleElement.ts +0 -37
- package/src/screenplay/questions/text/index.ts +0 -1
- package/src/screenplay/withAnswerOf.ts +0 -19
- package/src/stage/crew/index.ts +0 -1
- package/src/stage/crew/photographer/Photographer.ts +0 -108
- package/src/stage/crew/photographer/index.ts +0 -2
- package/src/stage/crew/photographer/strategies/PhotoTakingStrategy.ts +0 -102
- package/src/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.ts +0 -28
- package/src/stage/crew/photographer/strategies/TakePhotosOfFailures.ts +0 -26
- package/src/stage/crew/photographer/strategies/TakePhotosOfInteractions.ts +0 -26
- package/src/stage/crew/photographer/strategies/index.ts +0 -4
- package/src/stage/index.ts +0 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Timestamp } from '@serenity-js/core';
|
|
2
|
+
import { Cookie, CookieData, CookieMissingError } from '@serenity-js/web';
|
|
3
|
+
import { ProtractorBrowser } from 'protractor';
|
|
4
|
+
import { ensure, isDefined } from 'tiny-types';
|
|
5
|
+
|
|
6
|
+
import { promised } from '../promised';
|
|
7
|
+
|
|
8
|
+
export class ProtractorCookie extends Cookie {
|
|
9
|
+
|
|
10
|
+
constructor(private readonly browser: ProtractorBrowser, cookieName: string) {
|
|
11
|
+
super(cookieName);
|
|
12
|
+
ensure('browser', browser, isDefined());
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
delete(): Promise<void> {
|
|
16
|
+
return promised(this.browser.manage().deleteCookie(this.cookieName));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @protected
|
|
21
|
+
*/
|
|
22
|
+
protected async read(): Promise<CookieData> {
|
|
23
|
+
const cookie = await this.browser.manage().getCookie(this.cookieName);
|
|
24
|
+
|
|
25
|
+
if (! cookie) {
|
|
26
|
+
throw new CookieMissingError(`Cookie '${ this.cookieName }' not set`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
name: cookie.name,
|
|
31
|
+
value: cookie.value,
|
|
32
|
+
domain: cookie.domain,
|
|
33
|
+
path: cookie.path,
|
|
34
|
+
expiry: cookie.expiry !== undefined
|
|
35
|
+
? Timestamp.fromTimestampInSeconds(Math.round(cookie.expiry))
|
|
36
|
+
: undefined,
|
|
37
|
+
httpOnly: cookie.httpOnly,
|
|
38
|
+
secure: cookie.secure,
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { LogicError } from '@serenity-js/core';
|
|
2
|
+
import { Frame, Locator } from '@serenity-js/web';
|
|
3
|
+
import { ElementFinder, ProtractorBrowser, WebElement } from 'protractor';
|
|
4
|
+
|
|
5
|
+
export class ProtractorFrame extends Frame<ElementFinder> {
|
|
6
|
+
constructor(
|
|
7
|
+
private readonly browser: ProtractorBrowser,
|
|
8
|
+
locator: Locator<ElementFinder>
|
|
9
|
+
) {
|
|
10
|
+
super(locator);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async isPresent(): Promise<boolean> {
|
|
14
|
+
const element: ElementFinder = await this.locator.nativeElement();
|
|
15
|
+
|
|
16
|
+
return element.isPresent();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async switchTo(): Promise<{ switchBack(): Promise<void> }> {
|
|
20
|
+
const element: ElementFinder = await this.locator.nativeElement()
|
|
21
|
+
|
|
22
|
+
let webElement: WebElement;
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
// https://github.com/angular/protractor/issues/1846#issuecomment-82634739;
|
|
26
|
+
webElement = await element.getWebElement();
|
|
27
|
+
} catch (error) {
|
|
28
|
+
throw new LogicError(`Couldn't locate frame ${ this.locator }`, error);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
await this.browser.switchTo().frame(webElement);
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
switchBack: async (): Promise<void> => {
|
|
36
|
+
await this.browser.driver.switchToParentFrame();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw new LogicError(`Couldn't switch to a frame located ${ this.locator }`, error);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ModalDialog } from '@serenity-js/web';
|
|
2
|
+
import { ProtractorBrowser } from 'protractor';
|
|
3
|
+
import { error as errors } from 'selenium-webdriver';
|
|
4
|
+
|
|
5
|
+
import { promised } from '../promised';
|
|
6
|
+
|
|
7
|
+
export class ProtractorModalDialog extends ModalDialog {
|
|
8
|
+
|
|
9
|
+
constructor(private readonly browser: ProtractorBrowser) {
|
|
10
|
+
super();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
accept(): Promise<void> {
|
|
14
|
+
return promised(this.browser.switchTo().alert().accept());
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
dismiss(): Promise<void> {
|
|
18
|
+
return promised(this.browser.switchTo().alert().dismiss());
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
text(): Promise<string> {
|
|
22
|
+
return promised(this.browser.switchTo().alert().getText());
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async enterValue(value: string | number | (string | number)[]): Promise<void> {
|
|
26
|
+
const text = [].concat(value).join('');
|
|
27
|
+
await promised(this.browser.switchTo().alert().sendKeys(text));
|
|
28
|
+
await promised(this.browser.switchTo().alert().accept());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// todo: remove in favour of auto-wait in the above methods
|
|
32
|
+
isPresent(): Promise<boolean> {
|
|
33
|
+
return promised(this.browser.switchTo().alert())
|
|
34
|
+
.then(() => true, error => {
|
|
35
|
+
|
|
36
|
+
// Based on:
|
|
37
|
+
// https://github.com/SeleniumHQ/selenium/blob/941dc9c6b2e2aa4f701c1b72be8de03d4b7e996a/javascript/node/selenium-webdriver/lib/until.js#L107
|
|
38
|
+
return error instanceof Error &&
|
|
39
|
+
! (
|
|
40
|
+
error.name === errors.NoSuchAlertError.name
|
|
41
|
+
// XXX: Workaround for GeckoDriver error `TypeError: can't convert null
|
|
42
|
+
// to object`. For more details, see
|
|
43
|
+
// https://github.com/SeleniumHQ/selenium/pull/2137
|
|
44
|
+
|| (error.name === errors.WebDriverError.name
|
|
45
|
+
&& error.message === `can't convert null to object`)
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Page } from '@serenity-js/web';
|
|
2
|
+
import { ProtractorBrowser } from 'protractor';
|
|
3
|
+
import { URL } from 'url';
|
|
4
|
+
|
|
5
|
+
import { promised } from '../promised';
|
|
6
|
+
|
|
7
|
+
export class ProtractorPage extends Page {
|
|
8
|
+
constructor(
|
|
9
|
+
private readonly browser: ProtractorBrowser,
|
|
10
|
+
handle: string
|
|
11
|
+
) {
|
|
12
|
+
super(handle);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
title(): Promise<string> {
|
|
16
|
+
return this.switchToAndPerform(async browser => {
|
|
17
|
+
return promised(browser.getTitle());
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
name(): Promise<string> {
|
|
22
|
+
return this.switchToAndPerform(async browser => {
|
|
23
|
+
return promised(browser.executeScript('return window.name'));
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
url(): Promise<URL> {
|
|
28
|
+
return this.switchToAndPerform(async browser => {
|
|
29
|
+
return new URL(await promised(browser.getCurrentUrl()));
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async viewportSize(): Promise<{ width: number, height: number }> {
|
|
34
|
+
return this.switchToAndPerform(async browser => {
|
|
35
|
+
const calculatedViewportSize = await promised(browser.executeScript(
|
|
36
|
+
`return {
|
|
37
|
+
width: Math.max(document.documentElement.clientWidth, window.innerWidth || 0),
|
|
38
|
+
height: Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
|
|
39
|
+
};`
|
|
40
|
+
)) as { width: number, height: number };
|
|
41
|
+
|
|
42
|
+
if (calculatedViewportSize.width > 0 && calculatedViewportSize.height > 0) {
|
|
43
|
+
return calculatedViewportSize;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Chrome headless hard-codes window.innerWidth and window.innerHeight to 0
|
|
47
|
+
return promised(browser.manage().window().getSize());
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async setViewportSize(size: { width: number, height: number }): Promise<void> {
|
|
52
|
+
return this.switchToAndPerform(async browser => {
|
|
53
|
+
const desiredWindowSize: { width: number, height: number } = await promised(browser.executeScript(`
|
|
54
|
+
var currentViewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0)
|
|
55
|
+
var currentViewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
width: Math.max(window.outerWidth - currentViewportWidth + ${ size.width }, ${ size.width }),
|
|
59
|
+
height: Math.max(window.outerHeight - currentViewportHeight + ${ size.height }, ${ size.height }),
|
|
60
|
+
};
|
|
61
|
+
`));
|
|
62
|
+
|
|
63
|
+
return promised(browser.manage().window().setSize(desiredWindowSize.width, desiredWindowSize.height));
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async close(): Promise<void> {
|
|
68
|
+
return this.switchToAndPerform(browser => promised(browser.close()));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async closeOthers(): Promise<void> {
|
|
72
|
+
const windowHandles = await this.browser.getAllWindowHandles();
|
|
73
|
+
|
|
74
|
+
for (const handle of windowHandles) {
|
|
75
|
+
if (handle !== this.handle) {
|
|
76
|
+
await this.browser.switchTo().window(handle);
|
|
77
|
+
await this.browser.close();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
await this.browser.switchTo().window(this.handle);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async isPresent(): Promise<boolean> {
|
|
85
|
+
const currentPageHandle = await this.browser.getWindowHandle();
|
|
86
|
+
const desiredPageHandle = this.handle;
|
|
87
|
+
|
|
88
|
+
const isOpen = await this.browser.switchTo().window(desiredPageHandle).then(() => true, _error => false);
|
|
89
|
+
|
|
90
|
+
await this.browser.switchTo().window(currentPageHandle);
|
|
91
|
+
|
|
92
|
+
return isOpen;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async switchTo(): Promise<{ switchBack(): Promise<void> }> {
|
|
96
|
+
const originalWindowHandle = await this.browser.getWindowHandle();
|
|
97
|
+
|
|
98
|
+
await this.browser.switchTo().window(this.handle);
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
switchBack: async (): Promise<void> => {
|
|
102
|
+
await this.browser.switchTo().window(originalWindowHandle);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private async switchToAndPerform<T>(action: (browser: ProtractorBrowser) => Promise<T> | T): Promise<T> {
|
|
108
|
+
const originalPageHandle = await this.browser.getWindowHandle();
|
|
109
|
+
const desiredPageHandle = this.handle;
|
|
110
|
+
const shouldSwitch = originalPageHandle !== desiredPageHandle;
|
|
111
|
+
|
|
112
|
+
if (shouldSwitch) {
|
|
113
|
+
await this.browser.switchTo().window(desiredPageHandle);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const result = await action(this.browser);
|
|
117
|
+
|
|
118
|
+
if (shouldSwitch) {
|
|
119
|
+
await this.browser.switchTo().window(originalPageHandle);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { PageElement } from '@serenity-js/web';
|
|
2
|
+
import { ElementFinder, protractor } from 'protractor';
|
|
3
|
+
import { WebElement } from 'selenium-webdriver';
|
|
4
|
+
|
|
5
|
+
import { promised } from '../promised';
|
|
6
|
+
|
|
7
|
+
export class ProtractorPageElement
|
|
8
|
+
extends PageElement<ElementFinder>
|
|
9
|
+
{
|
|
10
|
+
of(parent: ProtractorPageElement): PageElement<ElementFinder> {
|
|
11
|
+
return new ProtractorPageElement(this.locator.of(parent.locator));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async clearValue(): Promise<void> {
|
|
15
|
+
function removeCharactersFrom(elf: ElementFinder, numberOfCharacters: number): PromiseLike<void> {
|
|
16
|
+
return numberOfCharacters === 0
|
|
17
|
+
? Promise.resolve(void 0)
|
|
18
|
+
: elf.sendKeys(
|
|
19
|
+
protractor.Key.END,
|
|
20
|
+
...times(numberOfCharacters, protractor.Key.BACK_SPACE),
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping
|
|
25
|
+
function times(length: number, key: string) {
|
|
26
|
+
return Array.from({ length }).map(() => key);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const currentValue = await this.value();
|
|
30
|
+
|
|
31
|
+
if (currentValue !== null && currentValue !== undefined) {
|
|
32
|
+
const element = await this.nativeElement();
|
|
33
|
+
return removeCharactersFrom(element, currentValue.length);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async click(): Promise<void> {
|
|
38
|
+
const element: ElementFinder = await this.nativeElement();
|
|
39
|
+
|
|
40
|
+
return element.click();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async doubleClick(): Promise<void> {
|
|
44
|
+
const element: ElementFinder = await this.nativeElement();
|
|
45
|
+
const webElement: WebElement = await element.getWebElement();
|
|
46
|
+
|
|
47
|
+
return promised(
|
|
48
|
+
webElement.getDriver().actions()
|
|
49
|
+
.mouseMove(webElement)
|
|
50
|
+
.doubleClick()
|
|
51
|
+
.perform()
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async enterValue(value: string | number | Array<string | number>): Promise<void> {
|
|
56
|
+
const element: ElementFinder = await this.nativeElement();
|
|
57
|
+
|
|
58
|
+
return element.sendKeys(
|
|
59
|
+
[].concat(value).join('')
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async scrollIntoView(): Promise<void> {
|
|
64
|
+
const element: ElementFinder = await this.nativeElement();
|
|
65
|
+
const webElement: WebElement = await element.getWebElement();
|
|
66
|
+
|
|
67
|
+
return promised(
|
|
68
|
+
webElement.getDriver().executeScript('arguments[0].scrollIntoView(true);', webElement)
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async hoverOver(): Promise<void> {
|
|
73
|
+
const element: ElementFinder = await this.nativeElement();
|
|
74
|
+
const webElement: WebElement = await element.getWebElement();
|
|
75
|
+
|
|
76
|
+
return promised(
|
|
77
|
+
webElement.getDriver().actions()
|
|
78
|
+
.mouseMove(webElement)
|
|
79
|
+
.perform()
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async rightClick(): Promise<void> {
|
|
84
|
+
const element: ElementFinder = await this.nativeElement();
|
|
85
|
+
const webElement: WebElement = await element.getWebElement();
|
|
86
|
+
|
|
87
|
+
return promised(
|
|
88
|
+
webElement.getDriver().actions()
|
|
89
|
+
.mouseMove(webElement)
|
|
90
|
+
.click(protractor.Button.RIGHT)
|
|
91
|
+
.perform()
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async attribute(name: string): Promise<string> {
|
|
96
|
+
const element: ElementFinder = await this.nativeElement();
|
|
97
|
+
|
|
98
|
+
return element.getAttribute(name);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async text(): Promise<string> {
|
|
102
|
+
const element: ElementFinder = await this.nativeElement();
|
|
103
|
+
|
|
104
|
+
return element.getText();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async value(): Promise<string> {
|
|
108
|
+
const element: ElementFinder = await this.nativeElement();
|
|
109
|
+
const webElement: WebElement = await element.getWebElement();
|
|
110
|
+
|
|
111
|
+
return promised(webElement.getDriver().executeScript(
|
|
112
|
+
/* istanbul ignore next */
|
|
113
|
+
function getValue(webElement) {
|
|
114
|
+
return webElement.value;
|
|
115
|
+
},
|
|
116
|
+
webElement,
|
|
117
|
+
));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async isActive(): Promise<boolean> {
|
|
121
|
+
const element: ElementFinder = await this.nativeElement();
|
|
122
|
+
const webElement: WebElement = await element.getWebElement();
|
|
123
|
+
|
|
124
|
+
return webElement.getDriver().switchTo().activeElement().then((active: WebElement) =>
|
|
125
|
+
element.equals(active),
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async isClickable(): Promise<boolean> {
|
|
130
|
+
return this.isEnabled();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async isEnabled(): Promise<boolean> {
|
|
134
|
+
const element: ElementFinder = await this.nativeElement();
|
|
135
|
+
|
|
136
|
+
return element.isEnabled();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async isPresent(): Promise<boolean> {
|
|
140
|
+
const element: ElementFinder = await this.nativeElement();
|
|
141
|
+
|
|
142
|
+
return element.isPresent();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async isSelected(): Promise<boolean> {
|
|
146
|
+
const element: ElementFinder = await this.nativeElement();
|
|
147
|
+
|
|
148
|
+
return element.isSelected();
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async isVisible(): Promise<boolean> {
|
|
152
|
+
const element: ElementFinder = await this.nativeElement();
|
|
153
|
+
|
|
154
|
+
if (! await element.isDisplayed()) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const webElement: WebElement = await element.getWebElement();
|
|
159
|
+
|
|
160
|
+
// get element at cx/cy and see if the element we found is our element, and therefore it's visible.
|
|
161
|
+
return promised(webElement.getDriver().executeScript(
|
|
162
|
+
`
|
|
163
|
+
var element = arguments[0];
|
|
164
|
+
|
|
165
|
+
if (!element.getBoundingClientRect || !element.scrollIntoView || !element.contains || !element.getClientRects || !document.elementFromPoint) {
|
|
166
|
+
return false
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Edge before switching to Chromium
|
|
170
|
+
const isOldEdge = !!window['StyleMedia']
|
|
171
|
+
// returns true for Chrome and Firefox and false for Safari, Edge and IE
|
|
172
|
+
const scrollIntoViewFullSupport = !(window.safari || isOldEdge)
|
|
173
|
+
|
|
174
|
+
// get overlapping element
|
|
175
|
+
function getOverlappingElement (elem, context) {
|
|
176
|
+
context = context || document
|
|
177
|
+
const elemDimension = elem.getBoundingClientRect()
|
|
178
|
+
const x = elemDimension.left + (elem.clientWidth / 2)
|
|
179
|
+
const y = elemDimension.top + (elem.clientHeight / 2)
|
|
180
|
+
return context.elementFromPoint(x, y)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// get overlapping element rects (currently only the first)
|
|
184
|
+
// applicable if element's text is multiline.
|
|
185
|
+
function getOverlappingRects (elem, context) {
|
|
186
|
+
context = context || document
|
|
187
|
+
const elems = []
|
|
188
|
+
|
|
189
|
+
const rects = elem.getClientRects()
|
|
190
|
+
// webdriver clicks on center of the first element's rect (line of text), it might change in future
|
|
191
|
+
const rect = rects[0]
|
|
192
|
+
const x = rect.left + (rect.width / 2)
|
|
193
|
+
const y = rect.top + (rect.height / 2)
|
|
194
|
+
elems.push(context.elementFromPoint(x, y))
|
|
195
|
+
|
|
196
|
+
return elems
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// get overlapping elements
|
|
200
|
+
function getOverlappingElements (elem, context) {
|
|
201
|
+
return [getOverlappingElement(elem, context)].concat(getOverlappingRects(elem, context))
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// is a node a descendant of a given node
|
|
205
|
+
function nodeContains (elem, otherNode) {
|
|
206
|
+
// Edge doesn't support neither Shadow Dom nor contains if ShadowRoot polyfill is used
|
|
207
|
+
if (isOldEdge) {
|
|
208
|
+
let tmpElement = otherNode
|
|
209
|
+
while (tmpElement) {
|
|
210
|
+
if (tmpElement === elem) {
|
|
211
|
+
return true
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
tmpElement = tmpElement.parentNode
|
|
215
|
+
// DocumentFragment / ShadowRoot polyfill like ShadyRoot
|
|
216
|
+
if (tmpElement && tmpElement.nodeType === 11 && tmpElement.host) {
|
|
217
|
+
tmpElement = tmpElement.host
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return false
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return elem.contains(otherNode)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// is one of overlapping elements the \`elem\` or one of its child
|
|
227
|
+
function isOverlappingElementMatch (elementsFromPoint, elem) {
|
|
228
|
+
if (elementsFromPoint.some(function (elementFromPoint) {
|
|
229
|
+
return elementFromPoint === elem || nodeContains(elem, elementFromPoint)
|
|
230
|
+
})) {
|
|
231
|
+
return true
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// shadow root
|
|
235
|
+
// filter unique elements with shadowRoot
|
|
236
|
+
// @ts-ignore
|
|
237
|
+
let elemsWithShadowRoot = [].concat(elementsFromPoint)
|
|
238
|
+
elemsWithShadowRoot = elemsWithShadowRoot.filter(function (x) {
|
|
239
|
+
return x && x.shadowRoot && x.shadowRoot.elementFromPoint
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
// getOverlappingElements of every element with shadowRoot
|
|
243
|
+
let shadowElementsFromPoint = []
|
|
244
|
+
for (let i = 0; i < elemsWithShadowRoot.length; ++i) {
|
|
245
|
+
let shadowElement = elemsWithShadowRoot[i]
|
|
246
|
+
shadowElementsFromPoint = shadowElementsFromPoint.concat(
|
|
247
|
+
getOverlappingElements(elem, shadowElement.shadowRoot)
|
|
248
|
+
)
|
|
249
|
+
}
|
|
250
|
+
// remove duplicates and parents
|
|
251
|
+
// @ts-ignore
|
|
252
|
+
shadowElementsFromPoint = [].concat(shadowElementsFromPoint)
|
|
253
|
+
shadowElementsFromPoint = shadowElementsFromPoint.filter(function (x) {
|
|
254
|
+
return !elementsFromPoint.includes(x)
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
if (shadowElementsFromPoint.length === 0) {
|
|
258
|
+
return false
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return isOverlappingElementMatch(shadowElementsFromPoint, elem)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function isElementInViewport (elem) {
|
|
265
|
+
if (!elem.getBoundingClientRect) {
|
|
266
|
+
return false
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const rect = elem.getBoundingClientRect()
|
|
270
|
+
|
|
271
|
+
const windowHeight = (window.innerHeight || document.documentElement.clientHeight)
|
|
272
|
+
const windowWidth = (window.innerWidth || document.documentElement.clientWidth)
|
|
273
|
+
|
|
274
|
+
const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) > 0)
|
|
275
|
+
const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) > 0)
|
|
276
|
+
|
|
277
|
+
return (vertInView && horInView)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return isElementInViewport(element) && isOverlappingElementMatch(getOverlappingElements(element), element);
|
|
281
|
+
`,
|
|
282
|
+
webElement,
|
|
283
|
+
));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Locator, PageElement, Selector } from '@serenity-js/web';
|
|
2
|
+
import { ElementFinder, Locator as ProtractorNativeLocator, ProtractorBrowser } from 'protractor';
|
|
3
|
+
|
|
4
|
+
import { unpromisedWebElement } from '../../unpromisedWebElement';
|
|
5
|
+
import { ProtractorPageElement } from '../ProtractorPageElement';
|
|
6
|
+
import { ProtractorNativeElementRoot } from './ProtractorNativeElementRoot';
|
|
7
|
+
|
|
8
|
+
export class ProtractorLocator<Selector_Type extends Selector> extends Locator<ElementFinder, ProtractorNativeElementRoot, Selector_Type> {
|
|
9
|
+
|
|
10
|
+
static createRootLocator<ST extends Selector>(browser: ProtractorBrowser, selector: ST, protractorBy: ProtractorNativeLocator): ProtractorLocator<ST> {
|
|
11
|
+
const parentRoot: ProtractorNativeElementRoot = {
|
|
12
|
+
element: browser.element.bind(browser),
|
|
13
|
+
all: browser.element.all.bind(browser),
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return new ProtractorLocator(
|
|
17
|
+
() => parentRoot,
|
|
18
|
+
selector,
|
|
19
|
+
(root: ProtractorNativeElementRoot) => unpromisedWebElement(root.element(protractorBy)),
|
|
20
|
+
async (root: ProtractorNativeElementRoot) => root.all(protractorBy)
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
of(parent: ProtractorLocator<unknown>): Locator<ElementFinder, ProtractorNativeElementRoot, Selector_Type> {
|
|
25
|
+
return new ProtractorLocator(
|
|
26
|
+
() => parent.nativeElement(),
|
|
27
|
+
this.selector,
|
|
28
|
+
(parentRoot: ProtractorNativeElementRoot) => this.locateElement(parentRoot),
|
|
29
|
+
(parentRoot: ProtractorNativeElementRoot) => this.locateAllElements(parentRoot),
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
element(): PageElement<ElementFinder> {
|
|
34
|
+
return new ProtractorPageElement(this);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async allElements(): Promise<Array<PageElement<ElementFinder>>> {
|
|
38
|
+
const parentRoot = await this.parentRoot()
|
|
39
|
+
const elements = await this.locateAllElements(parentRoot);
|
|
40
|
+
|
|
41
|
+
return Promise.all(elements.map(childElement =>
|
|
42
|
+
new ProtractorPageElement(new ProtractorLocator(
|
|
43
|
+
this.parentRoot,
|
|
44
|
+
this.selector,
|
|
45
|
+
() => unpromisedWebElement(childElement),
|
|
46
|
+
() => [ unpromisedWebElement(childElement) ],
|
|
47
|
+
))
|
|
48
|
+
));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @param promiseLike
|
|
8
8
|
* @returns {Promise<T>}
|
|
9
9
|
*/
|
|
10
|
-
export function
|
|
10
|
+
export function promised<T>(promiseLike: PromiseLike<T>): Promise<T> {
|
|
11
11
|
return new Promise((resolve, reject) => {
|
|
12
12
|
promiseLike.then(resolve, reject);
|
|
13
13
|
});
|