@serenity-js/webdriverio-8 3.31.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 +1232 -0
- package/LICENSE.md +201 -0
- package/NOTICE.md +1 -0
- package/README.md +234 -0
- package/esm/adapter/TestRunnerLoader.d.ts +17 -0
- package/esm/adapter/TestRunnerLoader.d.ts.map +1 -0
- package/esm/adapter/TestRunnerLoader.js +63 -0
- package/esm/adapter/TestRunnerLoader.js.map +1 -0
- package/esm/adapter/WebdriverIOFrameworkAdapter.d.ts +25 -0
- package/esm/adapter/WebdriverIOFrameworkAdapter.d.ts.map +1 -0
- package/esm/adapter/WebdriverIOFrameworkAdapter.js +90 -0
- package/esm/adapter/WebdriverIOFrameworkAdapter.js.map +1 -0
- package/esm/adapter/WebdriverIOFrameworkAdapterFactory.d.ts +18 -0
- package/esm/adapter/WebdriverIOFrameworkAdapterFactory.d.ts.map +1 -0
- package/esm/adapter/WebdriverIOFrameworkAdapterFactory.js +18 -0
- package/esm/adapter/WebdriverIOFrameworkAdapterFactory.js.map +1 -0
- package/esm/adapter/WebdriverIONotifier.d.ts +71 -0
- package/esm/adapter/WebdriverIONotifier.d.ts.map +1 -0
- package/esm/adapter/WebdriverIONotifier.js +390 -0
- package/esm/adapter/WebdriverIONotifier.js.map +1 -0
- package/esm/adapter/index.d.ts +2 -0
- package/esm/adapter/index.d.ts.map +1 -0
- package/esm/adapter/index.js +2 -0
- package/esm/adapter/index.js.map +1 -0
- package/esm/adapter/reporter/BrowserCapabilitiesReporter.d.ts +18 -0
- package/esm/adapter/reporter/BrowserCapabilitiesReporter.d.ts.map +1 -0
- package/esm/adapter/reporter/BrowserCapabilitiesReporter.js +42 -0
- package/esm/adapter/reporter/BrowserCapabilitiesReporter.js.map +1 -0
- package/esm/adapter/reporter/InitialisesReporters.d.ts +8 -0
- package/esm/adapter/reporter/InitialisesReporters.d.ts.map +1 -0
- package/esm/adapter/reporter/InitialisesReporters.js +2 -0
- package/esm/adapter/reporter/InitialisesReporters.js.map +1 -0
- package/esm/adapter/reporter/OutputStreamBuffer.d.ts +13 -0
- package/esm/adapter/reporter/OutputStreamBuffer.d.ts.map +1 -0
- package/esm/adapter/reporter/OutputStreamBuffer.js +25 -0
- package/esm/adapter/reporter/OutputStreamBuffer.js.map +1 -0
- package/esm/adapter/reporter/OutputStreamBufferPrinter.d.ts +16 -0
- package/esm/adapter/reporter/OutputStreamBufferPrinter.d.ts.map +1 -0
- package/esm/adapter/reporter/OutputStreamBufferPrinter.js +24 -0
- package/esm/adapter/reporter/OutputStreamBufferPrinter.js.map +1 -0
- package/esm/adapter/reporter/ProvidesWriteStream.d.ts +8 -0
- package/esm/adapter/reporter/ProvidesWriteStream.d.ts.map +1 -0
- package/esm/adapter/reporter/ProvidesWriteStream.js +2 -0
- package/esm/adapter/reporter/ProvidesWriteStream.js.map +1 -0
- package/esm/adapter/reporter/TagPrinter.d.ts +17 -0
- package/esm/adapter/reporter/TagPrinter.d.ts.map +1 -0
- package/esm/adapter/reporter/TagPrinter.js +52 -0
- package/esm/adapter/reporter/TagPrinter.js.map +1 -0
- package/esm/adapter/reporter/index.d.ts +6 -0
- package/esm/adapter/reporter/index.d.ts.map +1 -0
- package/esm/adapter/reporter/index.js +6 -0
- package/esm/adapter/reporter/index.js.map +1 -0
- package/esm/api.d.ts +3 -0
- package/esm/api.d.ts.map +1 -0
- package/esm/api.js +2 -0
- package/esm/api.js.map +1 -0
- package/esm/config/WebdriverIOConfig.d.ts +95 -0
- package/esm/config/WebdriverIOConfig.d.ts.map +1 -0
- package/esm/config/WebdriverIOConfig.js +2 -0
- package/esm/config/WebdriverIOConfig.js.map +1 -0
- package/esm/config/index.d.ts +2 -0
- package/esm/config/index.d.ts.map +1 -0
- package/esm/config/index.js +2 -0
- package/esm/config/index.js.map +1 -0
- package/esm/index.d.ts +16 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +14 -0
- package/esm/index.js.map +1 -0
- package/esm/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts +40 -0
- package/esm/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts.map +1 -0
- package/esm/screenplay/abilities/BrowseTheWebWithWebdriverIO.js +43 -0
- package/esm/screenplay/abilities/BrowseTheWebWithWebdriverIO.js.map +1 -0
- package/esm/screenplay/abilities/index.d.ts +2 -0
- package/esm/screenplay/abilities/index.d.ts.map +1 -0
- package/esm/screenplay/abilities/index.js +2 -0
- package/esm/screenplay/abilities/index.js.map +1 -0
- package/esm/screenplay/index.d.ts +3 -0
- package/esm/screenplay/index.d.ts.map +1 -0
- package/esm/screenplay/index.js +3 -0
- package/esm/screenplay/index.js.map +1 -0
- package/esm/screenplay/models/WebdriverIOBrowsingSession.d.ts +25 -0
- package/esm/screenplay/models/WebdriverIOBrowsingSession.d.ts.map +1 -0
- package/esm/screenplay/models/WebdriverIOBrowsingSession.js +125 -0
- package/esm/screenplay/models/WebdriverIOBrowsingSession.js.map +1 -0
- package/esm/screenplay/models/WebdriverIOCookie.d.ts +15 -0
- package/esm/screenplay/models/WebdriverIOCookie.d.ts.map +1 -0
- package/esm/screenplay/models/WebdriverIOCookie.js +42 -0
- package/esm/screenplay/models/WebdriverIOCookie.js.map +1 -0
- package/esm/screenplay/models/WebdriverIOErrorHandler.d.ts +9 -0
- package/esm/screenplay/models/WebdriverIOErrorHandler.d.ts.map +1 -0
- package/esm/screenplay/models/WebdriverIOErrorHandler.js +20 -0
- package/esm/screenplay/models/WebdriverIOErrorHandler.js.map +1 -0
- package/esm/screenplay/models/WebdriverIOModalDialogHandler.d.ts +27 -0
- package/esm/screenplay/models/WebdriverIOModalDialogHandler.d.ts.map +1 -0
- package/esm/screenplay/models/WebdriverIOModalDialogHandler.js +74 -0
- package/esm/screenplay/models/WebdriverIOModalDialogHandler.js.map +1 -0
- package/esm/screenplay/models/WebdriverIOPage.d.ts +50 -0
- package/esm/screenplay/models/WebdriverIOPage.d.ts.map +1 -0
- package/esm/screenplay/models/WebdriverIOPage.js +219 -0
- package/esm/screenplay/models/WebdriverIOPage.js.map +1 -0
- package/esm/screenplay/models/WebdriverIOPageElement.d.ts +34 -0
- package/esm/screenplay/models/WebdriverIOPageElement.d.ts.map +1 -0
- package/esm/screenplay/models/WebdriverIOPageElement.js +220 -0
- package/esm/screenplay/models/WebdriverIOPageElement.js.map +1 -0
- package/esm/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts +30 -0
- package/esm/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts.map +1 -0
- package/esm/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js +77 -0
- package/esm/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js.map +1 -0
- package/esm/screenplay/models/WebdriverProtocolErrorCode.d.ts +39 -0
- package/esm/screenplay/models/WebdriverProtocolErrorCode.d.ts.map +1 -0
- package/esm/screenplay/models/WebdriverProtocolErrorCode.js +40 -0
- package/esm/screenplay/models/WebdriverProtocolErrorCode.js.map +1 -0
- package/esm/screenplay/models/index.d.ts +5 -0
- package/esm/screenplay/models/index.d.ts.map +1 -0
- package/esm/screenplay/models/index.js +5 -0
- package/esm/screenplay/models/index.js.map +1 -0
- package/esm/screenplay/models/locators/WebdriverIOLocator.d.ts +33 -0
- package/esm/screenplay/models/locators/WebdriverIOLocator.d.ts.map +1 -0
- package/esm/screenplay/models/locators/WebdriverIOLocator.js +123 -0
- package/esm/screenplay/models/locators/WebdriverIOLocator.js.map +1 -0
- package/esm/screenplay/models/locators/WebdriverIORootLocator.d.ts +17 -0
- package/esm/screenplay/models/locators/WebdriverIORootLocator.d.ts.map +1 -0
- package/esm/screenplay/models/locators/WebdriverIORootLocator.js +30 -0
- package/esm/screenplay/models/locators/WebdriverIORootLocator.js.map +1 -0
- package/esm/screenplay/models/locators/index.d.ts +3 -0
- package/esm/screenplay/models/locators/index.d.ts.map +1 -0
- package/esm/screenplay/models/locators/index.js +3 -0
- package/esm/screenplay/models/locators/index.js.map +1 -0
- package/lib/adapter/TestRunnerLoader.d.ts +17 -0
- package/lib/adapter/TestRunnerLoader.d.ts.map +1 -0
- package/lib/adapter/TestRunnerLoader.js +67 -0
- package/lib/adapter/TestRunnerLoader.js.map +1 -0
- package/lib/adapter/WebdriverIOFrameworkAdapter.d.ts +25 -0
- package/lib/adapter/WebdriverIOFrameworkAdapter.d.ts.map +1 -0
- package/lib/adapter/WebdriverIOFrameworkAdapter.js +127 -0
- package/lib/adapter/WebdriverIOFrameworkAdapter.js.map +1 -0
- package/lib/adapter/WebdriverIOFrameworkAdapterFactory.d.ts +18 -0
- package/lib/adapter/WebdriverIOFrameworkAdapterFactory.d.ts.map +1 -0
- package/lib/adapter/WebdriverIOFrameworkAdapterFactory.js +22 -0
- package/lib/adapter/WebdriverIOFrameworkAdapterFactory.js.map +1 -0
- package/lib/adapter/WebdriverIONotifier.d.ts +71 -0
- package/lib/adapter/WebdriverIONotifier.d.ts.map +1 -0
- package/lib/adapter/WebdriverIONotifier.js +394 -0
- package/lib/adapter/WebdriverIONotifier.js.map +1 -0
- package/lib/adapter/index.d.ts +2 -0
- package/lib/adapter/index.d.ts.map +1 -0
- package/lib/adapter/index.js +18 -0
- package/lib/adapter/index.js.map +1 -0
- package/lib/adapter/reporter/BrowserCapabilitiesReporter.d.ts +18 -0
- package/lib/adapter/reporter/BrowserCapabilitiesReporter.d.ts.map +1 -0
- package/lib/adapter/reporter/BrowserCapabilitiesReporter.js +49 -0
- package/lib/adapter/reporter/BrowserCapabilitiesReporter.js.map +1 -0
- package/lib/adapter/reporter/InitialisesReporters.d.ts +8 -0
- package/lib/adapter/reporter/InitialisesReporters.d.ts.map +1 -0
- package/lib/adapter/reporter/InitialisesReporters.js +3 -0
- package/lib/adapter/reporter/InitialisesReporters.js.map +1 -0
- package/lib/adapter/reporter/OutputStreamBuffer.d.ts +13 -0
- package/lib/adapter/reporter/OutputStreamBuffer.d.ts.map +1 -0
- package/lib/adapter/reporter/OutputStreamBuffer.js +29 -0
- package/lib/adapter/reporter/OutputStreamBuffer.js.map +1 -0
- package/lib/adapter/reporter/OutputStreamBufferPrinter.d.ts +16 -0
- package/lib/adapter/reporter/OutputStreamBufferPrinter.d.ts.map +1 -0
- package/lib/adapter/reporter/OutputStreamBufferPrinter.js +28 -0
- package/lib/adapter/reporter/OutputStreamBufferPrinter.js.map +1 -0
- package/lib/adapter/reporter/ProvidesWriteStream.d.ts +8 -0
- package/lib/adapter/reporter/ProvidesWriteStream.d.ts.map +1 -0
- package/lib/adapter/reporter/ProvidesWriteStream.js +3 -0
- package/lib/adapter/reporter/ProvidesWriteStream.js.map +1 -0
- package/lib/adapter/reporter/TagPrinter.d.ts +17 -0
- package/lib/adapter/reporter/TagPrinter.d.ts.map +1 -0
- package/lib/adapter/reporter/TagPrinter.js +56 -0
- package/lib/adapter/reporter/TagPrinter.js.map +1 -0
- package/lib/adapter/reporter/index.d.ts +6 -0
- package/lib/adapter/reporter/index.d.ts.map +1 -0
- package/lib/adapter/reporter/index.js +22 -0
- package/lib/adapter/reporter/index.js.map +1 -0
- package/lib/api.d.ts +3 -0
- package/lib/api.d.ts.map +1 -0
- package/lib/api.js +18 -0
- package/lib/api.js.map +1 -0
- package/lib/config/WebdriverIOConfig.d.ts +95 -0
- package/lib/config/WebdriverIOConfig.d.ts.map +1 -0
- package/lib/config/WebdriverIOConfig.js +3 -0
- package/lib/config/WebdriverIOConfig.js.map +1 -0
- package/lib/config/index.d.ts +2 -0
- package/lib/config/index.d.ts.map +1 -0
- package/lib/config/index.js +18 -0
- package/lib/config/index.js.map +1 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +52 -0
- package/lib/index.js.map +1 -0
- package/lib/package.json +1 -0
- package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts +40 -0
- package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts.map +1 -0
- package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.js +47 -0
- package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.js.map +1 -0
- package/lib/screenplay/abilities/index.d.ts +2 -0
- package/lib/screenplay/abilities/index.d.ts.map +1 -0
- package/lib/screenplay/abilities/index.js +18 -0
- package/lib/screenplay/abilities/index.js.map +1 -0
- package/lib/screenplay/index.d.ts +3 -0
- package/lib/screenplay/index.d.ts.map +1 -0
- package/lib/screenplay/index.js +19 -0
- package/lib/screenplay/index.js.map +1 -0
- package/lib/screenplay/models/WebdriverIOBrowsingSession.d.ts +25 -0
- package/lib/screenplay/models/WebdriverIOBrowsingSession.d.ts.map +1 -0
- package/lib/screenplay/models/WebdriverIOBrowsingSession.js +129 -0
- package/lib/screenplay/models/WebdriverIOBrowsingSession.js.map +1 -0
- package/lib/screenplay/models/WebdriverIOCookie.d.ts +15 -0
- package/lib/screenplay/models/WebdriverIOCookie.d.ts.map +1 -0
- package/lib/screenplay/models/WebdriverIOCookie.js +46 -0
- package/lib/screenplay/models/WebdriverIOCookie.js.map +1 -0
- package/lib/screenplay/models/WebdriverIOErrorHandler.d.ts +9 -0
- package/lib/screenplay/models/WebdriverIOErrorHandler.d.ts.map +1 -0
- package/lib/screenplay/models/WebdriverIOErrorHandler.js +24 -0
- package/lib/screenplay/models/WebdriverIOErrorHandler.js.map +1 -0
- package/lib/screenplay/models/WebdriverIOModalDialogHandler.d.ts +27 -0
- package/lib/screenplay/models/WebdriverIOModalDialogHandler.d.ts.map +1 -0
- package/lib/screenplay/models/WebdriverIOModalDialogHandler.js +78 -0
- package/lib/screenplay/models/WebdriverIOModalDialogHandler.js.map +1 -0
- package/lib/screenplay/models/WebdriverIOPage.d.ts +50 -0
- package/lib/screenplay/models/WebdriverIOPage.d.ts.map +1 -0
- package/lib/screenplay/models/WebdriverIOPage.js +256 -0
- package/lib/screenplay/models/WebdriverIOPage.js.map +1 -0
- package/lib/screenplay/models/WebdriverIOPageElement.d.ts +34 -0
- package/lib/screenplay/models/WebdriverIOPageElement.d.ts.map +1 -0
- package/lib/screenplay/models/WebdriverIOPageElement.js +257 -0
- package/lib/screenplay/models/WebdriverIOPageElement.js.map +1 -0
- package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts +30 -0
- package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts.map +1 -0
- package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js +81 -0
- package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js.map +1 -0
- package/lib/screenplay/models/WebdriverProtocolErrorCode.d.ts +39 -0
- package/lib/screenplay/models/WebdriverProtocolErrorCode.d.ts.map +1 -0
- package/lib/screenplay/models/WebdriverProtocolErrorCode.js +43 -0
- package/lib/screenplay/models/WebdriverProtocolErrorCode.js.map +1 -0
- package/lib/screenplay/models/index.d.ts +5 -0
- package/lib/screenplay/models/index.d.ts.map +1 -0
- package/lib/screenplay/models/index.js +21 -0
- package/lib/screenplay/models/index.js.map +1 -0
- package/lib/screenplay/models/locators/WebdriverIOLocator.d.ts +33 -0
- package/lib/screenplay/models/locators/WebdriverIOLocator.d.ts.map +1 -0
- package/lib/screenplay/models/locators/WebdriverIOLocator.js +128 -0
- package/lib/screenplay/models/locators/WebdriverIOLocator.js.map +1 -0
- package/lib/screenplay/models/locators/WebdriverIORootLocator.d.ts +17 -0
- package/lib/screenplay/models/locators/WebdriverIORootLocator.d.ts.map +1 -0
- package/lib/screenplay/models/locators/WebdriverIORootLocator.js +34 -0
- package/lib/screenplay/models/locators/WebdriverIORootLocator.js.map +1 -0
- package/lib/screenplay/models/locators/index.d.ts +3 -0
- package/lib/screenplay/models/locators/index.d.ts.map +1 -0
- package/lib/screenplay/models/locators/index.js +19 -0
- package/lib/screenplay/models/locators/index.js.map +1 -0
- package/package.json +122 -0
- package/src/adapter/TestRunnerLoader.ts +90 -0
- package/src/adapter/WebdriverIOFrameworkAdapter.ts +130 -0
- package/src/adapter/WebdriverIOFrameworkAdapterFactory.ts +39 -0
- package/src/adapter/WebdriverIONotifier.ts +480 -0
- package/src/adapter/index.ts +1 -0
- package/src/adapter/reporter/BrowserCapabilitiesReporter.ts +63 -0
- package/src/adapter/reporter/InitialisesReporters.ts +8 -0
- package/src/adapter/reporter/OutputStreamBuffer.ts +30 -0
- package/src/adapter/reporter/OutputStreamBufferPrinter.ts +30 -0
- package/src/adapter/reporter/ProvidesWriteStream.ts +8 -0
- package/src/adapter/reporter/TagPrinter.ts +69 -0
- package/src/adapter/reporter/index.ts +5 -0
- package/src/api.ts +2 -0
- package/src/config/WebdriverIOConfig.ts +94 -0
- package/src/config/index.ts +1 -0
- package/src/index.ts +32 -0
- package/src/screenplay/abilities/BrowseTheWebWithWebdriverIO.ts +46 -0
- package/src/screenplay/abilities/index.ts +1 -0
- package/src/screenplay/index.ts +2 -0
- package/src/screenplay/models/WebdriverIOBrowsingSession.ts +176 -0
- package/src/screenplay/models/WebdriverIOCookie.ts +51 -0
- package/src/screenplay/models/WebdriverIOErrorHandler.ts +25 -0
- package/src/screenplay/models/WebdriverIOModalDialogHandler.ts +99 -0
- package/src/screenplay/models/WebdriverIOPage.ts +311 -0
- package/src/screenplay/models/WebdriverIOPageElement.ts +280 -0
- package/src/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.ts +100 -0
- package/src/screenplay/models/WebdriverProtocolErrorCode.ts +38 -0
- package/src/screenplay/models/index.ts +4 -0
- package/src/screenplay/models/locators/WebdriverIOLocator.ts +176 -0
- package/src/screenplay/models/locators/WebdriverIORootLocator.ts +34 -0
- package/src/screenplay/models/locators/index.ts +2 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import 'webdriverio';
|
|
2
|
+
import { LogicError } from '@serenity-js/core';
|
|
3
|
+
import { CorrelationId } from '@serenity-js/core/lib/model/index.js';
|
|
4
|
+
import { BrowsingSession } from '@serenity-js/web';
|
|
5
|
+
import { WebdriverIOPage } from '../models/index.js';
|
|
6
|
+
import { WebdriverIOErrorHandler } from './WebdriverIOErrorHandler.js';
|
|
7
|
+
import { WebdriverIOModalDialogHandler } from './WebdriverIOModalDialogHandler.js';
|
|
8
|
+
import { WebdriverIOPuppeteerModalDialogHandler } from './WebdriverIOPuppeteerModalDialogHandler.js';
|
|
9
|
+
/**
|
|
10
|
+
* WebdriverIO-specific implementation of [`BrowsingSession`](https://serenity-js.org/api/web/class/BrowsingSession/).
|
|
11
|
+
*
|
|
12
|
+
* @group Models
|
|
13
|
+
*/
|
|
14
|
+
export class WebdriverIOBrowsingSession extends BrowsingSession {
|
|
15
|
+
browser;
|
|
16
|
+
constructor(browser) {
|
|
17
|
+
super();
|
|
18
|
+
this.browser = browser;
|
|
19
|
+
if (!browser.$ || !browser.$$) {
|
|
20
|
+
throw new LogicError(`WebdriverIO browser object is not initialised yet, so can't be assigned to an actor. Are you trying to instantiate an actor outside of a test or a test hook?`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async allPages() {
|
|
24
|
+
// scan all the active window handles and add any newly opened windows if needed
|
|
25
|
+
const windowHandles = await this.browser.getWindowHandles();
|
|
26
|
+
// remove pages that are no longer open
|
|
27
|
+
const closedPageIds = this.registeredPageIds()
|
|
28
|
+
.filter(id => !windowHandles.includes(id.value));
|
|
29
|
+
this.deregister(...closedPageIds);
|
|
30
|
+
// add any new pages that might have been opened (e.g. popup windows)
|
|
31
|
+
const registeredWindowHandles = new Set(this.registeredPageIds().map(id => id.value));
|
|
32
|
+
const newlyOpenedWindowHandles = windowHandles.filter(windowHandle => !registeredWindowHandles.has(windowHandle));
|
|
33
|
+
for (const newlyOpenedWindowHandle of newlyOpenedWindowHandles) {
|
|
34
|
+
const errorHandler = new WebdriverIOErrorHandler();
|
|
35
|
+
this.register(new WebdriverIOPage(this, this.browser, await this.modalDialogHandlerFor(newlyOpenedWindowHandle, errorHandler), errorHandler, new CorrelationId(newlyOpenedWindowHandle)));
|
|
36
|
+
}
|
|
37
|
+
return super.allPages();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* @param page
|
|
41
|
+
*/
|
|
42
|
+
async changeCurrentPageTo(page) {
|
|
43
|
+
const currentPage = await this.currentPage();
|
|
44
|
+
// are we already on this page?
|
|
45
|
+
if (currentPage.id.equals(page.id)) {
|
|
46
|
+
return void 0;
|
|
47
|
+
}
|
|
48
|
+
// does the new page exist, or has it been closed in the meantime by user action, script, or similar?
|
|
49
|
+
if (!await page.isPresent()) {
|
|
50
|
+
return void 0;
|
|
51
|
+
}
|
|
52
|
+
// the page seems to be legit, switch to it
|
|
53
|
+
await this.browser.switchToWindow(page.id.value);
|
|
54
|
+
// and update the cached reference
|
|
55
|
+
await super.changeCurrentPageTo(page);
|
|
56
|
+
}
|
|
57
|
+
async activeWindowHandle() {
|
|
58
|
+
try {
|
|
59
|
+
return await this.browser.getWindowHandle();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
// If the window is closed by user action Webdriver will still hold the reference to the closed window.
|
|
63
|
+
if (['NoSuchWindowError', 'no such window'].includes(error.name)) {
|
|
64
|
+
const allHandles = await this.browser.getWindowHandles();
|
|
65
|
+
if (allHandles.length > 0) {
|
|
66
|
+
const handle = allHandles.at(-1);
|
|
67
|
+
await this.browser.switchToWindow(handle);
|
|
68
|
+
return handle;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async currentPage() {
|
|
75
|
+
const actualCurrentPageHandle = await this.activeWindowHandle();
|
|
76
|
+
const actualCurrentPageId = CorrelationId.fromJSON(actualCurrentPageHandle);
|
|
77
|
+
if (this.currentBrowserPage && this.currentBrowserPage.id.equals(actualCurrentPageId)) {
|
|
78
|
+
return this.currentBrowserPage;
|
|
79
|
+
}
|
|
80
|
+
// Looks like the actual current page is not what we thought the current page was.
|
|
81
|
+
// Is it one of the pages we are aware of?
|
|
82
|
+
const allPages = await this.allPages();
|
|
83
|
+
const found = allPages.find(page => page.id.equals(actualCurrentPageId));
|
|
84
|
+
if (found) {
|
|
85
|
+
this.currentBrowserPage = found;
|
|
86
|
+
return this.currentBrowserPage;
|
|
87
|
+
}
|
|
88
|
+
// OK, so that's a handle that we haven't seen before, let's register it and set as current page.
|
|
89
|
+
this.currentBrowserPage = await this.registerCurrentPage();
|
|
90
|
+
return this.currentBrowserPage;
|
|
91
|
+
}
|
|
92
|
+
async registerCurrentPage() {
|
|
93
|
+
const windowHandle = await this.browser.getWindowHandle();
|
|
94
|
+
const errorHandler = new WebdriverIOErrorHandler();
|
|
95
|
+
const page = new WebdriverIOPage(this, this.browser, await this.modalDialogHandlerFor(windowHandle, errorHandler), errorHandler, new CorrelationId(windowHandle));
|
|
96
|
+
this.register(page);
|
|
97
|
+
return page;
|
|
98
|
+
}
|
|
99
|
+
async modalDialogHandlerFor(windowHandle, errorHandler) {
|
|
100
|
+
return this.browser.isDevTools
|
|
101
|
+
? new WebdriverIOPuppeteerModalDialogHandler(await this.puppeteerPageFor(windowHandle))
|
|
102
|
+
: new WebdriverIOModalDialogHandler(this.browser, errorHandler);
|
|
103
|
+
}
|
|
104
|
+
async puppeteerPageFor(windowHandle) {
|
|
105
|
+
const puppeteer = await this.browser.getPuppeteer();
|
|
106
|
+
const pages = await puppeteer.pages();
|
|
107
|
+
const handles = await this.browser.getWindowHandles();
|
|
108
|
+
if (handles.length !== pages.length) {
|
|
109
|
+
throw new LogicError(`The number of registered Puppeteer pages doesn't match WebdriverIO window handles`);
|
|
110
|
+
}
|
|
111
|
+
const index = handles.indexOf(windowHandle);
|
|
112
|
+
// We cast to `unknown` first because the version of Page in Puppeteer-core
|
|
113
|
+
// might be slightly out-of-sync with what the WebdriverIO uses.
|
|
114
|
+
// This doesn't really matter since we're only using it to work with Dialogs.
|
|
115
|
+
const page = pages[index];
|
|
116
|
+
if (!page) {
|
|
117
|
+
throw new LogicError(`Couldn't find Puppeteer page for WebdriverIO window handle ${windowHandle}`);
|
|
118
|
+
}
|
|
119
|
+
return page;
|
|
120
|
+
}
|
|
121
|
+
browserCapabilities() {
|
|
122
|
+
return Promise.resolve(this.browser.capabilities);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=WebdriverIOBrowsingSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebdriverIOBrowsingSession.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOBrowsingSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import 'webdriverio';
|
|
2
|
+
import type { CookieData } from '@serenity-js/web';
|
|
3
|
+
import { Cookie } from '@serenity-js/web';
|
|
4
|
+
/**
|
|
5
|
+
* WebdriverIO-specific implementation of [`Cookie`](https://serenity-js.org/api/web/class/Cookie/).
|
|
6
|
+
*
|
|
7
|
+
* @group Models
|
|
8
|
+
*/
|
|
9
|
+
export declare class WebdriverIOCookie extends Cookie {
|
|
10
|
+
private readonly browser;
|
|
11
|
+
constructor(browser: WebdriverIO.Browser, cookieName: string);
|
|
12
|
+
delete(): Promise<void>;
|
|
13
|
+
protected read(): Promise<CookieData>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=WebdriverIOCookie.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebdriverIOCookie.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOCookie.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAsB,MAAM,kBAAkB,CAAC;AAG9D;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,MAAM;IAGrC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,WAAW,CAAC,OAAO,EAC7C,UAAU,EAAE,MAAM;IAMhB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;cAIb,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;CAwB9C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import 'webdriverio';
|
|
2
|
+
import { Timestamp } from '@serenity-js/core';
|
|
3
|
+
import { Cookie, CookieMissingError } from '@serenity-js/web';
|
|
4
|
+
import { ensure, isDefined } from 'tiny-types';
|
|
5
|
+
/**
|
|
6
|
+
* WebdriverIO-specific implementation of [`Cookie`](https://serenity-js.org/api/web/class/Cookie/).
|
|
7
|
+
*
|
|
8
|
+
* @group Models
|
|
9
|
+
*/
|
|
10
|
+
export class WebdriverIOCookie extends Cookie {
|
|
11
|
+
browser;
|
|
12
|
+
constructor(browser, cookieName) {
|
|
13
|
+
super(cookieName);
|
|
14
|
+
this.browser = browser;
|
|
15
|
+
ensure('browser', browser, isDefined());
|
|
16
|
+
}
|
|
17
|
+
async delete() {
|
|
18
|
+
await this.browser.deleteCookies(this.cookieName);
|
|
19
|
+
}
|
|
20
|
+
async read() {
|
|
21
|
+
const [cookie] = await this.browser.getCookies(this.cookieName);
|
|
22
|
+
if (!cookie) {
|
|
23
|
+
throw new CookieMissingError(`Cookie '${this.cookieName}' not set`);
|
|
24
|
+
}
|
|
25
|
+
// There _might_ be a bug in WDIO where the expiry date is set on "expires" rather than the "expiry" key
|
|
26
|
+
// and possibly another one around deserialising the timestamp, since WDIO seems to add several hundred milliseconds
|
|
27
|
+
// to the original expiry date
|
|
28
|
+
const expiry = cookie.expiry || cookie.expires;
|
|
29
|
+
return {
|
|
30
|
+
name: cookie.name,
|
|
31
|
+
value: cookie.value,
|
|
32
|
+
domain: cookie.domain,
|
|
33
|
+
path: cookie.path,
|
|
34
|
+
expiry: typeof expiry === 'number' && expiry >= 0
|
|
35
|
+
? Timestamp.fromTimestampInSeconds(Math.round(expiry))
|
|
36
|
+
: undefined,
|
|
37
|
+
httpOnly: cookie.httpOnly,
|
|
38
|
+
secure: cookie.secure,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=WebdriverIOCookie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebdriverIOCookie.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOCookie.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,MAAM,OAAO,iBAAkB,SAAQ,MAAM;IAGpB;IADrB,YACqB,OAA4B,EAC7C,UAAkB;QAElB,KAAK,CAAC,UAAU,CAAC,CAAC;QAHD,YAAO,GAAP,OAAO,CAAqB;QAI7C,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM;QACR,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAES,KAAK,CAAC,IAAI;QAChB,MAAM,CAAE,MAAM,CAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAElE,IAAI,CAAE,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,kBAAkB,CAAC,WAAY,IAAI,CAAC,UAAW,WAAW,CAAC,CAAC;QAC1E,CAAC;QAED,wGAAwG;QACxG,oHAAoH;QACpH,8BAA8B;QAC9B,MAAM,MAAM,GAAuB,MAAM,CAAC,MAAM,IAAK,MAAc,CAAC,OAAO,CAAC;QAE5E,OAAO;YACH,IAAI,EAAQ,MAAM,CAAC,IAAI;YACvB,KAAK,EAAO,MAAM,CAAC,KAAK;YACxB,MAAM,EAAM,MAAM,CAAC,MAAM;YACzB,IAAI,EAAQ,MAAM,CAAC,IAAI;YACvB,MAAM,EAAM,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC;gBACjD,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtD,CAAC,CAAC,SAAS;YACf,QAAQ,EAAI,MAAM,CAAC,QAAQ;YAC3B,MAAM,EAAM,MAAM,CAAC,MAAM;SAC5B,CAAA;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WebdriverProtocolErrorCode } from './WebdriverProtocolErrorCode.js';
|
|
2
|
+
export declare class WebdriverIOErrorHandler {
|
|
3
|
+
private readonly handlers;
|
|
4
|
+
constructor(handlers?: Map<WebdriverProtocolErrorCode, (error: Error) => Promise<void> | void>);
|
|
5
|
+
executeIfHandled<T>(error: Error, action: () => Promise<T> | T): Promise<T>;
|
|
6
|
+
setHandlerFor(errorType: WebdriverProtocolErrorCode, handler: (error: Error) => Promise<void> | void): void;
|
|
7
|
+
unsetHandlerFor(errorType: WebdriverProtocolErrorCode): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=WebdriverIOErrorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebdriverIOErrorHandler.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOErrorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAElF,qBAAa,uBAAuB;IAEpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,GAAG,CAAC,0BAA0B,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAa;IAGpH,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAUjF,aAAa,CAAC,SAAS,EAAE,0BAA0B,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAI3G,eAAe,CAAC,SAAS,EAAE,0BAA0B,GAAG,IAAI;CAG/D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export class WebdriverIOErrorHandler {
|
|
2
|
+
handlers;
|
|
3
|
+
constructor(handlers = new Map()) {
|
|
4
|
+
this.handlers = handlers;
|
|
5
|
+
}
|
|
6
|
+
async executeIfHandled(error, action) {
|
|
7
|
+
if (!this.handlers.has(error.name)) {
|
|
8
|
+
throw error;
|
|
9
|
+
}
|
|
10
|
+
await this.handlers.get(error.name)(error);
|
|
11
|
+
return action();
|
|
12
|
+
}
|
|
13
|
+
setHandlerFor(errorType, handler) {
|
|
14
|
+
this.handlers.set(errorType, handler);
|
|
15
|
+
}
|
|
16
|
+
unsetHandlerFor(errorType) {
|
|
17
|
+
this.handlers.delete(errorType);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=WebdriverIOErrorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebdriverIOErrorHandler.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOErrorHandler.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,uBAAuB;IAEH;IAA7B,YAA6B,WAAoF,IAAI,GAAG,EAAE;QAA7F,aAAQ,GAAR,QAAQ,CAAqF;IAC1H,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAI,KAAY,EAAE,MAA4B;QAChE,IAAI,CAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAkC,CAAC,EAAE,CAAC;YAChE,MAAM,KAAK,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAkC,CAAC,CAAC,KAAK,CAAC,CAAC;QAEzE,OAAO,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,aAAa,CAAC,SAAqC,EAAE,OAA+C;QAChG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,eAAe,CAAC,SAAqC;QACjD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;CACJ"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import 'webdriverio';
|
|
2
|
+
import type { ModalDialog } from '@serenity-js/web';
|
|
3
|
+
import { ModalDialogHandler } from '@serenity-js/web';
|
|
4
|
+
import type { WebdriverIOErrorHandler } from './WebdriverIOErrorHandler.js';
|
|
5
|
+
/**
|
|
6
|
+
* WebdriverIO-specific implementation of [`ModalDialogHandler`](https://serenity-js.org/api/web/class/ModalDialogHandler/),
|
|
7
|
+
* used with the [WebDriver protocol](https://webdriver.io/docs/api/webdriver).
|
|
8
|
+
*
|
|
9
|
+
* @group Models
|
|
10
|
+
*/
|
|
11
|
+
export declare class WebdriverIOModalDialogHandler extends ModalDialogHandler {
|
|
12
|
+
private readonly browser;
|
|
13
|
+
private readonly errorHandler;
|
|
14
|
+
private readonly defaultHandler;
|
|
15
|
+
private currentHandler;
|
|
16
|
+
constructor(browser: WebdriverIO.Browser, errorHandler: WebdriverIOErrorHandler);
|
|
17
|
+
tryToHandleDialog(): Promise<void>;
|
|
18
|
+
acceptNext(): Promise<void>;
|
|
19
|
+
acceptNextWithValue(text: string | number): Promise<void>;
|
|
20
|
+
dismissNext(): Promise<void>;
|
|
21
|
+
reset(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* @override
|
|
24
|
+
*/
|
|
25
|
+
last(): Promise<ModalDialog>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=WebdriverIOModalDialogHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebdriverIOModalDialogHandler.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOModalDialogHandler.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAgE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEpH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAG5E;;;;;GAKG;AACH,qBAAa,6BAA8B,SAAQ,kBAAkB;IAc7D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAbjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAO1B;IAEL,OAAO,CAAC,cAAc,CAAsB;gBAGvB,OAAO,EAAE,WAAW,CAAC,OAAO,EAC5B,YAAY,EAAE,uBAAuB;IASpD,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAalC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;CAQrC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import 'webdriverio';
|
|
2
|
+
import { AbsentModalDialog, AcceptedModalDialog, DismissedModalDialog, ModalDialogHandler } from '@serenity-js/web';
|
|
3
|
+
import { WebdriverProtocolErrorCode } from './WebdriverProtocolErrorCode.js';
|
|
4
|
+
/**
|
|
5
|
+
* WebdriverIO-specific implementation of [`ModalDialogHandler`](https://serenity-js.org/api/web/class/ModalDialogHandler/),
|
|
6
|
+
* used with the [WebDriver protocol](https://webdriver.io/docs/api/webdriver).
|
|
7
|
+
*
|
|
8
|
+
* @group Models
|
|
9
|
+
*/
|
|
10
|
+
export class WebdriverIOModalDialogHandler extends ModalDialogHandler {
|
|
11
|
+
browser;
|
|
12
|
+
errorHandler;
|
|
13
|
+
defaultHandler = async () => {
|
|
14
|
+
const message = await this.browser.getAlertText();
|
|
15
|
+
await this.browser.dismissAlert();
|
|
16
|
+
this.modalDialog = new DismissedModalDialog(message);
|
|
17
|
+
};
|
|
18
|
+
currentHandler;
|
|
19
|
+
constructor(browser, errorHandler) {
|
|
20
|
+
super();
|
|
21
|
+
this.browser = browser;
|
|
22
|
+
this.errorHandler = errorHandler;
|
|
23
|
+
this.currentHandler = this.defaultHandler;
|
|
24
|
+
this.errorHandler.setHandlerFor(WebdriverProtocolErrorCode.UnexpectedAlertOpenError, error_ => this.tryToHandleDialog());
|
|
25
|
+
}
|
|
26
|
+
async tryToHandleDialog() {
|
|
27
|
+
try {
|
|
28
|
+
await this.currentHandler();
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error.name === WebdriverProtocolErrorCode.NoSuchAlertError) {
|
|
32
|
+
this.modalDialog = new AbsentModalDialog();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async acceptNext() {
|
|
39
|
+
this.currentHandler = async () => {
|
|
40
|
+
const message = await this.browser.getAlertText();
|
|
41
|
+
await this.browser.acceptAlert();
|
|
42
|
+
this.modalDialog = new AcceptedModalDialog(message);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async acceptNextWithValue(text) {
|
|
46
|
+
this.currentHandler = async () => {
|
|
47
|
+
await this.browser.sendAlertText(String(text));
|
|
48
|
+
const message = await this.browser.getAlertText();
|
|
49
|
+
await this.browser.acceptAlert();
|
|
50
|
+
this.modalDialog = new AcceptedModalDialog(message);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async dismissNext() {
|
|
54
|
+
this.currentHandler = async () => {
|
|
55
|
+
const message = await this.browser.getAlertText();
|
|
56
|
+
await this.browser.dismissAlert();
|
|
57
|
+
this.modalDialog = new DismissedModalDialog(message);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async reset() {
|
|
61
|
+
this.modalDialog = new AbsentModalDialog();
|
|
62
|
+
this.currentHandler = this.defaultHandler;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* @override
|
|
66
|
+
*/
|
|
67
|
+
async last() {
|
|
68
|
+
if (this.modalDialog instanceof AbsentModalDialog) {
|
|
69
|
+
await this.tryToHandleDialog();
|
|
70
|
+
}
|
|
71
|
+
return this.modalDialog;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=WebdriverIOModalDialogHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebdriverIOModalDialogHandler.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOModalDialogHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import 'webdriverio';
|
|
2
|
+
import type { CorrelationId } from '@serenity-js/core/lib/model/index.js';
|
|
3
|
+
import type { Cookie, CookieData, ModalDialogHandler, PageElements, Selector } from '@serenity-js/web';
|
|
4
|
+
import { Key, Page, PageElement } from '@serenity-js/web';
|
|
5
|
+
import { URL } from 'url';
|
|
6
|
+
import type { WebdriverIOBrowsingSession } from './WebdriverIOBrowsingSession.js';
|
|
7
|
+
import type { WebdriverIOErrorHandler } from './WebdriverIOErrorHandler.js';
|
|
8
|
+
/**
|
|
9
|
+
* WebdriverIO-specific implementation of [`Page`](https://serenity-js.org/api/web/class/Page/).
|
|
10
|
+
*
|
|
11
|
+
* @group Models
|
|
12
|
+
*/
|
|
13
|
+
export declare class WebdriverIOPage extends Page<WebdriverIO.Element> {
|
|
14
|
+
private readonly browser;
|
|
15
|
+
private readonly errorHandler;
|
|
16
|
+
private lastScriptExecutionSummary;
|
|
17
|
+
private dehydrator;
|
|
18
|
+
constructor(session: WebdriverIOBrowsingSession, browser: WebdriverIO.Browser, modalDialogHandler: ModalDialogHandler, errorHandler: WebdriverIOErrorHandler, pageId: CorrelationId);
|
|
19
|
+
createPageElement(nativeElement: WebdriverIO.Element): PageElement<WebdriverIO.Element>;
|
|
20
|
+
locate(selector: Selector): PageElement<WebdriverIO.Element>;
|
|
21
|
+
locateAll(selector: Selector): PageElements<WebdriverIO.Element>;
|
|
22
|
+
navigateTo(destination: string): Promise<void>;
|
|
23
|
+
navigateBack(): Promise<void>;
|
|
24
|
+
navigateForward(): Promise<void>;
|
|
25
|
+
reload(): Promise<void>;
|
|
26
|
+
sendKeys(keys: Array<Key | string>): Promise<void>;
|
|
27
|
+
executeScript<Result, InnerArguments extends any[]>(script: string | ((...parameters: InnerArguments) => Result), ...args: InnerArguments): Promise<Result>;
|
|
28
|
+
executeAsyncScript<Result, Parameters extends any[]>(script: string | ((...args: [...parameters: Parameters, callback: (result: Result) => void]) => void), ...args: Parameters): Promise<Result>;
|
|
29
|
+
lastScriptExecutionResult<Result = any>(): Result;
|
|
30
|
+
takeScreenshot(): Promise<string>;
|
|
31
|
+
cookie(name: string): Promise<Cookie>;
|
|
32
|
+
setCookie(cookieData: CookieData): Promise<void>;
|
|
33
|
+
deleteAllCookies(): Promise<void>;
|
|
34
|
+
title(): Promise<string>;
|
|
35
|
+
name(): Promise<string>;
|
|
36
|
+
url(): Promise<URL>;
|
|
37
|
+
viewportSize(): Promise<{
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
}>;
|
|
41
|
+
setViewportSize(size: {
|
|
42
|
+
width: number;
|
|
43
|
+
height: number;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
close(): Promise<void>;
|
|
46
|
+
closeOthers(): Promise<void>;
|
|
47
|
+
isPresent(): Promise<boolean>;
|
|
48
|
+
private inContextOfThisPage;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=WebdriverIOPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebdriverIOPage.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOPage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import 'webdriverio';
|
|
2
|
+
import { List, LogicError } from '@serenity-js/core';
|
|
3
|
+
import { ArgumentDehydrator, BrowserWindowClosedError, ByCss, Key, Page, PageElement, PageElementsLocator } from '@serenity-js/web';
|
|
4
|
+
import * as scripts from '@serenity-js/web/lib/scripts/index.js';
|
|
5
|
+
import { URL } from 'url';
|
|
6
|
+
import { WebdriverIOExistingElementLocator, WebdriverIOLocator, WebdriverIORootLocator } from './locators/index.js';
|
|
7
|
+
import { WebdriverIOCookie } from './WebdriverIOCookie.js';
|
|
8
|
+
import { WebdriverIOPageElement } from './WebdriverIOPageElement.js';
|
|
9
|
+
/**
|
|
10
|
+
* WebdriverIO-specific implementation of [`Page`](https://serenity-js.org/api/web/class/Page/).
|
|
11
|
+
*
|
|
12
|
+
* @group Models
|
|
13
|
+
*/
|
|
14
|
+
export class WebdriverIOPage extends Page {
|
|
15
|
+
browser;
|
|
16
|
+
errorHandler;
|
|
17
|
+
lastScriptExecutionSummary;
|
|
18
|
+
/* eslint-disable unicorn/consistent-function-scoping */
|
|
19
|
+
dehydrator = new ArgumentDehydrator((item) => item instanceof PageElement, (item) => item.nativeElement());
|
|
20
|
+
/* eslint-enable */
|
|
21
|
+
constructor(session, browser, modalDialogHandler, errorHandler, pageId) {
|
|
22
|
+
super(session, new WebdriverIORootLocator(browser), modalDialogHandler, pageId);
|
|
23
|
+
this.browser = browser;
|
|
24
|
+
this.errorHandler = errorHandler;
|
|
25
|
+
}
|
|
26
|
+
createPageElement(nativeElement) {
|
|
27
|
+
return new WebdriverIOPageElement(new WebdriverIOExistingElementLocator(this.rootLocator, new ByCss(String(nativeElement.selector)), this.errorHandler, nativeElement));
|
|
28
|
+
}
|
|
29
|
+
locate(selector) {
|
|
30
|
+
return new WebdriverIOPageElement(new WebdriverIOLocator(this.rootLocator, selector, this.errorHandler));
|
|
31
|
+
}
|
|
32
|
+
locateAll(selector) {
|
|
33
|
+
return List.of(new PageElementsLocator(new WebdriverIOLocator(this.rootLocator, selector, this.errorHandler)));
|
|
34
|
+
}
|
|
35
|
+
async navigateTo(destination) {
|
|
36
|
+
await this.inContextOfThisPage(() => this.browser.url(destination));
|
|
37
|
+
}
|
|
38
|
+
async navigateBack() {
|
|
39
|
+
await this.inContextOfThisPage(() => this.browser.back());
|
|
40
|
+
}
|
|
41
|
+
async navigateForward() {
|
|
42
|
+
await this.inContextOfThisPage(() => this.browser.forward());
|
|
43
|
+
}
|
|
44
|
+
async reload() {
|
|
45
|
+
await this.inContextOfThisPage(() => this.browser.refresh());
|
|
46
|
+
}
|
|
47
|
+
async sendKeys(keys) {
|
|
48
|
+
const keySequence = keys.map(key => {
|
|
49
|
+
if (!Key.isKey(key)) {
|
|
50
|
+
return key;
|
|
51
|
+
}
|
|
52
|
+
return key.utf16codePoint;
|
|
53
|
+
});
|
|
54
|
+
await this.inContextOfThisPage(() => this.browser.keys(keySequence));
|
|
55
|
+
}
|
|
56
|
+
async executeScript(script, ...args) {
|
|
57
|
+
const serialisedScript = typeof script === 'function'
|
|
58
|
+
? String(script)
|
|
59
|
+
: String(`function script() { ${script} }`);
|
|
60
|
+
const executableScript = new Function(`
|
|
61
|
+
var parameters = (${scripts.rehydrate}).apply(null, arguments);
|
|
62
|
+
return (${serialisedScript}).apply(null, parameters);
|
|
63
|
+
`);
|
|
64
|
+
const result = await this.inContextOfThisPage(async () => {
|
|
65
|
+
const dehydratedArguments = await this.dehydrator.dehydrate(args);
|
|
66
|
+
return await this.browser.execute(executableScript, ...dehydratedArguments);
|
|
67
|
+
});
|
|
68
|
+
this.lastScriptExecutionSummary = new LastScriptExecutionSummary(result);
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
async executeAsyncScript(script, ...args) {
|
|
72
|
+
const serialisedScript = typeof script === 'function'
|
|
73
|
+
? String(script)
|
|
74
|
+
: String(`function script() { ${script} }`);
|
|
75
|
+
const executableScript = new Function(`
|
|
76
|
+
var args = Array.prototype.slice.call(arguments, 0, -1);
|
|
77
|
+
var callback = arguments[arguments.length - 1];
|
|
78
|
+
var parameters = (${scripts.rehydrate}).apply(null, args);
|
|
79
|
+
(${serialisedScript}).apply(null, parameters.concat(callback));
|
|
80
|
+
`);
|
|
81
|
+
const result = await this.inContextOfThisPage(async () => {
|
|
82
|
+
const dehydratedArguments = await this.dehydrator.dehydrate(args);
|
|
83
|
+
return this.browser.executeAsync(executableScript, ...dehydratedArguments);
|
|
84
|
+
});
|
|
85
|
+
this.lastScriptExecutionSummary = new LastScriptExecutionSummary(result);
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
lastScriptExecutionResult() {
|
|
89
|
+
if (!this.lastScriptExecutionSummary) {
|
|
90
|
+
throw new LogicError(`Make sure to execute a script before checking on the result`);
|
|
91
|
+
}
|
|
92
|
+
// Selenium returns `null` when the script it executed returns `undefined`
|
|
93
|
+
// so we're mapping the result back.
|
|
94
|
+
return this.lastScriptExecutionSummary.result === null
|
|
95
|
+
? undefined
|
|
96
|
+
: this.lastScriptExecutionSummary.result;
|
|
97
|
+
}
|
|
98
|
+
async takeScreenshot() {
|
|
99
|
+
return await this.inContextOfThisPage(async () => {
|
|
100
|
+
try {
|
|
101
|
+
return await this.browser.takeScreenshot();
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error.name === 'ProtocolError' && error.message.includes('Target closed')) {
|
|
105
|
+
throw new BrowserWindowClosedError(`Couldn't take screenshot since the browser window is already closed`, error);
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async cookie(name) {
|
|
112
|
+
return new WebdriverIOCookie(this.browser, name);
|
|
113
|
+
}
|
|
114
|
+
async setCookie(cookieData) {
|
|
115
|
+
return await this.inContextOfThisPage(() => {
|
|
116
|
+
return this.browser.setCookies({
|
|
117
|
+
name: cookieData.name,
|
|
118
|
+
value: cookieData.value,
|
|
119
|
+
path: cookieData.path,
|
|
120
|
+
domain: cookieData.domain,
|
|
121
|
+
secure: cookieData.secure,
|
|
122
|
+
httpOnly: cookieData.httpOnly,
|
|
123
|
+
expiry: cookieData.expiry
|
|
124
|
+
? cookieData.expiry.toSeconds()
|
|
125
|
+
: undefined,
|
|
126
|
+
sameSite: cookieData.sameSite,
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async deleteAllCookies() {
|
|
131
|
+
return await this.inContextOfThisPage(() => {
|
|
132
|
+
return this.browser.deleteCookies();
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async title() {
|
|
136
|
+
return await this.inContextOfThisPage(() => this.browser.execute(`return document.title`));
|
|
137
|
+
}
|
|
138
|
+
async name() {
|
|
139
|
+
return await this.inContextOfThisPage(() => this.browser.execute(`return window.name`));
|
|
140
|
+
}
|
|
141
|
+
async url() {
|
|
142
|
+
return await this.inContextOfThisPage(async () => {
|
|
143
|
+
return new URL(await this.browser.execute(`return window.location.href`));
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
async viewportSize() {
|
|
147
|
+
return await this.inContextOfThisPage(async () => {
|
|
148
|
+
if (!this.browser.isDevTools) {
|
|
149
|
+
const calculatedViewportSize = await this.browser.execute(`
|
|
150
|
+
return {
|
|
151
|
+
width: Math.max(document.documentElement.clientWidth, window.innerWidth || 0),
|
|
152
|
+
height: Math.max(document.documentElement.clientHeight, window.innerHeight || 0),
|
|
153
|
+
}
|
|
154
|
+
`);
|
|
155
|
+
// Chrome headless hard-codes window.innerWidth and window.innerHeight to 0
|
|
156
|
+
if (calculatedViewportSize.width > 0 && calculatedViewportSize.height > 0) {
|
|
157
|
+
return calculatedViewportSize;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return this.browser.getWindowSize();
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
async setViewportSize(size) {
|
|
164
|
+
return await this.inContextOfThisPage(async () => {
|
|
165
|
+
let desiredWindowSize = size;
|
|
166
|
+
if (!this.browser.isDevTools) {
|
|
167
|
+
desiredWindowSize = await this.browser.execute(`
|
|
168
|
+
var currentViewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0)
|
|
169
|
+
var currentViewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
width: Math.max(window.outerWidth - currentViewportWidth + ${size.width}, ${size.width}),
|
|
173
|
+
height: Math.max(window.outerHeight - currentViewportHeight + ${size.height}, ${size.height}),
|
|
174
|
+
};
|
|
175
|
+
`);
|
|
176
|
+
}
|
|
177
|
+
return this.browser.setWindowSize(desiredWindowSize.width, desiredWindowSize.height);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
async close() {
|
|
181
|
+
await this.inContextOfThisPage(() => this.browser.closeWindow());
|
|
182
|
+
}
|
|
183
|
+
async closeOthers() {
|
|
184
|
+
await this.session.closePagesOtherThan(this);
|
|
185
|
+
}
|
|
186
|
+
async isPresent() {
|
|
187
|
+
const allPages = await this.session.allPages();
|
|
188
|
+
for (const page of allPages) {
|
|
189
|
+
if (page === this) {
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
async inContextOfThisPage(action) {
|
|
196
|
+
let originalCurrentPage;
|
|
197
|
+
try {
|
|
198
|
+
originalCurrentPage = await this.session.currentPage();
|
|
199
|
+
await this.session.changeCurrentPageTo(this);
|
|
200
|
+
return await action();
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return await this.errorHandler.executeIfHandled(error, action);
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
await this.session.changeCurrentPageTo(originalCurrentPage);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* @package
|
|
212
|
+
*/
|
|
213
|
+
class LastScriptExecutionSummary {
|
|
214
|
+
result;
|
|
215
|
+
constructor(result) {
|
|
216
|
+
this.result = result;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=WebdriverIOPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebdriverIOPage.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOPage.ts"],"names":[],"mappings":"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"}
|