@serenity-js/webdriverio 3.41.1 → 3.42.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.
Files changed (103) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/esm/adapter/TestRunnerLoader.d.ts +3 -3
  3. package/esm/adapter/TestRunnerLoader.d.ts.map +1 -1
  4. package/esm/adapter/TestRunnerLoader.js +3 -3
  5. package/esm/adapter/TestRunnerLoader.js.map +1 -1
  6. package/esm/adapter/WebdriverIOFrameworkAdapter.d.ts +2 -2
  7. package/esm/adapter/WebdriverIOFrameworkAdapter.d.ts.map +1 -1
  8. package/esm/adapter/WebdriverIOFrameworkAdapter.js +1 -1
  9. package/esm/adapter/WebdriverIOFrameworkAdapter.js.map +1 -1
  10. package/esm/adapter/WebdriverIOFrameworkAdapterFactory.d.ts +1 -1
  11. package/esm/adapter/WebdriverIOFrameworkAdapterFactory.d.ts.map +1 -1
  12. package/esm/adapter/WebdriverIONotifier.d.ts +2 -2
  13. package/esm/adapter/WebdriverIONotifier.d.ts.map +1 -1
  14. package/esm/adapter/WebdriverIONotifier.js +2 -2
  15. package/esm/adapter/WebdriverIONotifier.js.map +1 -1
  16. package/esm/adapter/reporter/BrowserCapabilitiesReporter.js +1 -1
  17. package/esm/adapter/reporter/BrowserCapabilitiesReporter.js.map +1 -1
  18. package/esm/adapter/reporter/OutputStreamBuffer.d.ts +1 -1
  19. package/esm/adapter/reporter/OutputStreamBuffer.d.ts.map +1 -1
  20. package/esm/adapter/reporter/OutputStreamBufferPrinter.d.ts +2 -2
  21. package/esm/adapter/reporter/OutputStreamBufferPrinter.d.ts.map +1 -1
  22. package/esm/adapter/reporter/OutputStreamBufferPrinter.js +1 -1
  23. package/esm/adapter/reporter/OutputStreamBufferPrinter.js.map +1 -1
  24. package/esm/adapter/reporter/ProvidesWriteStream.d.ts +1 -1
  25. package/esm/adapter/reporter/ProvidesWriteStream.d.ts.map +1 -1
  26. package/esm/adapter/reporter/TagPrinter.d.ts +1 -1
  27. package/esm/adapter/reporter/TagPrinter.d.ts.map +1 -1
  28. package/esm/adapter/reporter/TagPrinter.js +1 -1
  29. package/esm/adapter/reporter/TagPrinter.js.map +1 -1
  30. package/esm/index.js +1 -1
  31. package/esm/index.js.map +1 -1
  32. package/esm/screenplay/models/WebdriverIOBrowsingSession.js +1 -1
  33. package/esm/screenplay/models/WebdriverIOBrowsingSession.js.map +1 -1
  34. package/esm/screenplay/models/WebdriverIOModalDialogHandler.d.ts +1 -1
  35. package/esm/screenplay/models/WebdriverIOModalDialogHandler.d.ts.map +1 -1
  36. package/esm/screenplay/models/WebdriverIOModalDialogHandler.js +16 -7
  37. package/esm/screenplay/models/WebdriverIOModalDialogHandler.js.map +1 -1
  38. package/esm/screenplay/models/WebdriverIOPage.d.ts +1 -1
  39. package/esm/screenplay/models/WebdriverIOPage.d.ts.map +1 -1
  40. package/esm/screenplay/models/WebdriverIOPage.js +16 -2
  41. package/esm/screenplay/models/WebdriverIOPage.js.map +1 -1
  42. package/esm/screenplay/models/WebdriverIOPageElement.d.ts.map +1 -1
  43. package/esm/screenplay/models/WebdriverIOPageElement.js +10 -1
  44. package/esm/screenplay/models/WebdriverIOPageElement.js.map +1 -1
  45. package/lib/adapter/TestRunnerLoader.d.ts +3 -3
  46. package/lib/adapter/TestRunnerLoader.d.ts.map +1 -1
  47. package/lib/adapter/TestRunnerLoader.js +7 -7
  48. package/lib/adapter/TestRunnerLoader.js.map +1 -1
  49. package/lib/adapter/WebdriverIOFrameworkAdapter.d.ts +2 -2
  50. package/lib/adapter/WebdriverIOFrameworkAdapter.d.ts.map +1 -1
  51. package/lib/adapter/WebdriverIOFrameworkAdapter.js +7 -7
  52. package/lib/adapter/WebdriverIOFrameworkAdapter.js.map +1 -1
  53. package/lib/adapter/WebdriverIOFrameworkAdapterFactory.d.ts +1 -1
  54. package/lib/adapter/WebdriverIOFrameworkAdapterFactory.d.ts.map +1 -1
  55. package/lib/adapter/WebdriverIONotifier.d.ts +2 -2
  56. package/lib/adapter/WebdriverIONotifier.d.ts.map +1 -1
  57. package/lib/adapter/WebdriverIONotifier.js +25 -25
  58. package/lib/adapter/WebdriverIONotifier.js.map +1 -1
  59. package/lib/adapter/reporter/BrowserCapabilitiesReporter.js +2 -2
  60. package/lib/adapter/reporter/BrowserCapabilitiesReporter.js.map +1 -1
  61. package/lib/adapter/reporter/OutputStreamBuffer.d.ts +1 -1
  62. package/lib/adapter/reporter/OutputStreamBuffer.d.ts.map +1 -1
  63. package/lib/adapter/reporter/OutputStreamBufferPrinter.d.ts +2 -2
  64. package/lib/adapter/reporter/OutputStreamBufferPrinter.d.ts.map +1 -1
  65. package/lib/adapter/reporter/OutputStreamBufferPrinter.js +2 -2
  66. package/lib/adapter/reporter/OutputStreamBufferPrinter.js.map +1 -1
  67. package/lib/adapter/reporter/ProvidesWriteStream.d.ts +1 -1
  68. package/lib/adapter/reporter/ProvidesWriteStream.d.ts.map +1 -1
  69. package/lib/adapter/reporter/TagPrinter.d.ts +1 -1
  70. package/lib/adapter/reporter/TagPrinter.d.ts.map +1 -1
  71. package/lib/adapter/reporter/TagPrinter.js +3 -3
  72. package/lib/adapter/reporter/TagPrinter.js.map +1 -1
  73. package/lib/index.js +2 -2
  74. package/lib/index.js.map +1 -1
  75. package/lib/screenplay/models/WebdriverIOBrowsingSession.js +9 -9
  76. package/lib/screenplay/models/WebdriverIOBrowsingSession.js.map +1 -1
  77. package/lib/screenplay/models/WebdriverIOModalDialogHandler.d.ts +1 -1
  78. package/lib/screenplay/models/WebdriverIOModalDialogHandler.d.ts.map +1 -1
  79. package/lib/screenplay/models/WebdriverIOModalDialogHandler.js +16 -7
  80. package/lib/screenplay/models/WebdriverIOModalDialogHandler.js.map +1 -1
  81. package/lib/screenplay/models/WebdriverIOPage.d.ts +1 -1
  82. package/lib/screenplay/models/WebdriverIOPage.d.ts.map +1 -1
  83. package/lib/screenplay/models/WebdriverIOPage.js +16 -2
  84. package/lib/screenplay/models/WebdriverIOPage.js.map +1 -1
  85. package/lib/screenplay/models/WebdriverIOPageElement.d.ts.map +1 -1
  86. package/lib/screenplay/models/WebdriverIOPageElement.js +10 -1
  87. package/lib/screenplay/models/WebdriverIOPageElement.js.map +1 -1
  88. package/package.json +24 -27
  89. package/src/adapter/TestRunnerLoader.ts +5 -5
  90. package/src/adapter/WebdriverIOFrameworkAdapter.ts +3 -3
  91. package/src/adapter/WebdriverIOFrameworkAdapterFactory.ts +1 -1
  92. package/src/adapter/WebdriverIONotifier.ts +4 -4
  93. package/src/adapter/reporter/BrowserCapabilitiesReporter.ts +2 -2
  94. package/src/adapter/reporter/OutputStreamBuffer.ts +1 -1
  95. package/src/adapter/reporter/OutputStreamBufferPrinter.ts +3 -3
  96. package/src/adapter/reporter/ProvidesWriteStream.ts +1 -1
  97. package/src/adapter/reporter/TagPrinter.ts +2 -2
  98. package/src/index.ts +1 -1
  99. package/src/screenplay/models/WebdriverIOBrowsingSession.ts +1 -1
  100. package/src/screenplay/models/WebdriverIOModalDialogHandler.ts +16 -8
  101. package/src/screenplay/models/WebdriverIOPage.ts +19 -3
  102. package/src/screenplay/models/WebdriverIOPageElement.ts +15 -1
  103. package/tsconfig-esm.build.json +2 -2
