@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
@@ -1,225 +1,227 @@
1
- import { Answerable, AnswersQuestions, CollectsArtifacts, Interaction, LogicError, UsesAbilities } from '@serenity-js/core';
2
- import { asyncMap, formatted } from '@serenity-js/core/lib/io';
1
+ import { Answerable, AnswersQuestions, CollectsArtifacts, f, Interaction, LogicError, UsesAbilities } from '@serenity-js/core';
2
+ import { asyncMap } from '@serenity-js/core/lib/io';
3
3
  import { Name, TextData } from '@serenity-js/core/lib/model';
4
4
 
5
5
  import { BrowseTheWeb } from '../abilities';
6
6
 
7
7
  /**
8
- * @desc
9
- * Instructs the {@link @serenity-js/core/lib/screenplay/actor~Actor} to
10
- * execute a script within the context of the current browser window.
8
+ * Instructs an {@apilink Actor|actor} who has the {@apilink Ability|ability} to {@apilink BrowseTheWeb}
9
+ * to execute a script within the context of the current browser tab.
11
10
  *
12
- * Please see the tests below for usage examples.
11
+ * ## Learn more
13
12
  *
14
- * @see {@link LastScriptExecution.result}
13
+ * - {@apilink BrowseTheWeb}
14
+ * - {@apilink LastScriptExecution.result}
15
+ *
16
+ * @group Activities
15
17
  */
