@serenity-js/protractor 3.4.2 → 3.6.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/CHANGELOG.md +27 -0
- package/lib/adapter/Config.d.ts +2 -2
- package/lib/adapter/Config.d.ts.map +1 -1
- package/lib/adapter/ProtractorFrameworkAdapter.d.ts +3 -3
- package/lib/adapter/ProtractorFrameworkAdapter.d.ts.map +1 -1
- package/lib/adapter/ProtractorFrameworkAdapter.js.map +1 -1
- package/lib/adapter/browser-detector/BrowserDetector.d.ts +4 -4
- package/lib/adapter/browser-detector/BrowserDetector.d.ts.map +1 -1
- package/lib/adapter/browser-detector/BrowserDetector.js.map +1 -1
- package/lib/adapter/browser-detector/StandardisedCapabilities.d.ts +1 -1
- package/lib/adapter/browser-detector/StandardisedCapabilities.d.ts.map +1 -1
- package/lib/adapter/reporter/ProtractorReport.d.ts +1 -1
- package/lib/adapter/reporter/ProtractorReport.d.ts.map +1 -1
- package/lib/adapter/reporter/ProtractorReporter.d.ts +6 -6
- package/lib/adapter/reporter/ProtractorReporter.d.ts.map +1 -1
- package/lib/adapter/reporter/ProtractorReporter.js.map +1 -1
- package/lib/adapter/run.d.ts +2 -2
- package/lib/adapter/run.d.ts.map +1 -1
- package/lib/adapter/runner/TestRunnerDetector.d.ts +3 -3
- package/lib/adapter/runner/TestRunnerDetector.d.ts.map +1 -1
- package/lib/adapter/runner/TestRunnerDetector.js +1 -1
- package/lib/adapter/runner/TestRunnerDetector.js.map +1 -1
- package/lib/adapter/runner/TestRunnerLoader.d.ts +2 -2
- package/lib/adapter/runner/TestRunnerLoader.d.ts.map +1 -1
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts +2 -3
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts.map +1 -1
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js +0 -9
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js.map +1 -1
- package/lib/screenplay/models/ProtractorBrowsingSession.d.ts +3 -2
- package/lib/screenplay/models/ProtractorBrowsingSession.d.ts.map +1 -1
- package/lib/screenplay/models/ProtractorBrowsingSession.js +8 -1
- package/lib/screenplay/models/ProtractorBrowsingSession.js.map +1 -1
- package/lib/screenplay/models/ProtractorCookie.d.ts +3 -2
- package/lib/screenplay/models/ProtractorCookie.d.ts.map +1 -1
- package/lib/screenplay/models/ProtractorCookie.js.map +1 -1
- package/lib/screenplay/models/ProtractorModalDialogHandler.d.ts +4 -3
- package/lib/screenplay/models/ProtractorModalDialogHandler.d.ts.map +1 -1
- package/lib/screenplay/models/ProtractorModalDialogHandler.js.map +1 -1
- package/lib/screenplay/models/ProtractorPage.d.ts +7 -5
- package/lib/screenplay/models/ProtractorPage.d.ts.map +1 -1
- package/lib/screenplay/models/ProtractorPage.js +4 -0
- package/lib/screenplay/models/ProtractorPage.js.map +1 -1
- package/lib/screenplay/models/ProtractorPageElement.d.ts +3 -2
- package/lib/screenplay/models/ProtractorPageElement.d.ts.map +1 -1
- package/lib/screenplay/models/ProtractorPageElement.js.map +1 -1
- package/lib/screenplay/models/locators/ProtractorLocator.d.ts +14 -3
- package/lib/screenplay/models/locators/ProtractorLocator.d.ts.map +1 -1
- package/lib/screenplay/models/locators/ProtractorLocator.js +7 -52
- package/lib/screenplay/models/locators/ProtractorLocator.js.map +1 -1
- package/lib/screenplay/models/locators/ProtractorRootLocator.d.ts +1 -1
- package/lib/screenplay/models/locators/ProtractorRootLocator.d.ts.map +1 -1
- package/lib/screenplay/models/locators/ProtractorSelectors.d.ts +10 -0
- package/lib/screenplay/models/locators/ProtractorSelectors.d.ts.map +1 -0
- package/lib/screenplay/models/locators/ProtractorSelectors.js +79 -0
- package/lib/screenplay/models/locators/ProtractorSelectors.js.map +1 -0
- package/lib/screenplay/questions/ProtractorParam.d.ts +1 -1
- package/lib/screenplay/questions/ProtractorParam.d.ts.map +1 -1
- package/lib/screenplay/questions/ProtractorParam.js +0 -1
- package/lib/screenplay/questions/ProtractorParam.js.map +1 -1
- package/lib/screenplay/unpromisedWebElement.d.ts +1 -1
- package/lib/screenplay/unpromisedWebElement.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/adapter/Config.ts +2 -2
- package/src/adapter/ProtractorFrameworkAdapter.ts +7 -4
- package/src/adapter/browser-detector/BrowserDetector.ts +5 -4
- package/src/adapter/browser-detector/StandardisedCapabilities.ts +1 -1
- package/src/adapter/reporter/ProtractorReport.ts +1 -1
- package/src/adapter/reporter/ProtractorReporter.ts +9 -7
- package/src/adapter/run.ts +2 -2
- package/src/adapter/runner/TestRunnerDetector.ts +3 -3
- package/src/adapter/runner/TestRunnerLoader.ts +3 -3
- package/src/screenplay/abilities/BrowseTheWebWithProtractor.ts +2 -13
- package/src/screenplay/interactions/UseAngular.ts +1 -1
- package/src/screenplay/models/ProtractorBrowsingSession.ts +15 -5
- package/src/screenplay/models/ProtractorCookie.ts +3 -2
- package/src/screenplay/models/ProtractorModalDialogHandler.ts +4 -3
- package/src/screenplay/models/ProtractorPage.ts +19 -6
- package/src/screenplay/models/ProtractorPageElement.ts +6 -4
- package/src/screenplay/models/locators/ProtractorLocator.ts +10 -38
- package/src/screenplay/models/locators/ProtractorRootLocator.ts +1 -1
- package/src/screenplay/models/locators/ProtractorSelectors.ts +65 -0
- package/src/screenplay/questions/ProtractorParam.ts +2 -1
- package/src/screenplay/unpromisedWebElement.ts +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import type { ModalDialog} from '@serenity-js/web';
|
|
2
|
+
import { AbsentModalDialog, AcceptedModalDialog, DismissedModalDialog, ModalDialogHandler } from '@serenity-js/web';
|
|
3
|
+
import type * as protractor from 'protractor';
|
|
3
4
|
import { error as errors } from 'protractor';
|
|
4
5
|
|
|
5
6
|
import { promised } from '../promised';
|
|
6
|
-
import { ProtractorErrorHandler } from './ProtractorErrorHandler';
|
|
7
|
+
import type { ProtractorErrorHandler } from './ProtractorErrorHandler';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Protractor-specific implementation of {@apilink ModalDialogHandler}.
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { LogicError } from '@serenity-js/core';
|
|
2
|
-
import { CorrelationId } from '@serenity-js/core/lib/model';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import type { CorrelationId } from '@serenity-js/core/lib/model';
|
|
3
|
+
import type { Cookie, CookieData, ModalDialogHandler, PageElement, Selector } from '@serenity-js/web';
|
|
4
|
+
import { BrowserWindowClosedError, Key, Page, PageElements } from '@serenity-js/web';
|
|
5
|
+
import type { ElementFinder, ProtractorBrowser } from 'protractor';
|
|
5
6
|
import { URL } from 'url';
|
|
6
7
|
|
|
7
8
|
import { promised } from '../promised';
|
|
8
|
-
import { ProtractorLocator, ProtractorRootLocator } from './locators';
|
|
9
|
-
import {
|
|
9
|
+
import { ProtractorExistingElementLocator, ProtractorLocator, ProtractorRootLocator } from './locators';
|
|
10
|
+
import { ProtractorSelectors } from './locators/ProtractorSelectors';
|
|
11
|
+
import type { ProtractorBrowsingSession } from './ProtractorBrowsingSession';
|
|
10
12
|
import { ProtractorCookie } from './ProtractorCookie';
|
|
11
|
-
import { ProtractorErrorHandler } from './ProtractorErrorHandler';
|
|
13
|
+
import type { ProtractorErrorHandler } from './ProtractorErrorHandler';
|
|
12
14
|
import { ProtractorPageElement } from './ProtractorPageElement';
|
|
13
15
|
|
|
14
16
|
/**
|
|
@@ -38,6 +40,17 @@ export class ProtractorPage extends Page<ElementFinder> {
|
|
|
38
40
|
);
|
|
39
41
|
}
|
|
40
42
|
|
|
43
|
+
createPageElement(nativeElement: ElementFinder): PageElement<ElementFinder> {
|
|
44
|
+
return new ProtractorPageElement(
|
|
45
|
+
new ProtractorExistingElementLocator(
|
|
46
|
+
this.rootLocator as ProtractorRootLocator,
|
|
47
|
+
ProtractorSelectors.selectorFrom(nativeElement.locator()),
|
|
48
|
+
this.errorHandler,
|
|
49
|
+
nativeElement,
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
41
54
|
locate(selector: Selector): PageElement<ElementFinder> {
|
|
42
55
|
return new ProtractorPageElement(
|
|
43
56
|
new ProtractorLocator(this.rootLocator, selector, this.errorHandler)
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { LogicError } from '@serenity-js/core';
|
|
2
|
-
import {
|
|
2
|
+
import type { SwitchableOrigin } from '@serenity-js/web';
|
|
3
|
+
import { PageElement, SelectOption } from '@serenity-js/web';
|
|
3
4
|
import * as scripts from '@serenity-js/web/lib/scripts';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import type { ElementFinder} from 'protractor';
|
|
6
|
+
import { by, protractor } from 'protractor';
|
|
7
|
+
import type { Locator, WebElement } from 'selenium-webdriver';
|
|
6
8
|
|
|
7
9
|
import { promised } from '../promised';
|
|
8
|
-
import { ProtractorLocator } from './locators';
|
|
10
|
+
import type { ProtractorLocator } from './locators';
|
|
9
11
|
|
|
10
12
|
/**
|
|
11
13
|
* Protractor-specific implementation of {@apilink PageElement}.
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import * as protractor from 'protractor';
|
|
1
|
+
import type { PageElement, RootLocator, Selector } from '@serenity-js/web';
|
|
2
|
+
import { Locator } from '@serenity-js/web';
|
|
3
|
+
import type * as protractor from 'protractor';
|
|
4
4
|
|
|
5
5
|
import { unpromisedWebElement } from '../../unpromisedWebElement';
|
|
6
|
-
import { ProtractorErrorHandler } from '../ProtractorErrorHandler';
|
|
6
|
+
import type { ProtractorErrorHandler } from '../ProtractorErrorHandler';
|
|
7
7
|
import { ProtractorPageElement } from '../ProtractorPageElement';
|
|
8
|
-
import { ProtractorRootLocator } from './ProtractorRootLocator';
|
|
8
|
+
import type { ProtractorRootLocator } from './ProtractorRootLocator';
|
|
9
|
+
import { ProtractorSelectors } from './ProtractorSelectors';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Protractor-specific implementation of {@apilink Locator}.
|
|
@@ -22,37 +23,8 @@ export class ProtractorLocator extends Locator<protractor.ElementFinder, protrac
|
|
|
22
23
|
super(parent, selector);
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
// todo: refactor; replace with a map and some more generic lookup mechanism
|
|
26
26
|
protected nativeSelector(): protractor.Locator {
|
|
27
|
-
|
|
28
|
-
return protractor.by.css(this.selector.value);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (this.selector instanceof ByDeepCss) {
|
|
32
|
-
if (! protractor.by.shadowDomCss) {
|
|
33
|
-
throw new LogicError(`By.deepCss() requires query-selector-shadow-dom plugin, which Serenity/JS ProtractorFrameworkAdapter registers by default. If you're using Serenity/JS without ProtractorFrameworkAdapter, please register the plugin yourself.`)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return protractor.by.shadowDomCss(this.selector.value.replace('>>>', '').trim());
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (this.selector instanceof ByCssContainingText) {
|
|
40
|
-
return protractor.by.cssContainingText(this.selector.value, this.selector.text);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (this.selector instanceof ById) {
|
|
44
|
-
return protractor.by.id(this.selector.value);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (this.selector instanceof ByTagName) {
|
|
48
|
-
return protractor.by.tagName(this.selector.value);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (this.selector instanceof ByXPath) {
|
|
52
|
-
return protractor.by.xpath(this.selector.value);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
throw new LogicError(f `${ this.selector } is not supported by ${ this.constructor.name }`);
|
|
27
|
+
return ProtractorSelectors.locatorFrom(this.selector);
|
|
56
28
|
}
|
|
57
29
|
|
|
58
30
|
async isPresent(): Promise<boolean> {
|
|
@@ -106,7 +78,7 @@ export class ProtractorLocator extends Locator<protractor.ElementFinder, protrac
|
|
|
106
78
|
|
|
107
79
|
return Promise.all(elements.map(childElement =>
|
|
108
80
|
new ProtractorPageElement(
|
|
109
|
-
new
|
|
81
|
+
new ProtractorExistingElementLocator(
|
|
110
82
|
this.parent as ProtractorRootLocator,
|
|
111
83
|
this.selector,
|
|
112
84
|
this.errorHandler,
|
|
@@ -118,9 +90,9 @@ export class ProtractorLocator extends Locator<protractor.ElementFinder, protrac
|
|
|
118
90
|
}
|
|
119
91
|
|
|
120
92
|
/**
|
|
121
|
-
* @
|
|
93
|
+
* @internal
|
|
122
94
|
*/
|
|
123
|
-
class
|
|
95
|
+
export class ProtractorExistingElementLocator extends ProtractorLocator {
|
|
124
96
|
constructor(
|
|
125
97
|
parent: ProtractorRootLocator,
|
|
126
98
|
selector: Selector,
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { f, LogicError } from '@serenity-js/core';
|
|
2
|
+
import { ByCss, ByCssContainingText, ByDeepCss, ById, ByTagName, ByXPath, type Selector } from '@serenity-js/web';
|
|
3
|
+
import * as protractor from 'protractor';
|
|
4
|
+
|
|
5
|
+
export class ProtractorSelectors {
|
|
6
|
+
static selectorFrom(nativeLocator: protractor.Locator & { using?: string, value: string }): Selector {
|
|
7
|
+
|
|
8
|
+
switch (true) {
|
|
9
|
+
case nativeLocator.using === 'xpath':
|
|
10
|
+
return new ByXPath(nativeLocator.value);
|
|
11
|
+
|
|
12
|
+
case nativeLocator.toString().startsWith('by.shadowDomCss'): {
|
|
13
|
+
const [ , selector ] = nativeLocator.toString().match(/by\.shadowDomCss\("(.*)"\)$/);
|
|
14
|
+
return new ByDeepCss(selector);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
case nativeLocator.toString().startsWith('by.cssContainingText'): {
|
|
18
|
+
// https://github.com/angular/protractor/blob/4bc80d1a459542d883ea9200e4e1f48d265d0fda/lib/locators.ts#L428
|
|
19
|
+
const [ , selector, text ] = nativeLocator.toString().match(/by\.cssContainingText\("(.*)", "(.*)"\)$/);
|
|
20
|
+
return new ByCssContainingText(selector, text);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
case nativeLocator.using === 'css selector' && nativeLocator.value.startsWith('*[id='): {
|
|
24
|
+
const [ , selector ] = nativeLocator.value.match(/\*\[id="(.*)"]$/)
|
|
25
|
+
return new ById(selector);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// case nativeLocator.using === 'css selector':
|
|
29
|
+
default:
|
|
30
|
+
return new ByCss(nativeLocator.value);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static locatorFrom(selector: Selector): protractor.Locator {
|
|
35
|
+
if (selector instanceof ByCss) {
|
|
36
|
+
return protractor.by.css(selector.value);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (selector instanceof ByDeepCss) {
|
|
40
|
+
if (! protractor.by.shadowDomCss) {
|
|
41
|
+
throw new LogicError(`By.deepCss() requires query-selector-shadow-dom plugin, which Serenity/JS ProtractorFrameworkAdapter registers by default. If you're using Serenity/JS without ProtractorFrameworkAdapter, please register the plugin yourself.`)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return protractor.by.shadowDomCss(selector.value.replace('>>>', '').trim());
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (selector instanceof ByCssContainingText) {
|
|
48
|
+
return protractor.by.cssContainingText(selector.value, selector.text);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (selector instanceof ById) {
|
|
52
|
+
return protractor.by.id(selector.value);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (selector instanceof ByTagName) {
|
|
56
|
+
return protractor.by.tagName(selector.value);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (selector instanceof ByXPath) {
|
|
60
|
+
return protractor.by.xpath(selector.value);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
throw new LogicError(f `${ selector } is not supported by ${ this.constructor.name }`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint-disable unicorn/prevent-abbreviations */
|
|
2
|
-
import { Answerable,
|
|
2
|
+
import type { Answerable, QuestionAdapter } from '@serenity-js/core';
|
|
3
|
+
import { d, Question } from '@serenity-js/core';
|
|
3
4
|
|
|
4
5
|
import { BrowseTheWebWithProtractor } from '../abilities';
|
|
5
6
|
|