@@ -1,6 +1,6 @@
1
1
  import type { Stage, StageCrewMember } from '@serenity-js/core';
2
2
  import { LogicError } from '@serenity-js/core';
3
- import type { DomainEvent } from '@serenity-js/core/lib/events/index.js';
3
+ import type { DomainEvent } from '@serenity-js/core/events';
4
4
  import {
5
5
  AsyncOperationAttempted,
6
6
  AsyncOperationCompleted,
@@ -10,8 +10,8 @@ import {
10
10
  TestRunFinishes,
11
11
  TestSuiteFinished,
12
12
  TestSuiteStarts
13
- } from '@serenity-js/core/lib/events/index.js';
14
- import type { Outcome, TestSuiteDetails } from '@serenity-js/core/lib/model/index.js';
13
+ } from '@serenity-js/core/events';
14
+ import type { Outcome, TestSuiteDetails } from '@serenity-js/core/model';
15
15
  import {
16
16
  CorrelationId,
17
17
  Description,
@@ -23,7 +23,7 @@ import {
23
23
  ImplementationPending,
24
24
  Name,
25
25
  ProblemIndication
26
- } from '@serenity-js/core/lib/model/index.js';
26
+ } from '@serenity-js/core/model';
27
27
  import type { Test as testStats } from '@wdio/reporter';