16
18
  export class ExecuteScript {
17
19
 
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
- static from(sourceUrl: string): Interaction {
27
+ static from(sourceUrl: Answerable<string>): Interaction {
29
28
  return new ExecuteScriptFromUrl(sourceUrl);
30
29
  }
31
30
 
32
31
  /**
33
- * @desc
34
- * Schedules a command to execute asynchronous JavaScript in the context of the currently selected frame or window.
35
- * The script fragment will be executed as the body of an anonymous function.
36
- * If the script is provided as a function object, that function will be converted to a string for injection
37
- * into the target window.
32
+ * Instructs an {@apilink Actor|actor} who has the {@apilink Ability|ability} to {@apilink BrowseTheWeb}
33
+ * to execute an asynchronous script within the context of the current browser tab.
38
34
  *
39
- * Any arguments provided in addition to the script will be included as script arguments and may be referenced
40
- * using the `arguments` object. Arguments may be a `boolean`, `number`, `string`
41
- * or {@link Target} (`Answerable<Element>`).
42
- * Arrays and objects may also be used as script arguments as long as each item adheres
43
- * to the types previously mentioned.
35
+ * The script fragment will be executed as the body of an anonymous function.
36
+ * If the script is provided as a function object, that function will be converted to a string for injection
37
+ * into the target window.
44
38
  *
45
- * Unlike executing synchronous JavaScript with {@link ExecuteScript#sync},
46
- * scripts executed with this function must explicitly signal they are finished by invoking the provided callback.
39
+ * Any arguments provided in addition to the script will be included as script arguments and may be referenced
40
+ * using the `arguments` object. Arguments may be a `boolean`, `number`, `string`
41
+ * or {@apilink PageElement}.
42
+ * Arrays and objects may also be used as script arguments as long as each item adheres
43
+ * to the types previously mentioned.
47
44
  *
48
- * This callback will always be injected into the executed function as the last argument,
49
- * and thus may be referenced with `arguments[arguments.length - 1]`.
45
+ * Unlike executing synchronous JavaScript with {@apilink ExecuteScript.sync},
46
+ * scripts executed with this function must explicitly signal they are finished by invoking the provided callback.
50
47
  *
51
- * If the script invokes the `callback` with a return value, this will be made available
52
- * via the {@link LastScriptExecution.result}.
48
+ * This callback will always be injected into the executed function as the last argument,
49
+ * and thus may be referenced with `arguments[arguments.length - 1]`.
53
50
  *
54
- * **Please note** that in order to signal an error in the `script` you need to throw an {@link Error}
55
- * instead of passing it to the callback function.
51
+ * If the script invokes the `callback` with a return value, this will be made available
52
+ * via the {@apilink LastScriptExecution.result}.
56
53
  *
57
- * @example <caption>Executing an async script</caption>
58
- * import { ExecuteScript } from '@serenity-js/webdriverio';
54
+ * **Please note** that in order to signal an error in the `script` you need to throw an {@apilink Error}
55
+ * instead of passing it to the callback function.
59
56
  *
60
- * actor.attemptsTo(
61
- * ExecuteScript.async(`
62
- * var callback = arguments[arguments.length - 1];
57
+ * #### Executing an async script
63
58
  *
64
- * // do stuff
59
+ * ```ts
60
+ * import { actorCalled } from '@serenity-js/core'
61
+ * import { ExecuteScript } from '@serenity-js/web'
65
62
  *
66
- * callback(result)
67
- * `)
68
- * );
63
+ * await actorCalled('Esti').attemptsTo(
64
+ * ExecuteScript.async(`
65
+ * var callback = arguments[arguments.length - 1]
69
66
  *
70
- * @example <caption>Passing arguments to an async script</caption>
71
- * import { ExecuteScript } from '@serenity-js/webdriverio';
67
+ * // do stuff
72
68
  *
73
- * actor.attemptsTo(
74
- * ExecuteScript.async(`
75
- * var name = arguments[0];
76
- * var age = arguments[1];
77
- * var callback = arguments[arguments.length - 1];
69
+ * callback(result)
70
+ * `)
71
+ * )
72
+ * ```
78
73
  *
79
- * // do stuff
74
+ * #### Passing arguments to an async script
80
75
  *
81
- * callback(result)
82
- * `).withArguments('Bob', 24)
83
- * );
76
+ * ```ts
77
+ * import { actorCalled } from '@serenity-js/core'
78
+ * import { ExecuteScript } from '@serenity-js/web'
84
79
  *
85
- * @example <caption>Passing Target arguments to an async script</caption>
86
- * import { ExecuteScript } from '@serenity-js/webdriverio';
80
+ * await actorCalled('Esti').attemptsTo(
81
+ * ExecuteScript.async(`
82
+ * var name = arguments[0];
83
+ * var age = arguments[1];
84
+ * var callback = arguments[arguments.length - 1]
87
85
  *
88
- * actor.attemptsTo(
89
- * ExecuteScript.async(`
90
- * var header = arguments[0]; // Target gets converted to a WebElement
91
- * var callback = arguments[arguments.length - 1];
86
+ * // do stuff
92
87
  *
93
- * callback(header.innerText)
94
- * `).withArguments(Target.the('header').located(by.css('h1')))
95
- * );
88
+ * callback(result)
89
+ * `).withArguments('Bob', 24)
90
+ * )
91
+ * ```
96
92
  *
97
- * @example <caption>Executing async script as function</caption>
98
- * import { ExecuteScript } from '@serenity-js/webdriverio';
93
+ * #### Passing Target arguments to an async script
99
94
  *
100
- * actor.attemptsTo(
101
- * ExecuteScript.async(function getText(header, callback) {
102
- * callback(header.innerText)
103
- * }).withArguments(Target.the('header').located(by.css('h1')))
104
- * );
95
+ * ```ts
96
+ * import { actorCalled } from '@serenity-js/core'
97
+ * import { ExecuteScript } from '@serenity-js/web'
105
98
  *
106
- * @param {string | Function} script
107
- * The script to be executed
99
+ * await actorCalled('Esti').attemptsTo(
100
+ * ExecuteScript.async(`
101
+ * var header = arguments[0] // PageElement object gets converted to a WebElement
102
+ * var callback = arguments[arguments.length - 1]
103
+ *
104
+ * callback(header.innerText)
105
+ * `).withArguments(PageElement.located(By.css('h1')).describedAs('header'))
106
+ * )
107
+ * ```
108
+ *
109
+ * #### Executing async script as function
110
+ *
111
+ * ```ts
112
+ * import { actorCalled } from '@serenity-js/core'
113
+ * import { ExecuteScript } from '@serenity-js/web'
108
114
  *
109
- * @returns {ExecuteScriptWithArguments}
115
+ * await actorCalled('Esti').attemptsTo(
116
+ * ExecuteScript.async(function getText(header, callback) {
117
+ * callback(header.innerText)
118
+ * }).withArguments(PageElement.located(By.css('h1')).describedAs('header'))
119
+ * )
120
+ * ```
110
121
  *
111
- * @see {@link LastScriptExecution.result}
122
+ * #### Learn more
123
+ * - {@apilink LastScriptExecution.result}
124
+ *
125
+ * @param script
126
+ * The script to be executed
112
127
  */
113
128
  static async(script: string | Function): ExecuteScriptWithArguments { // eslint-disable-line @typescript-eslint/ban-types
114
- return new ExecuteAsynchronousScript(script);
129
+ return new ExecuteAsynchronousScript(
130
+ `#actor executes an asynchronous script`,
131
+ script,
132
+ );
115
133
  }
116
134
 
117
135
  /**
118
- * @desc
119
- * Instructs the {@link @serenity-js/core/lib/screenplay/actor~Actor} to
120
- * execute a synchronous script in the context of the currently selected frame or window.
121
- *
122
- * If the script returns a value, it will be made available via {@link LastScriptExecution.result}.
123
- *
124
- * @example <caption>Executing a sync script as string and reading the result</caption>
125
- * import { actorCalled } from '@serenity-js/core';
126
- * import { BrowseTheWeb, ExecuteScript, LastScriptExecution } from '@serenity-js/webdriverio';
127
- * import { Ensure, includes } from '@serenity-js/assertions';
128
- *
129
- * actorCalled('Joseph')
130
- * .whoCan(BrowseTheWeb.using(browser))
131
- * .attemptsTo(
132
- * ExecuteScript.sync('return navigator.userAgent'),
133
- * Ensure.that(LastScriptExecution.result<string>(), includes('Chrome')),
134
- * );
135
- *
136
- * @example <caption>Executing a sync script as function and reading the result</caption>
137
- * import { actorCalled } from '@serenity-js/core';
138
- * import { by, BrowseTheWeb, Enter, ExecuteScript, LastScriptExecution, Target } from '@serenity-js/webdriverio';
139
- *
140
- * const someOfferField = Target.the('offer code').located(by.id('offer-code'));
141
- * const applyOfferCodeField = Target.the('apply offer field').located(by.id('apply-offer-code'));
142
- *
143
- * actorCalled('Joseph')
144
- * .whoCan(BrowseTheWeb.using(browser))
145
- * .attemptsTo(
146
- * // inject JavaScript to read some property of an element
147
- * ExecuteScript.sync(function getValue(element) {
148
- * return element.value;
149
- * }).withArguments(someOfferField),
150
- *
151
- * // use LastScriptExecution.result() to read the value
152
- * // returned from the injected script
153
- * // and pass it to another interaction
154
- * Enter.theValue(LastScriptExecution.result<string>()).into(applyOfferCodeField),
155
- * );
156
- *
157
- * @param {string | Function} script
158
- * The script to be executed
136
+ * Instructs an {@apilink Actor|actor} who has the {@apilink Ability|ability} to {@apilink BrowseTheWeb}
137
+ * to execute a synchronous script within the context of the current browser tab.
138
+ *
139
+ * If the script returns a value, it will be made available via {@apilink LastScriptExecution.result}.
140
+ *
141
+ * #### Executing a sync script as string and reading the result
159
142
  *
160
- * @returns {ExecuteScriptWithArguments}
143
+ * ```ts
144
+ * import { actorCalled } from '@serenity-js/core'
145
+ * import { ExecuteScript, LastScriptExecution } from '@serenity-js/web'
146
+ * import { Ensure, includes } from '@serenity-js/assertions'
161
147
  *
162
- * @see {@link LastScriptExecution.result}
148
+ * await actorCalled('Joseph')
149
+ * .attemptsTo(
150
+ * ExecuteScript.sync('return navigator.userAgent'),
151
+ * Ensure.that(LastScriptExecution.result<string>(), includes('Chrome')),
152
+ * )
153
+ * ```
154
+ *
155
+ * #### Executing a sync script as function and reading the result
156
+ *
157
+ * ```ts
158
+ * import { actorCalled } from '@serenity-js/core'
159
+ * import { By, Enter, ExecuteScript, LastScriptExecution, PageElement } from '@serenity-js/web'
160
+ *
161
+ * const someOfferField = () =>
162
+ * PageElement.located(By.id('offer-code'))
163
+ * .describedAs('offer code')
164
+ *
165
+ * const applyOfferCodeField = () =>
166
+ * PageElement.located(By.id('apply-offer-code'))
167
+ * .describedAs('apply offer field')
168
+ *
169
+ * await actorCalled('Joseph')
170
+ * .attemptsTo(
171
+ * // inject JavaScript to read some property of an element
172
+ * ExecuteScript.sync(function getValue(element) {
173
+ * return element.value;
174
+ * }).withArguments(someOfferField),
175
+ *
176
+ * // use LastScriptExecution.result() to read the value
177
+ * // returned from the injected script
178
+ * // and pass it to another interaction
179
+ * Enter.theValue(LastScriptExecution.result<string>()).into(applyOfferCodeField),
180
+ * )
181
+ * ```
182
+ *
183
+ * #### Learn more
184
+ * - {@apilink LastScriptExecution.result}
185
+ *
186
+ * @param script
187
+ * The script to be executed
163
188
  */
164
189
  static sync(script: string | Function): ExecuteScriptWithArguments { // eslint-disable-line @typescript-eslint/ban-types
165
- return new ExecuteSynchronousScript(script);
190
+ return new ExecuteSynchronousScript(
191
+ `#actor executes a synchronous script`,
192
+ script,
193
+ );
166
194
  }
167
195
  }
168
196
 
169
197
  /**
170
- * @desc
171
- * Allows for a script to be executed to be parametrised.
172
- *
173
- * **Please note** that the arguments can be both synchronous and asynchronous {@link @serenity-js/core/lib/screenplay~Question}s
174
- * as well as regular static values.
175
- *
176
- * @abstract
198
+ * Allows for a script to be executed to be parametrised.
177
199
  *
178
- * @see {@link ExecuteScript}
200
+ * ## Learn more
201
+ * - {@apilink ExecuteScript}
179
202
  *
180
- * @extends {@serenity-js/core/lib/screenplay~Interaction}
203
+ * @group Activities
181
204
  */
182
205
  export abstract class ExecuteScriptWithArguments extends Interaction {
183
206
 
184
- /**
185
- * @param {string | Function} script
186
- * The script to be executed
187
- *
188
- * @param {Array<Answerable<any>>} args
189
- * Arguments to parametrise the script with
190
- */
191
207
  constructor(
208
+ description: string,
192
209
  protected readonly script: string | Function, // eslint-disable-line @typescript-eslint/ban-types
193
210
  protected readonly args: Array<Answerable<any>> = [],
194
211
  ) {
195
- super();
212
+ super(description, Interaction.callerLocation(5));
196
213
  }
197
214
 
198
215
  /**
199
- * @desc
200
- * Instantiates an {@link @serenity-js/core/lib/screenplay~Interaction}
201
- * to {@link Enter}.
216
+ * Instantiates this {@apilink Interaction}
202
217
  *
203
- * @param {...Array<Answerable<any>>} args
218
+ * @param args
204
219
  * Arguments to parametrise the script with
205
- *
206
- * @returns {@serenity-js/core/lib/screenplay~Interaction}
207
220
  */
208
221
  public abstract withArguments(...args: Array<Answerable<any>>): Interaction;
209
222
 
210
223
  /**
211
- * @desc
212
- * Makes the provided {@link @serenity-js/core/lib/screenplay/actor~Actor}
213
- * perform this {@link @serenity-js/core/lib/screenplay~Interaction}.
214
- *
215
- * @param {UsesAbilities & AnswersQuestions} actor
216
- * An {@link @serenity-js/core/lib/screenplay/actor~Actor} to perform this {@link @serenity-js/core/lib/screenplay~Interaction}
217
- *
218
- * @returns {PromiseLike<void>}
219
- *
220
- * @see {@link @serenity-js/core/lib/screenplay/actor~Actor}
221
- * @see {@link @serenity-js/core/lib/screenplay/actor~UsesAbilities}
222
- * @see {@link @serenity-js/core/lib/screenplay/actor~AnswersQuestions}
224
+ * @inheritDoc
223
225
  */
224
226
  async performAs(actor: UsesAbilities & CollectsArtifacts & AnswersQuestions): Promise<void> {
225
227
  const args = await asyncMap(this.args, arg => actor.answer(arg));
@@ -243,17 +245,18 @@ export abstract class ExecuteScriptWithArguments extends Interaction {
243
245
  */
244
246
  class ExecuteAsynchronousScript extends ExecuteScriptWithArguments {
245
247
  withArguments(...args: Array<Answerable<any>>): Interaction {
246
- return new ExecuteAsynchronousScript(this.script, args);
247
- }
248
-
249
- protected executeAs(actor: UsesAbilities & AnswersQuestions, args: any[]): Promise<any> {
250
- return BrowseTheWeb.as(actor).executeAsyncScript(this.script as unknown as any, ...args); // todo: fix types
248
+ return new ExecuteAsynchronousScript(
249
+ args.length > 0
250
+ ? f `#actor executes an asynchronous script with arguments: ${ args }`
251
+ : this.toString(),
252
+ this.script,
253
+ args,
254
+ );
251
255
  }
252
256
 
253
- toString(): string {
254
- return this.args.length > 0
255
- ? formatted `#actor executes an asynchronous script with arguments: ${ this.args }`
256
- : `#actor executes an asynchronous script`;
257
+ protected async executeAs(actor: UsesAbilities & AnswersQuestions, args: any[]): Promise<any> {
258
+ const page = await BrowseTheWeb.as(actor).currentPage();
259
+ return page.executeAsyncScript(this.script as unknown as any, ...args); // todo: fix types
257
260
  }
258
261
  }
259
262
 
@@ -264,64 +267,47 @@ class ExecuteAsynchronousScript extends ExecuteScriptWithArguments {
264
267
  * https://developer.mozilla.org/en-US/docs/Web/API/HTMLScriptElement
265
268
  */
266
269
  class ExecuteScriptFromUrl extends Interaction {
267
- constructor(private readonly sourceUrl: string) {
268
- super();
270
+ constructor(private readonly sourceUrl: Answerable<string>) {
271
+ super(f`#actor executes a script from ${ sourceUrl }`);
269
272
  }
270
273
 
271
274
  /**
272
- * @desc
273
- * Makes the provided {@link @serenity-js/core/lib/screenplay/actor~Actor}
274
- * perform this {@link @serenity-js/core/lib/screenplay~Interaction}.
275
- *
276
- * @param {UsesAbilities & AnswersQuestions} actor
277
- * @returns {Promise<void>}
278
- *
279
- * @see {@link @serenity-js/core/lib/screenplay/actor~Actor}
280
- * @see {@link @serenity-js/core/lib/screenplay/actor~UsesAbilities}
281
- * @see {@link @serenity-js/core/lib/screenplay/actor~AnswersQuestions}
275
+ * @inheritDoc
282
276
  */
283
- performAs(actor: UsesAbilities & AnswersQuestions): PromiseLike<any> {
284
- return BrowseTheWeb.as(actor)
285
- .executeAsyncScript(
286
- /* istanbul ignore next */
287
- function executeScriptFromUrl(sourceUrl: string, callback: (message?: string) => void) {
288
- const alreadyLoadedScripts = Array.prototype.slice
289
- .call(document.querySelectorAll('script'))
290
- .map(script => script.src);
291
-
292
- if (~ alreadyLoadedScripts.indexOf(sourceUrl)) {
293
- return callback('Script from ' + sourceUrl + ' has already been loaded');
294
- }
277
+ async performAs(actor: UsesAbilities & AnswersQuestions): Promise<any> {
278
+ const page = await BrowseTheWeb.as(actor).currentPage();
279
+ const sourceUrl = await actor.answer(this.sourceUrl);
295
280
 
296
- const script = document.createElement('script');
297
- script.addEventListener('load', function() {
298
- callback();
299
- });
300
- script.addEventListener('error', function () {
301
- return callback('Couldn\'t load script from ' + sourceUrl);
302
- });
281
+ return page.executeAsyncScript(
282
+ /* istanbul ignore next */
283
+ function executeScriptFromUrl(sourceUrl: string, callback: (message?: string) => void) {
284
+ const alreadyLoadedScripts = Array.prototype.slice
285
+ .call(document.querySelectorAll('script'))
286
+ .map(script => script.src);
303
287
 
304
- script.src = sourceUrl;
305
- script.async = true;
306
- document.head.append(script);
307
- },
308
- this.sourceUrl
309
- )
310
- .then(errorMessage => {
311
- if (errorMessage) {
312
- throw new LogicError(errorMessage);
288
+ if (~ alreadyLoadedScripts.indexOf(sourceUrl)) {
289
+ return callback('Script from ' + sourceUrl + ' has already been loaded');
313
290
  }
314
- });
315
- }
316
291
 
317
- /**
318
- * @desc
319
- * Generates a description to be used when reporting this {@link @serenity-js/core/lib/screenplay~Activity}.
320
- *
321
- * @returns {string}
322
- */
323
- toString(): string {
324
- return `#actor executes a script from ${ this.sourceUrl }`;
292
+ const script = document.createElement('script');
293
+ script.addEventListener('load', function() {
294
+ callback();
295
+ });
296
+ script.addEventListener('error', function () {
297
+ return callback(`Couldn't load script from ${ sourceUrl }`);
298
+ });
299
+
300
+ script.src = sourceUrl;
301
+ script.async = true;
302
+ document.head.append(script);
303
+ },
304
+ sourceUrl
305
+ )
306
+ .then(errorMessage => {
307
+ if (errorMessage) {
308
+ throw new LogicError(errorMessage);
309
+ }
310
+ });
325
311
  }
326
312
  }
327
313
 
@@ -331,16 +317,17 @@ class ExecuteScriptFromUrl extends Interaction {
331
317
  class ExecuteSynchronousScript extends ExecuteScriptWithArguments {
332
318
 
333
319
  withArguments(...args: Array<Answerable<any>>): Interaction {
334
- return new ExecuteSynchronousScript(this.script, args);
335
- }
336
-
337
- protected executeAs(actor: UsesAbilities & AnswersQuestions, args: any[]): Promise<any> {
338
- return BrowseTheWeb.as(actor).executeScript(this.script as unknown as any, ...args); // todo fix type
320
+ return new ExecuteSynchronousScript(
321
+ args.length > 0
322
+ ? f `#actor executes a synchronous script with arguments: ${ args }`
323
+ : this.toString(),
324
+ this.script,
325
+ args,
326
+ );
339
327
  }
340
328
 
341
- toString(): string {
342
- return this.args.length > 0
343
- ? formatted `#actor executes a synchronous script with arguments: ${ this.args }`
344
- : `#actor executes a synchronous script`;
329
+ protected async executeAs(actor: UsesAbilities & AnswersQuestions, args: any[]): Promise<any> {
330
+ const page = await BrowseTheWeb.as(actor).currentPage();
331
+ return page.executeScript(this.script as unknown as any, ...args); // todo fix type
345
332
  }
346
333
  }