@serenity-js/web 3.0.0-rc.8 → 3.0.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 (413) hide show
  1. package/CHANGELOG.md +336 -73
  2. package/README.md +8 -12
  3. package/lib/errors/BrowserWindowClosedError.d.ts +15 -0
  4. package/lib/errors/BrowserWindowClosedError.d.ts.map +1 -0
  5. package/lib/errors/BrowserWindowClosedError.js +21 -0
  6. package/lib/errors/BrowserWindowClosedError.js.map +1 -0
  7. package/lib/errors/CookieMissingError.d.ts +11 -0
  8. package/lib/errors/CookieMissingError.d.ts.map +1 -0
  9. package/lib/errors/CookieMissingError.js +10 -0
  10. package/lib/errors/CookieMissingError.js.map +1 -1
  11. package/lib/errors/ModalDialogObstructsScreenshotError.d.ts +15 -0
  12. package/lib/errors/ModalDialogObstructsScreenshotError.d.ts.map +1 -0
  13. package/lib/errors/ModalDialogObstructsScreenshotError.js +21 -0
  14. package/lib/errors/ModalDialogObstructsScreenshotError.js.map +1 -0
  15. package/lib/errors/index.d.ts +3 -0
  16. package/lib/errors/index.d.ts.map +1 -0
  17. package/lib/errors/index.js +7 -1
  18. package/lib/errors/index.js.map +1 -1
  19. package/lib/expectations/index.d.ts +1 -1
  20. package/lib/expectations/index.d.ts.map +1 -0
  21. package/lib/expectations/index.js +5 -2
  22. package/lib/expectations/index.js.map +1 -1
  23. package/lib/expectations/isActive.d.ts +14 -8
  24. package/lib/expectations/isActive.d.ts.map +1 -0
  25. package/lib/expectations/isActive.js +17 -11
  26. package/lib/expectations/isActive.js.map +1 -1
  27. package/lib/expectations/isClickable.d.ts +14 -13
  28. package/lib/expectations/isClickable.d.ts.map +1 -0
  29. package/lib/expectations/isClickable.js +15 -17
  30. package/lib/expectations/isClickable.js.map +1 -1
  31. package/lib/expectations/isEnabled.d.ts +14 -7
  32. package/lib/expectations/isEnabled.d.ts.map +1 -0
  33. package/lib/expectations/isEnabled.js +17 -9
  34. package/lib/expectations/isEnabled.js.map +1 -1
  35. package/lib/expectations/isSelected.d.ts +14 -7
  36. package/lib/expectations/isSelected.d.ts.map +1 -0
  37. package/lib/expectations/isSelected.js +15 -9
  38. package/lib/expectations/isSelected.js.map +1 -1
  39. package/lib/expectations/isVisible.d.ts +14 -7
  40. package/lib/expectations/isVisible.d.ts.map +1 -0
  41. package/lib/expectations/isVisible.js +17 -9
  42. package/lib/expectations/isVisible.js.map +1 -1
  43. package/lib/index.d.ts +1 -1
  44. package/lib/index.d.ts.map +1 -0
  45. package/lib/index.js +5 -2
  46. package/lib/index.js.map +1 -1
  47. package/lib/screenplay/abilities/BrowseTheWeb.d.ts +88 -45
  48. package/lib/screenplay/abilities/BrowseTheWeb.d.ts.map +1 -0
  49. package/lib/screenplay/abilities/BrowseTheWeb.js +89 -19
  50. package/lib/screenplay/abilities/BrowseTheWeb.js.map +1 -1
  51. package/lib/screenplay/abilities/index.d.ts +1 -1
  52. package/lib/screenplay/abilities/index.d.ts.map +1 -0
  53. package/lib/screenplay/abilities/index.js +5 -2
  54. package/lib/screenplay/abilities/index.js.map +1 -1
  55. package/lib/screenplay/index.d.ts +1 -0
  56. package/lib/screenplay/index.d.ts.map +1 -0
  57. package/lib/screenplay/index.js +5 -1
  58. package/lib/screenplay/index.js.map +1 -1
  59. package/lib/screenplay/interactions/Clear.d.ts +50 -55
  60. package/lib/screenplay/interactions/Clear.d.ts.map +1 -0
  61. package/lib/screenplay/interactions/Clear.js +70 -63
  62. package/lib/screenplay/interactions/Clear.js.map +1 -1
  63. package/lib/screenplay/interactions/Click.d.ts +41 -50
  64. package/lib/screenplay/interactions/Click.d.ts.map +1 -0
  65. package/lib/screenplay/interactions/Click.js +45 -55
  66. package/lib/screenplay/interactions/Click.js.map +1 -1
  67. package/lib/screenplay/interactions/DoubleClick.d.ts +64 -67
  68. package/lib/screenplay/interactions/DoubleClick.d.ts.map +1 -0
  69. package/lib/screenplay/interactions/DoubleClick.js +68 -72
  70. package/lib/screenplay/interactions/DoubleClick.js.map +1 -1
  71. package/lib/screenplay/interactions/Enter.d.ts +42 -51
  72. package/lib/screenplay/interactions/Enter.d.ts.map +1 -0
  73. package/lib/screenplay/interactions/Enter.js +42 -52
  74. package/lib/screenplay/interactions/Enter.js.map +1 -1
  75. package/lib/screenplay/interactions/ExecuteScript.d.ts +144 -148
  76. package/lib/screenplay/interactions/ExecuteScript.d.ts.map +1 -0
  77. package/lib/screenplay/interactions/ExecuteScript.js +163 -185
  78. package/lib/screenplay/interactions/ExecuteScript.js.map +1 -1
  79. package/lib/screenplay/interactions/Hover.d.ts +40 -50
  80. package/lib/screenplay/interactions/Hover.d.ts.map +1 -0
  81. package/lib/screenplay/interactions/Hover.js +44 -55
  82. package/lib/screenplay/interactions/Hover.js.map +1 -1
  83. package/lib/screenplay/interactions/Navigate.d.ts +106 -113
  84. package/lib/screenplay/interactions/Navigate.d.ts.map +1 -0
  85. package/lib/screenplay/interactions/Navigate.js +124 -146
  86. package/lib/screenplay/interactions/Navigate.js.map +1 -1
  87. package/lib/screenplay/interactions/PageElementInteraction.d.ts +12 -28
  88. package/lib/screenplay/interactions/PageElementInteraction.d.ts.map +1 -0
  89. package/lib/screenplay/interactions/PageElementInteraction.js +12 -33
  90. package/lib/screenplay/interactions/PageElementInteraction.js.map +1 -1
  91. package/lib/screenplay/interactions/Press.d.ts +61 -55
  92. package/lib/screenplay/interactions/Press.d.ts.map +1 -0
  93. package/lib/screenplay/interactions/Press.js +83 -72
  94. package/lib/screenplay/interactions/Press.js.map +1 -1
  95. package/lib/screenplay/interactions/RightClick.d.ts +59 -65
  96. package/lib/screenplay/interactions/RightClick.d.ts.map +1 -0
  97. package/lib/screenplay/interactions/RightClick.js +63 -70
  98. package/lib/screenplay/interactions/RightClick.js.map +1 -1
  99. package/lib/screenplay/interactions/Scroll.d.ts +46 -64
  100. package/lib/screenplay/interactions/Scroll.d.ts.map +1 -0
  101. package/lib/screenplay/interactions/Scroll.js +49 -71
  102. package/lib/screenplay/interactions/Scroll.js.map +1 -1
  103. package/lib/screenplay/interactions/Select.d.ts +217 -193
  104. package/lib/screenplay/interactions/Select.d.ts.map +1 -0
  105. package/lib/screenplay/interactions/Select.js +218 -245
  106. package/lib/screenplay/interactions/Select.js.map +1 -1
  107. package/lib/screenplay/interactions/Switch.d.ts +105 -128
  108. package/lib/screenplay/interactions/Switch.d.ts.map +1 -0
  109. package/lib/screenplay/interactions/Switch.js +121 -172
  110. package/lib/screenplay/interactions/Switch.js.map +1 -1
  111. package/lib/screenplay/interactions/TakeScreenshot.d.ts +28 -50
  112. package/lib/screenplay/interactions/TakeScreenshot.d.ts.map +1 -0
  113. package/lib/screenplay/interactions/TakeScreenshot.js +32 -57
  114. package/lib/screenplay/interactions/TakeScreenshot.js.map +1 -1
  115. package/lib/screenplay/interactions/index.d.ts +2 -3
  116. package/lib/screenplay/interactions/index.d.ts.map +1 -0
  117. package/lib/screenplay/interactions/index.js +6 -4
  118. package/lib/screenplay/interactions/index.js.map +1 -1
  119. package/lib/screenplay/models/BrowserCapabilities.d.ts +24 -0
  120. package/lib/screenplay/models/BrowserCapabilities.d.ts.map +1 -0
  121. package/lib/screenplay/models/BrowserCapabilities.js.map +1 -0
  122. package/lib/screenplay/models/BrowsingSession.d.ts +69 -0
  123. package/lib/screenplay/models/BrowsingSession.d.ts.map +1 -0
  124. package/lib/screenplay/models/BrowsingSession.js +101 -0
  125. package/lib/screenplay/models/BrowsingSession.js.map +1 -0
  126. package/lib/screenplay/models/Cookie.d.ts +104 -64
  127. package/lib/screenplay/models/Cookie.d.ts.map +1 -0
  128. package/lib/screenplay/models/Cookie.js +110 -59
  129. package/lib/screenplay/models/Cookie.js.map +1 -1
  130. package/lib/screenplay/models/CookieData.d.ts +20 -58
  131. package/lib/screenplay/models/CookieData.d.ts.map +1 -0
  132. package/lib/{input → screenplay/models}/Key.d.ts +13 -9
  133. package/lib/screenplay/models/Key.d.ts.map +1 -0
  134. package/lib/{input → screenplay/models}/Key.js +16 -13
  135. package/lib/screenplay/models/Key.js.map +1 -0
  136. package/lib/screenplay/models/Locator.d.ts +29 -8
  137. package/lib/screenplay/models/Locator.d.ts.map +1 -0
  138. package/lib/screenplay/models/Locator.js +53 -7
  139. package/lib/screenplay/models/Locator.js.map +1 -1
  140. package/lib/screenplay/models/Page.d.ts +398 -36
  141. package/lib/screenplay/models/Page.d.ts.map +1 -0
  142. package/lib/screenplay/models/Page.js +209 -4
  143. package/lib/screenplay/models/Page.js.map +1 -1
  144. package/lib/screenplay/models/PageElement.d.ts +77 -5
  145. package/lib/screenplay/models/PageElement.d.ts.map +1 -0
  146. package/lib/screenplay/models/PageElement.js +29 -7
  147. package/lib/screenplay/models/PageElement.js.map +1 -1
  148. package/lib/screenplay/models/PageElements.d.ts +16 -3
  149. package/lib/screenplay/models/PageElements.d.ts.map +1 -0
  150. package/lib/screenplay/models/PageElements.js +21 -8
  151. package/lib/screenplay/models/PageElements.js.map +1 -1
  152. package/lib/screenplay/models/RootLocator.d.ts +25 -0
  153. package/lib/screenplay/models/RootLocator.d.ts.map +1 -0
  154. package/lib/screenplay/models/RootLocator.js +52 -0
  155. package/lib/screenplay/models/RootLocator.js.map +1 -0
  156. package/lib/screenplay/models/SelectOption.d.ts +25 -0
  157. package/lib/screenplay/models/SelectOption.d.ts.map +1 -0
  158. package/lib/screenplay/models/SelectOption.js +37 -0
  159. package/lib/screenplay/models/SelectOption.js.map +1 -0
  160. package/lib/screenplay/models/Switchable.d.ts +23 -0
  161. package/lib/screenplay/models/Switchable.d.ts.map +1 -0
  162. package/lib/screenplay/{interactions/WaitBuilder.js → models/Switchable.js} +1 -1
  163. package/lib/screenplay/models/Switchable.js.map +1 -0
  164. package/lib/screenplay/models/SwitchableOrigin.d.ts +18 -0
  165. package/lib/screenplay/models/SwitchableOrigin.d.ts.map +1 -0
  166. package/lib/screenplay/{interactions/EnterBuilder.js → models/SwitchableOrigin.js} +1 -1
  167. package/lib/screenplay/models/SwitchableOrigin.js.map +1 -0
  168. package/lib/screenplay/models/dialogs/AbsentModalDialog.d.ts +15 -0
  169. package/lib/screenplay/models/dialogs/AbsentModalDialog.d.ts.map +1 -0
  170. package/lib/screenplay/models/dialogs/AbsentModalDialog.js +24 -0
  171. package/lib/screenplay/models/dialogs/AbsentModalDialog.js.map +1 -0
  172. package/lib/screenplay/models/dialogs/AcceptedModalDialog.d.ts +17 -0
  173. package/lib/screenplay/models/dialogs/AcceptedModalDialog.d.ts.map +1 -0
  174. package/lib/screenplay/models/dialogs/AcceptedModalDialog.js +29 -0
  175. package/lib/screenplay/models/dialogs/AcceptedModalDialog.js.map +1 -0
  176. package/lib/screenplay/models/dialogs/DismissedModalDialog.d.ts +17 -0
  177. package/lib/screenplay/models/dialogs/DismissedModalDialog.d.ts.map +1 -0
  178. package/lib/screenplay/models/dialogs/DismissedModalDialog.js +29 -0
  179. package/lib/screenplay/models/dialogs/DismissedModalDialog.js.map +1 -0
  180. package/lib/screenplay/models/dialogs/ModalDialog.d.ts +168 -0
  181. package/lib/screenplay/models/dialogs/ModalDialog.d.ts.map +1 -0
  182. package/lib/screenplay/models/dialogs/ModalDialog.js +174 -0
  183. package/lib/screenplay/models/dialogs/ModalDialog.js.map +1 -0
  184. package/lib/screenplay/models/dialogs/ModalDialogHandler.d.ts +38 -0
  185. package/lib/screenplay/models/dialogs/ModalDialogHandler.d.ts.map +1 -0
  186. package/lib/screenplay/models/dialogs/ModalDialogHandler.js +30 -0
  187. package/lib/screenplay/models/dialogs/ModalDialogHandler.js.map +1 -0
  188. package/lib/screenplay/models/dialogs/index.d.ts +6 -0
  189. package/lib/screenplay/models/dialogs/index.d.ts.map +1 -0
  190. package/lib/screenplay/models/dialogs/index.js +22 -0
  191. package/lib/screenplay/models/dialogs/index.js.map +1 -0
  192. package/lib/screenplay/models/index.d.ts +9 -1
  193. package/lib/screenplay/models/index.d.ts.map +1 -0
  194. package/lib/screenplay/models/index.js +13 -2
  195. package/lib/screenplay/models/index.js.map +1 -1
  196. package/lib/screenplay/models/selectors/By.d.ts +38 -0
  197. package/lib/screenplay/models/selectors/By.d.ts.map +1 -0
  198. package/lib/screenplay/models/selectors/By.js +43 -0
  199. package/lib/screenplay/models/selectors/By.js.map +1 -1
  200. package/lib/screenplay/models/selectors/ByCss.d.ts +8 -0
  201. package/lib/screenplay/models/selectors/ByCss.d.ts.map +1 -0
  202. package/lib/screenplay/models/selectors/ByCss.js +7 -0
  203. package/lib/screenplay/models/selectors/ByCss.js.map +1 -1
  204. package/lib/screenplay/models/selectors/ByCssContainingText.d.ts +9 -0
  205. package/lib/screenplay/models/selectors/ByCssContainingText.d.ts.map +1 -0
  206. package/lib/screenplay/models/selectors/ByCssContainingText.js +8 -0
  207. package/lib/screenplay/models/selectors/ByCssContainingText.js.map +1 -1
  208. package/lib/screenplay/models/selectors/ByDeepCss.d.ts +14 -0
  209. package/lib/screenplay/models/selectors/ByDeepCss.d.ts.map +1 -0
  210. package/lib/screenplay/models/selectors/ByDeepCss.js +20 -0
  211. package/lib/screenplay/models/selectors/ByDeepCss.js.map +1 -0
  212. package/lib/screenplay/models/selectors/ById.d.ts +8 -0
  213. package/lib/screenplay/models/selectors/ById.d.ts.map +1 -0
  214. package/lib/screenplay/models/selectors/ById.js +7 -0
  215. package/lib/screenplay/models/selectors/ById.js.map +1 -1
  216. package/lib/screenplay/models/selectors/ByTagName.d.ts +8 -0
  217. package/lib/screenplay/models/selectors/ByTagName.d.ts.map +1 -0
  218. package/lib/screenplay/models/selectors/ByTagName.js +7 -0
  219. package/lib/screenplay/models/selectors/ByTagName.js.map +1 -1
  220. package/lib/screenplay/models/selectors/ByXPath.d.ts +8 -0
  221. package/lib/screenplay/models/selectors/ByXPath.d.ts.map +1 -0
  222. package/lib/screenplay/models/selectors/ByXPath.js +7 -0
  223. package/lib/screenplay/models/selectors/ByXPath.js.map +1 -1
  224. package/lib/screenplay/models/selectors/Selector.d.ts +6 -0
  225. package/lib/screenplay/models/selectors/Selector.d.ts.map +1 -0
  226. package/lib/screenplay/models/selectors/Selector.js +6 -1
  227. package/lib/screenplay/models/selectors/Selector.js.map +1 -1
  228. package/lib/screenplay/models/selectors/index.d.ts +2 -0
  229. package/lib/screenplay/models/selectors/index.d.ts.map +1 -0
  230. package/lib/screenplay/models/selectors/index.js +6 -1
  231. package/lib/screenplay/models/selectors/index.js.map +1 -1
  232. package/lib/screenplay/questions/Attribute.d.ts +115 -67
  233. package/lib/screenplay/questions/Attribute.d.ts.map +1 -0
  234. package/lib/screenplay/questions/Attribute.js +128 -74
  235. package/lib/screenplay/questions/Attribute.js.map +1 -1
  236. package/lib/screenplay/questions/CssClasses.d.ts +124 -79
  237. package/lib/screenplay/questions/CssClasses.d.ts.map +1 -0
  238. package/lib/screenplay/questions/CssClasses.js +132 -83
  239. package/lib/screenplay/questions/CssClasses.js.map +1 -1
  240. package/lib/screenplay/questions/LastScriptExecution.d.ts +42 -6
  241. package/lib/screenplay/questions/LastScriptExecution.d.ts.map +1 -0
  242. package/lib/screenplay/questions/LastScriptExecution.js +45 -7
  243. package/lib/screenplay/questions/LastScriptExecution.js.map +1 -1
  244. package/lib/screenplay/questions/Selected.d.ts +202 -171
  245. package/lib/screenplay/questions/Selected.d.ts.map +1 -0
  246. package/lib/screenplay/questions/Selected.js +225 -186
  247. package/lib/screenplay/questions/Selected.js.map +1 -1
  248. package/lib/screenplay/questions/Text.d.ts +101 -82
  249. package/lib/screenplay/questions/Text.d.ts.map +1 -0
  250. package/lib/screenplay/questions/Text.js +143 -92
  251. package/lib/screenplay/questions/Text.js.map +1 -1
  252. package/lib/screenplay/questions/Value.d.ts +77 -44
  253. package/lib/screenplay/questions/Value.d.ts.map +1 -0
  254. package/lib/screenplay/questions/Value.js +84 -47
  255. package/lib/screenplay/questions/Value.js.map +1 -1
  256. package/lib/screenplay/questions/index.d.ts +1 -0
  257. package/lib/screenplay/questions/index.d.ts.map +1 -0
  258. package/lib/screenplay/questions/index.js +5 -1
  259. package/lib/screenplay/questions/index.js.map +1 -1
  260. package/lib/scripts/index.d.ts +2 -0
  261. package/lib/scripts/index.d.ts.map +1 -0
  262. package/lib/{input → scripts}/index.js +6 -2
  263. package/lib/scripts/index.js.map +1 -0
  264. package/lib/scripts/isVisible.d.ts +2 -0
  265. package/lib/scripts/isVisible.d.ts.map +1 -0
  266. package/lib/scripts/isVisible.js +96 -0
  267. package/lib/scripts/isVisible.js.map +1 -0
  268. package/lib/stage/crew/index.d.ts +1 -0
  269. package/lib/stage/crew/index.d.ts.map +1 -0
  270. package/lib/stage/crew/index.js +5 -1
  271. package/lib/stage/crew/index.js.map +1 -1
  272. package/lib/stage/crew/photographer/Photographer.d.ts +126 -39
  273. package/lib/stage/crew/photographer/Photographer.d.ts.map +1 -0
  274. package/lib/stage/crew/photographer/Photographer.js +161 -42
  275. package/lib/stage/crew/photographer/Photographer.js.map +1 -1
  276. package/lib/stage/crew/photographer/index.d.ts +1 -0
  277. package/lib/stage/crew/photographer/index.d.ts.map +1 -0
  278. package/lib/stage/crew/photographer/index.js +5 -1
  279. package/lib/stage/crew/photographer/index.js.map +1 -1
  280. package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.d.ts +13 -12
  281. package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.d.ts.map +1 -0
  282. package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.js +22 -33
  283. package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.js.map +1 -1
  284. package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.d.ts +8 -8
  285. package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.d.ts.map +1 -0
  286. package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.js +7 -8
  287. package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.js.map +1 -1
  288. package/lib/stage/crew/photographer/strategies/TakePhotosOfFailures.d.ts +8 -7
  289. package/lib/stage/crew/photographer/strategies/TakePhotosOfFailures.d.ts.map +1 -0
  290. package/lib/stage/crew/photographer/strategies/TakePhotosOfFailures.js +7 -7
  291. package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.d.ts +8 -8
  292. package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.d.ts.map +1 -0
  293. package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.js +7 -8
  294. package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.js.map +1 -1
  295. package/lib/stage/crew/photographer/strategies/index.d.ts +1 -0
  296. package/lib/stage/crew/photographer/strategies/index.d.ts.map +1 -0
  297. package/lib/stage/crew/photographer/strategies/index.js +5 -1
  298. package/lib/stage/crew/photographer/strategies/index.js.map +1 -1
  299. package/lib/stage/index.d.ts +1 -0
  300. package/lib/stage/index.d.ts.map +1 -0
  301. package/lib/stage/index.js +5 -1
  302. package/lib/stage/index.js.map +1 -1
  303. package/package.json +20 -43
  304. package/src/errors/BrowserWindowClosedError.ts +17 -0
  305. package/src/errors/CookieMissingError.ts +10 -0
  306. package/src/errors/ModalDialogObstructsScreenshotError.ts +17 -0
  307. package/src/errors/index.ts +2 -0
  308. package/src/expectations/index.ts +0 -1
  309. package/src/expectations/isActive.ts +23 -12
  310. package/src/expectations/isClickable.ts +22 -21
  311. package/src/expectations/isEnabled.ts +23 -9
  312. package/src/expectations/isSelected.ts +20 -10
  313. package/src/expectations/isVisible.ts +23 -9
  314. package/src/index.ts +0 -1
  315. package/src/screenplay/abilities/BrowseTheWeb.ts +95 -87
  316. package/src/screenplay/abilities/index.ts +0 -1
  317. package/src/screenplay/interactions/Clear.ts +75 -63
  318. package/src/screenplay/interactions/Click.ts +43 -54
  319. package/src/screenplay/interactions/DoubleClick.ts +66 -71
  320. package/src/screenplay/interactions/Enter.ts +41 -53
  321. package/src/screenplay/interactions/ExecuteScript.ts +207 -220
  322. package/src/screenplay/interactions/Hover.ts +42 -54
  323. package/src/screenplay/interactions/Navigate.ts +129 -156
  324. package/src/screenplay/interactions/PageElementInteraction.ts +14 -34
  325. package/src/screenplay/interactions/Press.ts +78 -69
  326. package/src/screenplay/interactions/RightClick.ts +61 -69
  327. package/src/screenplay/interactions/Scroll.ts +48 -71
  328. package/src/screenplay/interactions/Select.ts +229 -269
  329. package/src/screenplay/interactions/Switch.ts +123 -179
  330. package/src/screenplay/interactions/TakeScreenshot.ts +31 -57
  331. package/src/screenplay/interactions/index.ts +1 -3
  332. package/src/screenplay/models/BrowserCapabilities.ts +26 -0
  333. package/src/screenplay/models/BrowsingSession.ts +115 -0
  334. package/src/screenplay/models/Cookie.ts +115 -73
  335. package/src/screenplay/models/CookieData.ts +20 -58
  336. package/src/{input → screenplay/models}/Key.ts +12 -9
  337. package/src/screenplay/models/Locator.ts +43 -9
  338. package/src/screenplay/models/Page.ts +438 -37
  339. package/src/screenplay/models/PageElement.ts +92 -12
  340. package/src/screenplay/models/PageElements.ts +23 -9
  341. package/src/screenplay/models/RootLocator.ts +30 -0
  342. package/src/screenplay/models/SelectOption.ts +38 -0
  343. package/src/screenplay/models/Switchable.ts +24 -0
  344. package/src/screenplay/models/SwitchableOrigin.ts +18 -0
  345. package/src/screenplay/models/dialogs/AbsentModalDialog.ts +22 -0
  346. package/src/screenplay/models/dialogs/AcceptedModalDialog.ts +27 -0
  347. package/src/screenplay/models/dialogs/DismissedModalDialog.ts +27 -0
  348. package/src/screenplay/models/dialogs/ModalDialog.ts +200 -0
  349. package/src/screenplay/models/dialogs/ModalDialogHandler.ts +50 -0
  350. package/src/screenplay/models/dialogs/index.ts +5 -0
  351. package/src/screenplay/models/index.ts +8 -1
  352. package/src/screenplay/models/selectors/By.ts +45 -0
  353. package/src/screenplay/models/selectors/ByCss.ts +7 -0
  354. package/src/screenplay/models/selectors/ByCssContainingText.ts +8 -0
  355. package/src/screenplay/models/selectors/ByDeepCss.ts +15 -0
  356. package/src/screenplay/models/selectors/ById.ts +7 -0
  357. package/src/screenplay/models/selectors/ByTagName.ts +7 -0
  358. package/src/screenplay/models/selectors/ByXPath.ts +7 -0
  359. package/src/screenplay/models/selectors/Selector.ts +6 -1
  360. package/src/screenplay/models/selectors/index.ts +1 -0
  361. package/src/screenplay/questions/Attribute.ts +137 -76
  362. package/src/screenplay/questions/CssClasses.ts +135 -83
  363. package/src/screenplay/questions/LastScriptExecution.ts +45 -8
  364. package/src/screenplay/questions/Selected.ts +237 -191
  365. package/src/screenplay/questions/Text.ts +161 -96
  366. package/src/screenplay/questions/Value.ts +88 -48
  367. package/src/scripts/index.ts +1 -0
  368. package/src/scripts/isVisible.ts +113 -0
  369. package/src/stage/crew/photographer/Photographer.ts +142 -41
  370. package/src/stage/crew/photographer/strategies/PhotoTakingStrategy.ts +27 -42
  371. package/src/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.ts +7 -8
  372. package/src/stage/crew/photographer/strategies/TakePhotosOfFailures.ts +7 -7
  373. package/src/stage/crew/photographer/strategies/TakePhotosOfInteractions.ts +7 -8
  374. package/tsconfig.build.json +14 -0
  375. package/lib/expectations/ElementExpectation.d.ts +0 -83
  376. package/lib/expectations/ElementExpectation.js +0 -102
  377. package/lib/expectations/ElementExpectation.js.map +0 -1
  378. package/lib/input/Key.js.map +0 -1
  379. package/lib/input/index.d.ts +0 -1
  380. package/lib/input/index.js.map +0 -1
  381. package/lib/screenplay/abilities/BrowserCapabilities.d.ts +0 -5
  382. package/lib/screenplay/abilities/BrowserCapabilities.js.map +0 -1
  383. package/lib/screenplay/interactions/EnterBuilder.d.ts +0 -25
  384. package/lib/screenplay/interactions/EnterBuilder.js.map +0 -1
  385. package/lib/screenplay/interactions/PressBuilder.d.ts +0 -26
  386. package/lib/screenplay/interactions/PressBuilder.js +0 -3
  387. package/lib/screenplay/interactions/PressBuilder.js.map +0 -1
  388. package/lib/screenplay/interactions/SelectBuilder.d.ts +0 -33
  389. package/lib/screenplay/interactions/SelectBuilder.js +0 -3
  390. package/lib/screenplay/interactions/SelectBuilder.js.map +0 -1
  391. package/lib/screenplay/interactions/Wait.d.ts +0 -143
  392. package/lib/screenplay/interactions/Wait.js +0 -238
  393. package/lib/screenplay/interactions/Wait.js.map +0 -1
  394. package/lib/screenplay/interactions/WaitBuilder.d.ts +0 -32
  395. package/lib/screenplay/interactions/WaitBuilder.js.map +0 -1
  396. package/lib/screenplay/models/ModalDialog.d.ts +0 -9
  397. package/lib/screenplay/models/ModalDialog.js +0 -14
  398. package/lib/screenplay/models/ModalDialog.js.map +0 -1
  399. package/lib/screenplay/questions/ElementQuestion.d.ts +0 -33
  400. package/lib/screenplay/questions/ElementQuestion.js +0 -53
  401. package/lib/screenplay/questions/ElementQuestion.js.map +0 -1
  402. package/src/expectations/ElementExpectation.ts +0 -108
  403. package/src/input/index.ts +0 -1
  404. package/src/screenplay/abilities/BrowserCapabilities.ts +0 -5
  405. package/src/screenplay/interactions/EnterBuilder.ts +0 -28
  406. package/src/screenplay/interactions/PressBuilder.ts +0 -29
  407. package/src/screenplay/interactions/SelectBuilder.ts +0 -36
  408. package/src/screenplay/interactions/Wait.ts +0 -260
  409. package/src/screenplay/interactions/WaitBuilder.ts +0 -34
  410. package/src/screenplay/models/ModalDialog.ts +0 -19
  411. package/src/screenplay/questions/ElementQuestion.ts +0 -58
  412. package/tsconfig.eslint.json +0 -10
  413. /package/lib/screenplay/{abilities → models}/BrowserCapabilities.js +0 -0