28
28
  import type { Capabilities, Frameworks } from '@wdio/types';
29
29
  import type { EventEmitter } from 'events';
@@ -1,6 +1,6 @@
1
1
  import type { Serenity } from '@serenity-js/core';
2
- import { SceneTagged } from '@serenity-js/core/lib/events/index.js';
3
- import type { Tag } from '@serenity-js/core/lib/model/index.js';
2
+ import { SceneTagged } from '@serenity-js/core/events';
3
+ import type { Tag } from '@serenity-js/core/model';
4
4
  import Reporter from '@wdio/reporter';
5
5
  import type { Capabilities, Options, Reporters } from '@wdio/types';
6
6
 
@@ -1,4 +1,4 @@
1
- import type { OutputStream } from '@serenity-js/core/lib/adapter/index.js';
1
+ import type { OutputStream } from '@serenity-js/core/adapter';
2
2
 
3
3
  /**
4
4
  * @package
@@ -1,7 +1,7 @@
1
1
  import type { Stage, StageCrewMember } from '@serenity-js/core';
2
- import type { OutputStream } from '@serenity-js/core/lib/adapter/index.js';
3
- import type { DomainEvent} from '@serenity-js/core/lib/events/index.js';
4
- import { SceneFinished } from '@serenity-js/core/lib/events/index.js';
2
+ import type { OutputStream } from '@serenity-js/core/adapter';
3
+ import type { DomainEvent} from '@serenity-js/core/events';
4
+ import { SceneFinished } from '@serenity-js/core/events';
5
5
 
6
6
  import type { OutputStreamBuffer } from './OutputStreamBuffer.js';
7
7
 
@@ -1,4 +1,4 @@
1
- import type { OutputStream } from '@serenity-js/core/lib/adapter/index.js';
1
+ import type { OutputStream } from '@serenity-js/core/adapter';
2
2
 
3
3
  /**
4
4
  * @package
@@ -1,5 +1,5 @@
1
- import type { Tag } from '@serenity-js/core/lib/model/index.js';
2
- import { BrowserTag, PlatformTag } from '@serenity-js/core/lib/model/index.js';
1
+ import type { Tag } from '@serenity-js/core/model';
2
+ import { BrowserTag, PlatformTag } from '@serenity-js/core/model';
3
3
  import type { Capabilities } from '@wdio/types';
4
4
 
5
5
  /**
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { serenity } from '@serenity-js/core';
2
- import { ModuleLoader, Path } from '@serenity-js/core/lib/io/index.js';
2
+ import { ModuleLoader, Path } from '@serenity-js/core/io';
3
3
  import type { Capabilities } from '@wdio/types';
4
4
  import type { EventEmitter } from 'events';
5
5
 
@@ -1,7 +1,7 @@
1
1
  import 'webdriverio';
2
2
 
3
3
  import { type Discardable, LogicError } from '@serenity-js/core';
4
- import { CorrelationId } from '@serenity-js/core/lib/model/index.js';
4
+ import { CorrelationId } from '@serenity-js/core/model';
5
5
  import type { BrowserCapabilities } from '@serenity-js/web';
6
6
  import { BrowsingSession } from '@serenity-js/web';
7
7
 
@@ -23,7 +23,7 @@ export class WebdriverIOModalDialogHandler extends ModalDialogHandler implements
23
23
  }
24
24
 
25
25
  private currentHandler: (dialog: WebdriverIO.Dialog) => Promise<void>;
26
- private dialog?: WebdriverIO.Dialog;
26
+ private pendingDialogHandling: Promise<void> = Promise.resolve();
27
27
 
28
28
  constructor(private readonly browser: WebdriverIO.Browser) {
29
29
  super();
@@ -33,7 +33,9 @@ export class WebdriverIOModalDialogHandler extends ModalDialogHandler implements
33
33
  this.browser.on('dialog', this.onDialog);
34
34
  }
35
35
 
36
- private onDialog = this.tryToHandleDialog.bind(this);
36
+ private onDialog = (dialog: WebdriverIO.Dialog) => {
37
+ this.pendingDialogHandling = this.tryToHandleDialog(dialog);
38
+ };
37
39
 
38
40
  private async tryToHandleDialog(dialog: WebdriverIO.Dialog): Promise<void> {
39
41
  try {
@@ -84,13 +86,18 @@ export class WebdriverIOModalDialogHandler extends ModalDialogHandler implements
84
86
  }
85
87
 
86
88
  async dismiss(): Promise<void> {
87
- if (! this.dialog) {
88
- return;
89
+ try {
90
+ const message = await this.browser.getAlertText();
91
+ await this.browser.dismissAlert();
92
+ this.modalDialog = new DismissedModalDialog(message);
93
+ }
94
+ catch (error) {
95
+ // Dialog might have already been handled by the event listener
96
+ if (error.message?.includes(WebdriverProtocolErrorCode.NoSuchAlertError)) {
97
+ return;
98
+ }
99
+ throw error;
89
100
  }
90
-
91
- const message = this.dialog.message();
92
- await this.dialog.dismiss();
93
- this.modalDialog = new DismissedModalDialog(message);
94
101
  }
95
102
 
96
103
  async reset(): Promise<void> {
@@ -102,6 +109,7 @@ export class WebdriverIOModalDialogHandler extends ModalDialogHandler implements
102
109
  * @override
103
110
  */
104
111
  async last(): Promise<ModalDialog> {
112
+ await this.pendingDialogHandling;
105
113
  return this.modalDialog;
106
114
  }
107
115
 
@@ -3,7 +3,7 @@ import 'webdriverio';
3
3
  import { URL } from 'node:url';
4
4
 
5
5
  import { type Discardable, List, LogicError } from '@serenity-js/core';
6
- import type { CorrelationId } from '@serenity-js/core/lib/model/index.js';
6
+ import type { CorrelationId } from '@serenity-js/core/model';
7
7
  import type { Cookie, CookieData, ModalDialogHandler, PageElements, Selector } from '@serenity-js/web';
8
8
  import {
9
9
  ArgumentDehydrator,
@@ -14,7 +14,7 @@ import {
14
14
  PageElement,
15
15
  PageElementsLocator
16
16
  } from '@serenity-js/web';
17
- import * as scripts from '@serenity-js/web/lib/scripts/index.js';
17
+ import * as scripts from '@serenity-js/web/scripts';
18
18
  import type { TransformElement } from 'webdriverio';
19
19
 
20
20
  import { WebdriverIOExistingElementLocator, WebdriverIOLocator, WebdriverIORootLocator } from './locators/index.js';
@@ -262,7 +262,23 @@ export class WebdriverIOPage extends Page<WebdriverIO.Element> implements Discar
262
262
 
263
263
  async setViewportSize(size: { width: number, height: number }): Promise<void> {
264
264
  return await this.inContextOfThisPage(async () => {
265
- await this.browser.setViewport(size);
265
+ // Use BiDi setViewport when available as it handles devicePixelRatio correctly
266
+ if (this.browser.isBidi) {
267
+ return this.browser.setViewport(size);
268
+ }
269
+
270
+ // Fall back to classic WebDriver approach for non-BiDi sessions
271
+ const desiredWindowSize = await this.browser.execute(`
272
+ var currentViewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0)
273
+ var currentViewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
274
+
275
+ return {
276
+ width: Math.max(window.outerWidth - currentViewportWidth + ${ size.width }, ${ size.width }),
277
+ height: Math.max(window.outerHeight - currentViewportHeight + ${ size.height }, ${ size.height }),
278
+ };
279
+ `) as { width: number, height: number };
280
+
281
+ return this.browser.setWindowSize(desiredWindowSize.width, desiredWindowSize.height);
266
282
  });
267
283
  }
268
284
 
@@ -3,7 +3,7 @@ import 'webdriverio';
3
3
  import { LogicError } from '@serenity-js/core';
4
4
  import type { SwitchableOrigin } from '@serenity-js/web';
5
5
  import { Key, PageElement, SelectOption } from '@serenity-js/web';
6
- import * as scripts from '@serenity-js/web/lib/scripts/index.js';
6
+ import * as scripts from '@serenity-js/web/scripts';
7
7
 
8
8
  import type { WebdriverIOLocator } from './locators/index.js';
9
9
  import { WebdriverProtocolErrorCode } from './WebdriverProtocolErrorCode.js';
@@ -165,6 +165,20 @@ export class WebdriverIOPageElement extends PageElement<WebdriverIO.Element> {
165
165
 
166
166
  async value(): Promise<string> {
167
167
  const element = await this.nativeElement();
168
+ const browser = await this.browserFor(element);
169
+
170
+ // WebdriverIO v9 returns empty string for non-input elements instead of throwing
171
+ // Check if element actually supports the value property
172
+ const hasValueProperty = await browser.execute(
173
+ /* c8 ignore next */
174
+ (element_: HTMLElement) => 'value' in element_,
175
+ element as unknown as HTMLElement
176
+ );
177
+
178
+ if (! hasValueProperty) {
179
+ return undefined;
180
+ }
181
+
168
182
  return await element.getValue() as string;
169
183
  }
170
184
 
@@ -1,7 +1,7 @@
1
1
  {
2
- "extends": "../../tsconfig.build.json",
2
+ "extends": "../../tsconfig-esm.options.json",
3
3
  "compilerOptions": {
4
- "module": "Node16",
4
+ "module": "Node20",
5
5
  "moduleResolution": "Node16",
6
6
  "outDir": "esm",
7
7
  "rootDir": "src",