@@ -6,204 +6,203 @@ const io_1 = require("@serenity-js/core/lib/io");
6
6
  const model_1 = require("@serenity-js/core/lib/model");
7
7
  const abilities_1 = require("../abilities");
8
8
  /**
9
- * @desc
10
- * Instructs the {@link @serenity-js/core/lib/screenplay/actor~Actor} to
11
- * execute a script within the context of the current browser window.
9
+ * Instructs an {@apilink Actor|actor} who has the {@apilink Ability|ability} to {@apilink BrowseTheWeb}
10
+ * to execute a script within the context of the current browser tab.
12
11
  *
13
- * Please see the tests below for usage examples.
12
+ * ## Learn more
14
13
  *
15
- * @see {@link LastScriptExecution.result}
14
+ * - {@apilink BrowseTheWeb}
15
+ * - {@apilink LastScriptExecution.result}
16
+ *
17
+ * @group Activities
16
18
  */
17
19
  class ExecuteScript {
18
20
  /**
19
- * @desc
20
- * Instantiates a version of this {@link @serenity-js/core/lib/screenplay~Interaction}
21
- * configured to load a script from `sourceUrl`.
21
+ * Instantiates a version of this {@apilink Interaction}
22
+ * configured to load a script from `sourceUrl`.
22
23
  *
23
- * @param {string} sourceUrl
24
+ * @param sourceUrl
24
25
  * The URL to load the script from
25
- *
26
- * @returns {@serenity-js/core/lib/screenplay~Interaction}
27
26
  */
28
27
  static from(sourceUrl) {
29
28
  return new ExecuteScriptFromUrl(sourceUrl);
30
29
  }
31
30
  /**
32
- * @desc
33
- * Schedules a command to execute asynchronous JavaScript in the context of the currently selected frame or window.
34
- * The script fragment will be executed as the body of an anonymous function.
35
- * If the script is provided as a function object, that function will be converted to a string for injection
36
- * into the target window.
31
+ * Instructs an {@apilink Actor|actor} who has the {@apilink Ability|ability} to {@apilink BrowseTheWeb}
32
+ * to execute an asynchronous script within the context of the current browser tab.
37
33
  *
38
- * Any arguments provided in addition to the script will be included as script arguments and may be referenced
39
- * using the `arguments` object. Arguments may be a `boolean`, `number`, `string`
40
- * or {@link Target} (`Answerable<Element>`).
41
- * Arrays and objects may also be used as script arguments as long as each item adheres
42
- * to the types previously mentioned.
34
+ * The script fragment will be executed as the body of an anonymous function.
35
+ * If the script is provided as a function object, that function will be converted to a string for injection
36
+ * into the target window.
43
37
  *
44
- * Unlike executing synchronous JavaScript with {@link ExecuteScript#sync},
45
- * scripts executed with this function must explicitly signal they are finished by invoking the provided callback.
38
+ * Any arguments provided in addition to the script will be included as script arguments and may be referenced
39
+ * using the `arguments` object. Arguments may be a `boolean`, `number`, `string`
40
+ * or {@apilink PageElement}.
41
+ * Arrays and objects may also be used as script arguments as long as each item adheres
42
+ * to the types previously mentioned.
46
43
  *
47
- * This callback will always be injected into the executed function as the last argument,
48
- * and thus may be referenced with `arguments[arguments.length - 1]`.
44
+ * Unlike executing synchronous JavaScript with {@apilink ExecuteScript.sync},
45
+ * scripts executed with this function must explicitly signal they are finished by invoking the provided callback.
49
46
  *
50
- * If the script invokes the `callback` with a return value, this will be made available
51
- * via the {@link LastScriptExecution.result}.
47
+ * This callback will always be injected into the executed function as the last argument,
48
+ * and thus may be referenced with `arguments[arguments.length - 1]`.
52
49
  *
53
- * **Please note** that in order to signal an error in the `script` you need to throw an {@link Error}
54
- * instead of passing it to the callback function.
50
+ * If the script invokes the `callback` with a return value, this will be made available
51
+ * via the {@apilink LastScriptExecution.result}.
55
52
  *
56
- * @example <caption>Executing an async script</caption>
57
- * import { ExecuteScript } from '@serenity-js/webdriverio';
53
+ * **Please note** that in order to signal an error in the `script` you need to throw an {@apilink Error}
54
+ * instead of passing it to the callback function.
58
55
  *
59
- * actor.attemptsTo(
60
- * ExecuteScript.async(`
61
- * var callback = arguments[arguments.length - 1];
56
+ * #### Executing an async script
62
57
  *
63
- * // do stuff
58
+ * ```ts
59
+ * import { actorCalled } from '@serenity-js/core'
60
+ * import { ExecuteScript } from '@serenity-js/web'
64
61
  *
65
- * callback(result)
66
- * `)
67
- * );
62
+ * await actorCalled('Esti').attemptsTo(
63
+ * ExecuteScript.async(`
64
+ * var callback = arguments[arguments.length - 1]
68
65
  *
69
- * @example <caption>Passing arguments to an async script</caption>
70
- * import { ExecuteScript } from '@serenity-js/webdriverio';
66
+ * // do stuff
71
67
  *
72
- * actor.attemptsTo(
73
- * ExecuteScript.async(`
74
- * var name = arguments[0];
75
- * var age = arguments[1];
76
- * var callback = arguments[arguments.length - 1];
68
+ * callback(result)
69
+ * `)
70
+ * )
71
+ * ```
77
72
  *
78
- * // do stuff
73
+ * #### Passing arguments to an async script
79
74
  *
80
- * callback(result)
81
- * `).withArguments('Bob', 24)
82
- * );
75
+ * ```ts
76
+ * import { actorCalled } from '@serenity-js/core'
77
+ * import { ExecuteScript } from '@serenity-js/web'
83
78
  *
84
- * @example <caption>Passing Target arguments to an async script</caption>
85
- * import { ExecuteScript } from '@serenity-js/webdriverio';
79
+ * await actorCalled('Esti').attemptsTo(
80
+ * ExecuteScript.async(`
81
+ * var name = arguments[0];
82
+ * var age = arguments[1];
83
+ * var callback = arguments[arguments.length - 1]
86
84
  *
87
- * actor.attemptsTo(
88
- * ExecuteScript.async(`
89
- * var header = arguments[0]; // Target gets converted to a WebElement
90
- * var callback = arguments[arguments.length - 1];
85
+ * // do stuff
91
86
  *
92
- * callback(header.innerText)
93
- * `).withArguments(Target.the('header').located(by.css('h1')))
94
- * );
87
+ * callback(result)
88
+ * `).withArguments('Bob', 24)
89
+ * )
90
+ * ```
95
91
  *
96
- * @example <caption>Executing async script as function</caption>
97
- * import { ExecuteScript } from '@serenity-js/webdriverio';
92
+ * #### Passing Target arguments to an async script
98
93
  *
99
- * actor.attemptsTo(
100
- * ExecuteScript.async(function getText(header, callback) {
101
- * callback(header.innerText)
102
- * }).withArguments(Target.the('header').located(by.css('h1')))
103
- * );
94
+ * ```ts
95
+ * import { actorCalled } from '@serenity-js/core'
96
+ * import { ExecuteScript } from '@serenity-js/web'
104
97
  *
105
- * @param {string | Function} script
106
- * The script to be executed
98
+ * await actorCalled('Esti').attemptsTo(
99
+ * ExecuteScript.async(`
100
+ * var header = arguments[0] // PageElement object gets converted to a WebElement
101
+ * var callback = arguments[arguments.length - 1]
102
+ *
103
+ * callback(header.innerText)
104
+ * `).withArguments(PageElement.located(By.css('h1')).describedAs('header'))
105
+ * )
106
+ * ```
107
+ *
108
+ * #### Executing async script as function
107
109
  *
108
- * @returns {ExecuteScriptWithArguments}
110
+ * ```ts
111
+ * import { actorCalled } from '@serenity-js/core'
112
+ * import { ExecuteScript } from '@serenity-js/web'
109
113
  *
110
- * @see {@link LastScriptExecution.result}
114
+ * await actorCalled('Esti').attemptsTo(
115
+ * ExecuteScript.async(function getText(header, callback) {
116
+ * callback(header.innerText)
117
+ * }).withArguments(PageElement.located(By.css('h1')).describedAs('header'))
118
+ * )
119
+ * ```
120
+ *
121
+ * #### Learn more
122
+ * - {@apilink LastScriptExecution.result}
123
+ *
124
+ * @param script
125
+ * The script to be executed
111
126
  */
112
127
  static async(script) {
113
- return new ExecuteAsynchronousScript(script);
128
+ return new ExecuteAsynchronousScript(`#actor executes an asynchronous script`, script);
114
129
  }
115
130
  /**
116
- * @desc
117
- * Instructs the {@link @serenity-js/core/lib/screenplay/actor~Actor} to
118
- * execute a synchronous script in the context of the currently selected frame or window.
119
- *
120
- * If the script returns a value, it will be made available via {@link LastScriptExecution.result}.
121
- *
122
- * @example <caption>Executing a sync script as string and reading the result</caption>
123
- * import { actorCalled } from '@serenity-js/core';
124
- * import { BrowseTheWeb, ExecuteScript, LastScriptExecution } from '@serenity-js/webdriverio';
125
- * import { Ensure, includes } from '@serenity-js/assertions';
126
- *
127
- * actorCalled('Joseph')
128
- * .whoCan(BrowseTheWeb.using(browser))
129
- * .attemptsTo(
130
- * ExecuteScript.sync('return navigator.userAgent'),
131
- * Ensure.that(LastScriptExecution.result<string>(), includes('Chrome')),
132
- * );
133
- *
134
- * @example <caption>Executing a sync script as function and reading the result</caption>
135
- * import { actorCalled } from '@serenity-js/core';
136
- * import { by, BrowseTheWeb, Enter, ExecuteScript, LastScriptExecution, Target } from '@serenity-js/webdriverio';
137
- *
138
- * const someOfferField = Target.the('offer code').located(by.id('offer-code'));
139
- * const applyOfferCodeField = Target.the('apply offer field').located(by.id('apply-offer-code'));
140
- *
141
- * actorCalled('Joseph')
142
- * .whoCan(BrowseTheWeb.using(browser))
143
- * .attemptsTo(
144
- * // inject JavaScript to read some property of an element
145
- * ExecuteScript.sync(function getValue(element) {
146
- * return element.value;
147
- * }).withArguments(someOfferField),
148
- *
149
- * // use LastScriptExecution.result() to read the value
150
- * // returned from the injected script
151
- * // and pass it to another interaction
152
- * Enter.theValue(LastScriptExecution.result<string>()).into(applyOfferCodeField),
153
- * );
154
- *
155
- * @param {string | Function} script
156
- * The script to be executed
131
+ * Instructs an {@apilink Actor|actor} who has the {@apilink Ability|ability} to {@apilink BrowseTheWeb}
132
+ * to execute a synchronous script within the context of the current browser tab.
133
+ *
134
+ * If the script returns a value, it will be made available via {@apilink LastScriptExecution.result}.
135
+ *
136
+ * #### Executing a sync script as string and reading the result
137
+ *
138
+ * ```ts
139
+ * import { actorCalled } from '@serenity-js/core'
140
+ * import { ExecuteScript, LastScriptExecution } from '@serenity-js/web'
141
+ * import { Ensure, includes } from '@serenity-js/assertions'
142
+ *
143
+ * await actorCalled('Joseph')
144
+ * .attemptsTo(
145
+ * ExecuteScript.sync('return navigator.userAgent'),
146
+ * Ensure.that(LastScriptExecution.result<string>(), includes('Chrome')),
147
+ * )
148
+ * ```
149
+ *
150
+ * #### Executing a sync script as function and reading the result
151
+ *
152
+ * ```ts
153
+ * import { actorCalled } from '@serenity-js/core'
154
+ * import { By, Enter, ExecuteScript, LastScriptExecution, PageElement } from '@serenity-js/web'
155
+ *
156
+ * const someOfferField = () =>
157
+ * PageElement.located(By.id('offer-code'))
158
+ * .describedAs('offer code')
159
+ *
160
+ * const applyOfferCodeField = () =>
161
+ * PageElement.located(By.id('apply-offer-code'))
162
+ * .describedAs('apply offer field')
163
+ *
164
+ * await actorCalled('Joseph')
165
+ * .attemptsTo(
166
+ * // inject JavaScript to read some property of an element
167
+ * ExecuteScript.sync(function getValue(element) {
168
+ * return element.value;
169
+ * }).withArguments(someOfferField),
170
+ *
171
+ * // use LastScriptExecution.result() to read the value
172
+ * // returned from the injected script
173
+ * // and pass it to another interaction
174
+ * Enter.theValue(LastScriptExecution.result<string>()).into(applyOfferCodeField),
175
+ * )
176
+ * ```
157
177
  *
158
- * @returns {ExecuteScriptWithArguments}
178
+ * #### Learn more
179
+ * - {@apilink LastScriptExecution.result}
159
180
  *
160
- * @see {@link LastScriptExecution.result}
181
+ * @param script
182
+ * The script to be executed
161
183
  */
162
184
  static sync(script) {
163
- return new ExecuteSynchronousScript(script);
185
+ return new ExecuteSynchronousScript(`#actor executes a synchronous script`, script);
164
186
  }
165
187
  }
166
188
  exports.ExecuteScript = ExecuteScript;
167
189
  /**
168
- * @desc
169
- * Allows for a script to be executed to be parametrised.
170
- *
171
- * **Please note** that the arguments can be both synchronous and asynchronous {@link @serenity-js/core/lib/screenplay~Question}s
172
- * as well as regular static values.
173
- *
174
- * @abstract
190
+ * Allows for a script to be executed to be parametrised.
175
191
  *
176
- * @see {@link ExecuteScript}
192
+ * ## Learn more
193
+ * - {@apilink ExecuteScript}
177
194
  *
178
- * @extends {@serenity-js/core/lib/screenplay~Interaction}
195
+ * @group Activities
179
196
  */
180
197
  class ExecuteScriptWithArguments extends core_1.Interaction {
181
- /**
182
- * @param {string | Function} script
183
- * The script to be executed
184
- *
185
- * @param {Array<Answerable<any>>} args
186
- * Arguments to parametrise the script with
187
- */
188
- constructor(script, // eslint-disable-line @typescript-eslint/ban-types
198
+ constructor(description, script, // eslint-disable-line @typescript-eslint/ban-types
189
199
  args = []) {
190
- super();
200
+ super(description, core_1.Interaction.callerLocation(5));
191
201
  this.script = script;
192
202
  this.args = args;
193
203
  }
194
204
  /**
195
- * @desc
196
- * Makes the provided {@link @serenity-js/core/lib/screenplay/actor~Actor}
197
- * perform this {@link @serenity-js/core/lib/screenplay~Interaction}.
198
- *
199
- * @param {UsesAbilities & AnswersQuestions} actor
200
- * An {@link @serenity-js/core/lib/screenplay/actor~Actor} to perform this {@link @serenity-js/core/lib/screenplay~Interaction}
201
- *
202
- * @returns {PromiseLike<void>}
203
- *
204
- * @see {@link @serenity-js/core/lib/screenplay/actor~Actor}
205
- * @see {@link @serenity-js/core/lib/screenplay/actor~UsesAbilities}
206
- * @see {@link @serenity-js/core/lib/screenplay/actor~AnswersQuestions}
205
+ * @inheritDoc
207
206
  */
208
207
  async performAs(actor) {
209
208
  const args = await (0, io_1.asyncMap)(this.args, arg => actor.answer(arg));
@@ -220,15 +219,13 @@ exports.ExecuteScriptWithArguments = ExecuteScriptWithArguments;
220
219
  */
221
220
  class ExecuteAsynchronousScript extends ExecuteScriptWithArguments {
222
221
  withArguments(...args) {
223
- return new ExecuteAsynchronousScript(this.script, args);
222
+ return new ExecuteAsynchronousScript(args.length > 0
223
+ ? (0, core_1.f) `#actor executes an asynchronous script with arguments: ${args}`
224
+ : this.toString(), this.script, args);
224
225
  }
225
- executeAs(actor, args) {
226
- return abilities_1.BrowseTheWeb.as(actor).executeAsyncScript(this.script, ...args); // todo: fix types
227
- }
228
- toString() {
229
- return this.args.length > 0
230
- ? (0, io_1.formatted) `#actor executes an asynchronous script with arguments: ${this.args}`
231
- : `#actor executes an asynchronous script`;
226
+ async executeAs(actor, args) {
227
+ const page = await abilities_1.BrowseTheWeb.as(actor).currentPage();
228
+ return page.executeAsyncScript(this.script, ...args); // todo: fix types
232
229
  }
233
230
  }
234
231
  /**
@@ -239,24 +236,16 @@ class ExecuteAsynchronousScript extends ExecuteScriptWithArguments {
239
236
  */
240
237
  class ExecuteScriptFromUrl extends core_1.Interaction {
241
238
  constructor(sourceUrl) {
242
- super();
239
+ super((0, core_1.f) `#actor executes a script from ${sourceUrl}`);
243
240
  this.sourceUrl = sourceUrl;
244
241
  }
245
242
  /**
246
- * @desc
247
- * Makes the provided {@link @serenity-js/core/lib/screenplay/actor~Actor}
248
- * perform this {@link @serenity-js/core/lib/screenplay~Interaction}.
249
- *
250
- * @param {UsesAbilities & AnswersQuestions} actor
251
- * @returns {Promise<void>}
252
- *
253
- * @see {@link @serenity-js/core/lib/screenplay/actor~Actor}
254
- * @see {@link @serenity-js/core/lib/screenplay/actor~UsesAbilities}
255
- * @see {@link @serenity-js/core/lib/screenplay/actor~AnswersQuestions}
243
+ * @inheritDoc
256
244
  */
257
- performAs(actor) {
258
- return abilities_1.BrowseTheWeb.as(actor)
259
- .executeAsyncScript(
245
+ async performAs(actor) {
246
+ const page = await abilities_1.BrowseTheWeb.as(actor).currentPage();
247
+ const sourceUrl = await actor.answer(this.sourceUrl);
248
+ return page.executeAsyncScript(
260
249
  /* istanbul ignore next */
261
250
  function executeScriptFromUrl(sourceUrl, callback) {
262
251
  const alreadyLoadedScripts = Array.prototype.slice
@@ -270,42 +259,31 @@ class ExecuteScriptFromUrl extends core_1.Interaction {
270
259
  callback();
271
260
  });
272
261
  script.addEventListener('error', function () {
273
- return callback('Couldn\'t load script from ' + sourceUrl);
262
+ return callback(`Couldn't load script from ${sourceUrl}`);
274
263
  });
275
264
  script.src = sourceUrl;
276
265
  script.async = true;
277
266
  document.head.append(script);
278
- }, this.sourceUrl)
267
+ }, sourceUrl)
279
268
  .then(errorMessage => {
280
269
  if (errorMessage) {
281
270
  throw new core_1.LogicError(errorMessage);
282
271
  }
283
272
  });
284
273
  }
285
- /**
286
- * @desc
287
- * Generates a description to be used when reporting this {@link @serenity-js/core/lib/screenplay~Activity}.
288
- *
289
- * @returns {string}
290
- */
291
- toString() {
292
- return `#actor executes a script from ${this.sourceUrl}`;
293
- }
294
274
  }
295
275
  /**
296
276
  * @package
297
277
  */
298
278
  class ExecuteSynchronousScript extends ExecuteScriptWithArguments {
299
279
  withArguments(...args) {
300
- return new ExecuteSynchronousScript(this.script, args);
301
- }
302
- executeAs(actor, args) {
303
- return abilities_1.BrowseTheWeb.as(actor).executeScript(this.script, ...args); // todo fix type
280
+ return new ExecuteSynchronousScript(args.length > 0
281
+ ? (0, core_1.f) `#actor executes a synchronous script with arguments: ${args}`
282
+ : this.toString(), this.script, args);
304
283
  }
305
- toString() {
306
- return this.args.length > 0
307
- ? (0, io_1.formatted) `#actor executes a synchronous script with arguments: ${this.args}`
308
- : `#actor executes a synchronous script`;
284
+ async executeAs(actor, args) {
285
+ const page = await abilities_1.BrowseTheWeb.as(actor).currentPage();
286
+ return page.executeScript(this.script, ...args); // todo fix type
309
287
  }
310
288
  }
311
289
  //# sourceMappingURL=ExecuteScript.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExecuteScript.js","sourceRoot":"","sources":["../../../src/screenplay/interactions/ExecuteScript.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExecuteScript.js","sourceRoot":"","sources":["../../../src/screenplay/interactions/ExecuteScript.ts"],"names":[],"mappings":"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"}
@@ -2,77 +2,67 @@ import { Answerable, AnswersQuestions, Interaction, UsesAbilities } from '@seren
2
2
  import { PageElement } from '../models';
3
3
  import { PageElementInteraction } from './PageElementInteraction';
4
4
  /**
5
- * @desc
6
- * Instructs the {@link @serenity-js/core/lib/screenplay/actor~Actor} to
7
- * hover the mouse pointer over a given Web element.
5
+ * Instructs an {@apilink Actor|actor} who has the {@apilink Ability|ability} to {@apilink BrowseTheWeb}
6
+ * to hover the mouse pointer over a given {@apilink PageElement}.
8
7
  *
9
- * @example <caption>Example widget</caption>
8
+ * ## Example widget
9
+ * ```html
10
10
  * <a data-test="example-link"
11
11
  * class="off"
12
12
  * onmouseover="this.className='on';"
13
13
  * onmouseout="this.className='off';"
14
14
  * href="/">hover over me</a>
15
+ * ```
15
16
  *
16
- * @example <caption>Lean Page Object describing the widget</caption>
17
- * import { by, Target } from '@serenity-js/webdriverio';
17
+ * ## Lean Page Object describing the widget
18
18
  *
19
- * class Example {
20
- * static link = Target.the('example link')
21
- * .located(by.css('[data-test="example-link"]'));
19
+ * ```ts
20
+ * import { By, PageElement } from '@serenity-js/web'
21
+ *
22
+ * class Example {
23
+ * static link = () =>
24
+ * PageElement.located(By.css('[data-test="example-link"]'))
25
+ * .describedAs('example link')
22
26
  * }
27
+ * ```
28
+ *
29
+ * ## Hovering over an element
30
+ *
31
+ * ```ts
32
+ * import { actorCalled } from '@serenity-js/core'
33
+ * import { Hover, CssClasses } from '@serenity-js/web'
34
+ * import { Ensure, equals } from '@serenity-js/assertions'
23
35
  *
24
- * @example <caption>Hovering over an element</caption>
25
- * import { actorCalled } from '@serenity-js/core';
26
- * import { BrowseTheWeb, Hover, CssClasses } from '@serenity-js/webdriverio';
27
- * import { Ensure, equals } from '@serenity-js/assertions';
36
+ * await actorCalled('Hank')
37
+ * .whoCan(BrowseTheWeb.using(browser))
38
+ * .attemptsTo(
39
+ * Ensure.that(CssClasses.of(Example.link()), equals([ 'off' ])),
28
40
  *
29
- * actorCalled('Hank')
30
- * .whoCan(BrowseTheWeb.using(browser))
31
- * .attemptsTo(
32
- * Ensure.that(CssClasses.of(Example.link), equals([ 'off' ])),
41
+ * Hover.over(Example.link),
42
+ * Ensure.that(CssClasses.of(Example.link()), equals([ 'on' ])),
43
+ * )
44
+ * ```
33
45
  *
34
- * Hover.over(Example.link),
35
- * Ensure.that(CssClasses.of(Example.link), equals([ 'on' ])),
36
- * );
46
+ * ## Learn more
37
47
  *
38
- * @see {@link BrowseTheWeb}
39
- * @see {@link Target}
40
- * @see {@link CssClasses}
41
- * @see {@link @serenity-js/assertions~Ensure}
42
- * @see {@link @serenity-js/assertions/lib/expectations~equals}
48
+ * - {@apilink BrowseTheWeb}
49
+ * - {@apilink PageElement}
43
50
  *
44
- * @extends {ElementInteraction}
51
+ * @group Activities
45
52
  */
46
53
  export declare class Hover extends PageElementInteraction {
47
- private readonly target;
54
+ private readonly element;
48
55
  /**
49
- * @desc
50
- * Instantiates this {@link @serenity-js/core/lib/screenplay~Interaction}.
51
- *
52
- * @param {Answerable<PageElement>} target
53
- * The element to be hovered over
56
+ * Instantiates this {@apilink Interaction}
54
57
  *
55
- * @returns {@serenity-js/core/lib/screenplay~Interaction}
56
- */
57
- static over(target: Answerable<PageElement>): Interaction;
58
- /**
59
- * @param {Answerable<PageElement>} target
58
+ * @param pageElement
60
59
  * The element to be hovered over
61
60
  */
62
- constructor(target: Answerable<PageElement>);
61
+ static over(pageElement: Answerable<PageElement>): Interaction;
62
+ protected constructor(element: Answerable<PageElement>);
63
63
  /**
64
- * @desc
65
- * Makes the provided {@link @serenity-js/core/lib/screenplay/actor~Actor}
66
- * perform this {@link @serenity-js/core/lib/screenplay~Interaction}.
67
- *
68
- * @param {UsesAbilities & AnswersQuestions} actor
69
- * An {@link @serenity-js/core/lib/screenplay/actor~Actor} to perform this {@link @serenity-js/core/lib/screenplay~Interaction}
70
- *
71
- * @returns {PromiseLike<void>}
72
- *
73
- * @see {@link @serenity-js/core/lib/screenplay/actor~Actor}
74
- * @see {@link @serenity-js/core/lib/screenplay/actor~UsesAbilities}
75
- * @see {@link @serenity-js/core/lib/screenplay/actor~AnswersQuestions}
64
+ * @inheritDoc
76
65
  */
77
66
  performAs(actor: UsesAbilities & AnswersQuestions): Promise<void>;
78
67
  }
68
+ //# sourceMappingURL=Hover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hover.d.ts","sourceRoot":"","sources":["../../../src/screenplay/interactions/Hover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAK,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEhG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,qBAAa,KAAM,SAAQ,sBAAsB;IAYvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAV9C;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,WAAW;IAI9D,SAAS,aAA8B,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC;IAIvE;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAI1E"}