@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
@@ -3,293 +3,266 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Select = void 0;
4
4
  const core_1 = require("@serenity-js/core");
5
5
  const io_1 = require("@serenity-js/core/lib/io");
6
- const inspected_1 = require("@serenity-js/core/lib/io/inspected");
6
+ const stringified_1 = require("@serenity-js/core/lib/io/stringified");
7
7
  const screenplay_1 = require("@serenity-js/core/lib/screenplay");
8
8
  const models_1 = require("../models");
9
9
  /**
10
- * @desc
11
- * Instructs the {@link @serenity-js/core/lib/screenplay/actor~Actor} to
12
- * select an option from a [HTML `<select>` element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select),
13
- * either by its display name, or by value.
10
+ * Instructs an {@apilink Actor|actor} who has the {@apilink Ability|ability} to {@apilink BrowseTheWeb}
11
+ * to select an option from a [HTML `<select>` element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select),
12
+ * either by its display name, or by value.
14
13
  *
15
- * @see {@link Selected}
14
+ * ## Learn more
15
+ * - {@apilink Selected}
16
+ *
17
+ * @group Activities
16
18
  */
17
19
  class Select {
18
20
  /**
19
- * @desc
20
- * Instantiates this {@link @serenity-js/core/lib/screenplay~Interaction}
21
- * with a [`value`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option#attr-value)
22
- * of a single [`<option>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
23
- * for the {@link @serenity-js/core/lib/screenplay/actor~Actor} to select.
24
- *
25
- * @example <caption>Example widget</caption>
26
- * <select data-test='countries'>
27
- * <option value='UK'>United Kingdom</option>
28
- * <option value='PL'>Poland</option>
29
- * <option value='US'>United States</option>
30
- * </select>
31
- *
32
- * @example <caption>Lean Page Object describing the widget</caption>
33
- * import { Target } from '@serenity-js/protractor';
34
- * import { browser, by } from 'protractor';
35
- *
36
- * class Countries {
37
- * static dropdown = Target.the('countries dropdown')
38
- * .located(by.css('[data-test="countries"]'));
39
- * }
40
- *
41
- * @example <caption>Retrieving the selected value</caption>
42
- * import { actorCalled } from '@serenity-js/core';
43
- * import { BrowseTheWeb, Select, Selected } from '@serenity-js/protractor';
44
- * import { Ensure, equals } from '@serenity-js/assertions';
45
- * import { protractor } from 'protractor';
46
- *
47
- * actorCalled('Nick')
48
- * .whoCan(BrowseTheWeb.using(protractor.browser))
49
- * .attemptsTo(
50
- * Select.value('UK').from(Countries.dropdown),
51
- * Ensure.that(Selected.valueOf(Countries.dropdown), equals('UK')),
52
- * );
53
- *
54
- * @param {Answerable<string>} value
21
+ * Instantiates an {@apilink Interaction|interaction}
22
+ * that instructs the {@apilink Actor|actor}
23
+ * to select a single [`<option>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
24
+ * with a given [`value`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option#attr-value).,
25
+ *
26
+ * #### Example widget
27
+ *
28
+ * ```html
29
+ * <select data-test='countries'>
30
+ * <option value='UK'>United Kingdom</option>
31
+ * <option value='PL'>Poland</option>
32
+ * <option value='US'>United States</option>
33
+ * </select>
34
+ * ```
35
+ *
36
+ * #### Lean Page Object describing the widget
37
+ *
38
+ * ```ts
39
+ * import { By, PageElement } from '@serenity-js/web'
40
+ *
41
+ * class Countries {
42
+ * static dropdown = () =>
43
+ * PageElement.located(By.css('[data-test="countries"]'))
44
+ * .describedAs('countries dropdown')
45
+ * }
46
+ * ```
47
+ *
48
+ * #### Retrieving the selected value
49
+ *
50
+ * ```ts
51
+ * import { actorCalled } from '@serenity-js/core'
52
+ * import { Select, Selected } from '@serenity-js/web';
53
+ * import { Ensure, equals } from '@serenity-js/assertions'
54
+ *
55
+ * await actorCalled('Nick')
56
+ * .attemptsTo(
57
+ * Select.value('UK').from(Countries.dropdown()),
58
+ * Ensure.that(Selected.valueOf(Countries.dropdown()), equals('UK')),
59
+ * )
60
+ * ```
61
+ *
62
+ * #### Learn more
63
+ * - {@apilink Selected.valueOf}
64
+ * - {@apilink PageElement}
65
+ *
66
+ * @param value
55
67
  * A value of the [`option` element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
56
- * for the {@link @serenity-js/core/lib/screenplay/actor~Actor} to select
57
- *
58
- * @returns {SelectBuilder}
59
- *
60
- * @see {@link Selected.valueOf}
61
- * @see {@link BrowseTheWeb}
62
- * @see {@link Target}
63
- * @see {@link @serenity-js/assertions~Ensure}
64
- * @see {@link @serenity-js/assertions/lib/expectations~equals}
68
+ * for the {@apilink Actor} to select
65
69
  */
66
70
  static value(value) {
67
71
  return {
68
- from: (pageElement) => screenplay_1.Interaction.where((0, io_1.formatted) `#actor selects value ${value} from ${pageElement}`, async (actor) => {
69
- return models_1.PageElement.located(models_1.By.css((0, core_1.q) `option[value=${value}]`))
70
- .of(pageElement)
71
- .click()
72
- .performAs(actor);
72
+ from: (pageElement) => screenplay_1.Interaction.where((0, core_1.d) `#actor selects value ${value} from ${pageElement}`, async (actor) => {
73
+ const element = await actor.answer(pageElement);
74
+ const desiredValue = await actor.answer(value);
75
+ await element.selectOptions(models_1.SelectOption.withValue(desiredValue));
73
76
  }),
74
77
  };
75
78
  }
76
79
  /**
77
- * @desc
78
- * Instantiates this {@link @serenity-js/core/lib/screenplay~Interaction}
79
- * with [`value`s](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option#attr-value)
80
- * of multiple [`<option>` elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
81
- * for the {@link @serenity-js/core/lib/screenplay/actor~Actor} to select.
82
- *
83
- * @example <caption>Example widget</caption>
84
- * <select multiple data-test='countries'>
85
- * <option value='UK'>United Kingdom</option>
86
- * <option value='PL'>Poland</option>
87
- * <option value='US'>United States</option>
88
- * </select>
89
- *
90
- * @example <caption>Lean Page Object describing the widget</caption>
91
- * import { Target } from '@serenity-js/protractor';
92
- * import { browser, by } from 'protractor';
93
- *
94
- * class Countries {
95
- * static dropdown = Target.the('countries dropdown')
96
- * .located(by.css('[data-test="countries"]'));
97
- * }
98
- *
99
- * @example <caption>Retrieving the selected value</caption>
100
- * import { actorCalled } from '@serenity-js/core';
101
- * import { BrowseTheWeb, Select, Selected } from '@serenity-js/protractor';
102
- * import { Ensure, equals } from '@serenity-js/assertions';
103
- * import { protractor } from 'protractor';
104
- *
105
- * actorCalled('Nick')
106
- * .whoCan(BrowseTheWeb.using(protractor.browser))
107
- * .attemptsTo(
108
- * Select.values('UK').from(Countries.dropdown),
109
- * Ensure.that(Selected.valuesOf(Countries.dropdown), equals([ 'UK' ])),
110
- * );
111
- *
112
- * @param {Array<Answerable<string[] | string>>} values
113
- * Values of the [`option` elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
114
- * for the {@link @serenity-js/core/lib/screenplay/actor~Actor} to select
80
+ * Instantiates an {@apilink Interaction|interaction}
81
+ * that instructs the {@apilink Actor|actor}
82
+ * to select multiple [`<option>` elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
83
+ * identified by their [`value`s](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option#attr-value).
84
+ *
85
+ * #### Example widget
86
+ *
87
+ * ```ts
88
+ * <select multiple data-test='countries'>
89
+ * <option value='UK'>United Kingdom</option>
90
+ * <option value='PL'>Poland</option>
91
+ * <option value='US'>United States</option>
92
+ * </select>
93
+ * ```
94
+ *
95
+ * #### Lean Page Object describing the widget
96
+ *
97
+ * ```ts
98
+ * import { By, PageElement } from '@serenity-js/web'
99
+ *
100
+ * class Countries {
101
+ * static dropdown = () =>
102
+ * PageElement.located(By.css('[data-test="countries"]'))
103
+ * .describedAs('countries dropdown')
104
+ * }
105
+ * ```
106
+ *
107
+ * #### Retrieving the selected value
108
+ *
109
+ * ```ts
110
+ * import { actorCalled } from '@serenity-js/core'
111
+ * import { Select, Selected } from '@serenity-js/web'
112
+ * import { Ensure, equals } from '@serenity-js/assertions'
113
+ *
114
+ * await actorCalled('Nick')
115
+ * .attemptsTo(
116
+ * Select.values('UK').from(Countries.dropdown()),
117
+ * Ensure.that(Selected.valuesOf(Countries.dropdown()), equals([ 'UK' ])),
118
+ * )
119
+ * ```
115
120
  *
116
- * @returns {SelectBuilder}
121
+ * #### Learn more
117
122
  *
118
- * @see {@link Selected.valuesOf}
119
- * @see {@link BrowseTheWeb}
120
- * @see {@link Target}
121
- * @see {@link @serenity-js/assertions~Ensure}
122
- * @see {@link @serenity-js/assertions/lib/expectations~equals}
123
+ * - {@apilink Selected.valuesOf}
124
+ * - {@apilink PageElement}
125
+ *
126
+ * @param values
127
+ * Values of the [`option` elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
128
+ * for the {@apilink Actor} to select
123
129
  */
124
130
  static values(...values) {
125
131
  return {
126
- from: (pageElement) => screenplay_1.Interaction.where(`#actor selects values ${(0, io_1.commaSeparated)(values.flat(), item => (0, inspected_1.inspected)(item, { inline: true }))} from ${(0, inspected_1.inspected)(pageElement, { inline: true })}`, async (actor) => {
132
+ from: (pageElement) => screenplay_1.Interaction.where(`#actor selects values ${(0, io_1.commaSeparated)(values.flat(), item => (0, stringified_1.stringified)(item, { inline: true }))} from ${(0, stringified_1.stringified)(pageElement, { inline: true })}`, async (actor) => {
127
133
  const answers = await (0, io_1.asyncMap)(values, value => actor.answer(value));
128
134
  const desiredValues = answers.flat();
129
- const options = await models_1.PageElements.located(models_1.By.css(`option`))
130
- .of(pageElement)
131
- .answeredBy(actor);
132
- for (const option of options) {
133
- const shouldSelect = await optionsToSelect(hasValueEqualOneOf(desiredValues))(option);
134
- if (shouldSelect) {
135
- await option.click();
136
- }
137
- }
135
+ const element = await actor.answer(pageElement);
136
+ await element.selectOptions(...desiredValues.map(value => models_1.SelectOption.withValue(value)));
138
137
  }),
139
138
  };
140
139
  }
141
140
  /**
142
- * @desc
143
- * Instantiates this {@link @serenity-js/core/lib/screenplay~Interaction}
144
- * with a single [`option`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
145
- * for the {@link @serenity-js/core/lib/screenplay/actor~Actor} to select.
146
- *
147
- * @example <caption>Example widget</caption>
148
- * <select data-test='countries'>
149
- * <option value='UK'>United Kingdom</option>
150
- * <option value='PL'>Poland</option>
151
- * <option value='US'>United States</option>
152
- * </select>
153
- *
154
- * @example <caption>Lean Page Object describing the widget</caption>
155
- * import { Target } from '@serenity-js/protractor';
156
- * import { browser, by } from 'protractor';
157
- *
158
- * class Countries {
159
- * static dropdown = Target.the('countries dropdown')
160
- * .located(by.css('[data-test="countries"]'));
161
- * }
162
- *
163
- * @example <caption>Retrieving the selected value</caption>
164
- * import { actorCalled } from '@serenity-js/core';
165
- * import { BrowseTheWeb, Select, Selected } from '@serenity-js/protractor';
166
- * import { Ensure, equals } from '@serenity-js/assertions';
167
- * import { protractor } from 'protractor';
168
- *
169
- * actorCalled('Nick')
170
- * .whoCan(BrowseTheWeb.using(protractor.browser))
171
- * .attemptsTo(
172
- * Select.option('Poland').from(Countries.dropdown),
173
- * Ensure.that(
174
- * Selected.optionIn(Countries.dropdown),
175
- * equals('Poland')
176
- * ),
177
- * );
178
- *
179
- * @param {Answerable<string>} value
141
+ * Instantiates an {@apilink Interaction|interaction}
142
+ * that instructs the {@apilink Actor|actor}
143
+ * to select a single [`<option>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
144
+ * with a given description.
145
+ *
146
+ * #### Example widget
147
+ *
148
+ * ```html
149
+ * <select data-test='countries'>
150
+ * <option value='UK'>United Kingdom</option>
151
+ * <option value='PL'>Poland</option>
152
+ * <option value='US'>United States</option>
153
+ * </select>
154
+ * ```
155
+ *
156
+ * #### Lean Page Object describing the widget
157
+ * ```ts
158
+ * import { By, PageElement } from '@serenity-js/by'
159
+ *
160
+ * class Countries {
161
+ * static dropdown = () =>
162
+ * PageElement.located(By.css('[data-test="countries"]'))
163
+ * .describedAs('countries dropdown')
164
+ * }
165
+ * ```
166
+ *
167
+ * #### Retrieving the selected value
168
+ *
169
+ * ```ts
170
+ * import { actorCalled } from '@serenity-js/core'
171
+ * import { Select, Selected } from '@serenity-js/web'
172
+ * import { Ensure, equals } from '@serenity-js/assertions'
173
+ *
174
+ * await actorCalled('Nick')
175
+ * .whoCan(BrowseTheWeb.using(protractor.browser))
176
+ * .attemptsTo(
177
+ * Select.option('Poland').from(Countries.dropdown()),
178
+ * Ensure.that(
179
+ * Selected.optionIn(Countries.dropdown()),
180
+ * equals('Poland')
181
+ * ),
182
+ * )
183
+ * ```
184
+ *
185
+ * #### Learn more
186
+ * - {@apilink Selected.optionIn}
187
+ * - {@apilink PageElement}
188
+ *
189
+ * @param value
180
190
  * Text of the [`option` element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
181
- * for the {@link @serenity-js/core/lib/screenplay/actor~Actor} to select
182
- *
183
- * @returns {SelectBuilder}
184
- *
185
- * @see {@link Selected.optionIn}
186
- * @see {@link BrowseTheWeb}
187
- * @see {@link Target}
188
- * @see {@link @serenity-js/assertions~Ensure}
189
- * @see {@link @serenity-js/assertions/lib/expectations~equals}
191
+ * for the {@apilink Actor} to select
190
192
  */
191
193
  static option(value) {
192
194
  return {
193
- from: (pageElement) => screenplay_1.Interaction.where((0, io_1.formatted) `#actor selects ${value} from ${pageElement}`, async (actor) => {
194
- return models_1.PageElement.located(models_1.By.cssContainingText('option', value))
195
- .of(pageElement)
196
- .click()
197
- .performAs(actor);
195
+ from: (pageElement) => screenplay_1.Interaction.where((0, core_1.d) `#actor selects ${value} from ${pageElement}`, async (actor) => {
196
+ const element = await actor.answer(pageElement);
197
+ const desiredLabel = await actor.answer(value);
198
+ await element.selectOptions(models_1.SelectOption.withLabel(desiredLabel));
198
199
  }),
199
200
  };
200
201
  }
201
202
  /**
202
- * @desc
203
- * Instantiates this {@link @serenity-js/core/lib/screenplay~Interaction}
204
- * with [`option`s](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
205
- * for the {@link @serenity-js/core/lib/screenplay/actor~Actor} to select.
206
- *
207
- * @example <caption>Example widget</caption>
208
- * <select multiple data-test='countries'>
209
- * <option value='UK'>United Kingdom</option>
210
- * <option value='PL'>Poland</option>
211
- * <option value='US'>United States</option>
212
- * </select>
213
- *
214
- * @example <caption>Lean Page Object describing the widget</caption>
215
- * import { Target } from '@serenity-js/protractor';
216
- * import { browser, by } from 'protractor';
217
- *
218
- * class Countries {
219
- * static dropdown = Target.the('countries dropdown')
220
- * .located(by.css('[data-test="countries"]'));
221
- * }
222
- *
223
- * @example <caption>Retrieving the selected value</caption>
224
- * import { actorCalled } from '@serenity-js/core';
225
- * import { BrowseTheWeb, Select, Selected } from '@serenity-js/protractor';
226
- * import { Ensure, equals } from '@serenity-js/assertions';
227
- * import { protractor } from 'protractor';
228
- *
229
- * actorCalled('Nick')
230
- * .whoCan(BrowseTheWeb.using(protractor.browser))
231
- * .attemptsTo(
232
- * Select.options('Poland', 'United States').from(Countries.dropdown),
233
- * Ensure.that(
234
- * Selected.optionsIn(Countries.dropdown),
235
- * equals([ 'Poland', 'United States' ])
236
- * ),
237
- * );
238
- *
239
- * @param {Array<Answerable<string[] | string>>} values
203
+ * Instantiates an {@apilink Interaction|interaction}
204
+ * that instructs the {@apilink Actor|actor}
205
+ * to select multiple [`<option>` elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
206
+ * identified by their descriptions.
207
+ *
208
+ * #### Example widget
209
+ *
210
+ * ```html
211
+ * <select multiple data-test='countries'>
212
+ * <option value='UK'>United Kingdom</option>
213
+ * <option value='PL'>Poland</option>
214
+ * <option value='US'>United States</option>
215
+ * </select>
216
+ * ```
217
+ *
218
+ * #### Lean Page Object describing the widget
219
+ *
220
+ * ```ts
221
+ * import { By, PageElement } from '@serenity-js/web'
222
+ *
223
+ * class Countries {
224
+ * static dropdown = () =>
225
+ * PageElement.located(By.css('[data-test="countries"]'))
226
+ * .describedAs('countries dropdown')
227
+ * }
228
+ * ```
229
+ *
230
+ * ##### Retrieving the selected value
231
+ *
232
+ * ```ts
233
+ * import { actorCalled } from '@serenity-js/core'
234
+ * import { Select, Selected } from '@serenity-js/web'
235
+ * import { Ensure, equals } from '@serenity-js/assertions'
236
+ *
237
+ * await actorCalled('Nick')
238
+ * .whoCan(BrowseTheWeb.using(protractor.browser))
239
+ * .attemptsTo(
240
+ * Select.options('Poland', 'United States').from(Countries.dropdown()),
241
+ * Ensure.that(
242
+ * Selected.optionsIn(Countries.dropdown()),
243
+ * equals([ 'Poland', 'United States' ])
244
+ * ),
245
+ * )
246
+ * ```
247
+ *
248
+ * #### Learn more
249
+ * - {@apilink Selected.optionsIn}
250
+ * - {@apilink PageElement}
251
+ *
252
+ * @param values
240
253
  * Text of the [`option` elements ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option)
241
- * for the {@link @serenity-js/core/lib/screenplay/actor~Actor} to select
242
- *
243
- * @returns {SelectBuilder}
244
- *
245
- * @see {@link Selected.optionsIn}
246
- * @see {@link BrowseTheWeb}
247
- * @see {@link Target}
248
- * @see {@link @serenity-js/assertions~Ensure}
249
- * @see {@link @serenity-js/assertions/lib/expectations~equals}
254
+ * for the {@apilink Actor} to select
250
255
  */
251
256
  static options(...values) {
252
257
  return {
253
- from: (pageElement) => screenplay_1.Interaction.where(`#actor selects ${(0, io_1.commaSeparated)(values.flat(), item => (0, inspected_1.inspected)(item, { inline: true }))} from ${(0, inspected_1.inspected)(pageElement, { inline: true })}`, async (actor) => {
258
+ from: (pageElement) => screenplay_1.Interaction.where(`#actor selects ${(0, io_1.commaSeparated)(values.flat(), item => (0, stringified_1.stringified)(item, { inline: true }))} from ${(0, stringified_1.stringified)(pageElement, { inline: true })}`, async (actor) => {
254
259
  const answers = await (0, io_1.asyncMap)(values, value => actor.answer(value));
255
- const desiredOptions = answers.flat();
256
- const options = await models_1.PageElements.located(models_1.By.css(`option`)).of(pageElement).answeredBy(actor);
257
- for (const option of options) {
258
- const shouldSelect = await optionsToSelect(hasTextEqualOneOf(desiredOptions))(option);
259
- if (shouldSelect) {
260
- await option.click();
261
- }
262
- }
260
+ const desiredLabels = answers.flat();
261
+ const element = await actor.answer(pageElement);
262
+ await element.selectOptions(...desiredLabels.map(label => models_1.SelectOption.withLabel(label)));
263
263
  }),
264
264
  };
265
265
  }
266
266
  }
267
267
  exports.Select = Select;
268
- /** @package */
269
- function hasValueEqualOneOf(desiredValues) {
270
- return async (option) => {
271
- const value = await option.value();
272
- return desiredValues.includes(value);
273
- };
274
- }
275
- /** @package */
276
- function hasTextEqualOneOf(desiredValues) {
277
- return async (option) => {
278
- const value = await option.text();
279
- return desiredValues.includes(value);
280
- };
281
- }
282
- /** @package */
283
- function optionsToSelect(criterion) {
284
- return (option) => isAlreadySelected(option)
285
- .then(alreadySelected => criterion(option).then(criterionMet => xor(alreadySelected, criterionMet)));
286
- }
287
- /** @package */
288
- function isAlreadySelected(option) {
289
- return option.isSelected();
290
- }
291
- /** @package */
292
- function xor(first, second) {
293
- return first !== second;
294
- }
295
268
  //# sourceMappingURL=Select.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../src/screenplay/interactions/Select.ts"],"names":[],"mappings":";;;AAAA,4CAAkD;AAClD,iDAA+E;AAC/E,kEAA+D;AAC/D,iEAA+D;AAE/D,sCAA0D;AAG1D;;;;;;;GAOG;AACH,MAAa,MAAM;IAEf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+CG;IACH,MAAM,CAAC,KAAK,CAAC,KAAyB;QAClC,OAAO;YACH,IAAI,EAAE,CAAC,WAAoC,EAAe,EAAE,CACxD,wBAAW,CAAC,KAAK,CAAC,IAAA,cAAS,EAAC,wBAAyB,KAAM,SAAU,WAAY,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;gBAC/F,OAAO,oBAAW,CAAC,OAAO,CAAC,WAAE,CAAC,GAAG,CAAC,IAAA,QAAC,EAAA,gBAAiB,KAAM,GAAG,CAAC,CAAC;qBAC1D,EAAE,CAAC,WAAW,CAAC;qBACf,KAAK,EAAE;qBACP,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC,CAAC;SACT,CAAC;IACN,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+CG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,MAA4C;QACzD,OAAO;YACH,IAAI,EAAE,CAAC,WAAoC,EAAe,EAAE,CACxD,wBAAW,CAAC,KAAK,CAAC,yBAA0B,IAAA,mBAAc,EAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,IAAA,qBAAS,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAE,SAAU,IAAA,qBAAS,EAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAE,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;gBAEtL,MAAM,OAAO,GAAG,MAAM,IAAA,aAAQ,EAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrE,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBAErC,MAAM,OAAO,GAAkB,MAAM,qBAAY,CAAC,OAAO,CAAC,WAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;qBACtE,EAAE,CAAC,WAAW,CAAC;qBACf,UAAU,CAAC,KAAK,CAAC,CAAC;gBAEvB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;oBAC1B,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACtF,IAAI,YAAY,EAAE;wBACd,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;qBACxB;iBACJ;YACL,CAAC,CAAC;SACT,CAAC;IACN,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiDG;IACH,MAAM,CAAC,MAAM,CAAC,KAAyB;QACnC,OAAO;YACH,IAAI,EAAE,CAAC,WAAoC,EAAe,EAAE,CACxD,wBAAW,CAAC,KAAK,CAAC,IAAA,cAAS,EAAC,kBAAmB,KAAM,SAAU,WAAY,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;gBACzF,OAAO,oBAAW,CAAC,OAAO,CAAC,WAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;qBAC5D,EAAE,CAAC,WAAW,CAAC;qBACf,KAAK,EAAE;qBACP,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC,CAAC;SACT,CAAC;IACN,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiDG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,MAA4C;QAC1D,OAAO;YACH,IAAI,EAAE,CAAC,WAAoC,EAAe,EAAE,CACxD,wBAAW,CAAC,KAAK,CAAC,kBAAmB,IAAA,mBAAc,EAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,IAAA,qBAAS,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAE,SAAU,IAAA,qBAAS,EAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAE,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;gBAE/K,MAAM,OAAO,GAAG,MAAM,IAAA,aAAQ,EAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrE,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBAEtC,MAAM,OAAO,GAAqB,MAAM,qBAAY,CAAC,OAAO,CAAC,WAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAEjH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;oBAC1B,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACtF,IAAI,YAAY,EAAE;wBACd,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;qBACvB;iBACJ;YACL,CAAC,CAAC;SACT,CAAC;IACN,CAAC;CACJ;AAvQD,wBAuQC;AAED,eAAe;AACf,SAAS,kBAAkB,CAAC,aAAuB;IAC/C,OAAO,KAAK,EAAE,MAAmB,EAAE,EAAE;QAEjC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QAElC,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAA;AACL,CAAC;AAED,eAAe;AACf,SAAS,iBAAiB,CAAC,aAAuB;IAC9C,OAAO,KAAK,EAAE,MAAmB,EAAE,EAAE;QAEjC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QAEjC,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAA;AACL,CAAC;AAED,eAAe;AACf,SAAS,eAAe,CAAC,SAAoD;IACzE,OAAO,CAAC,MAAmB,EAAE,EAAE,CAC3B,iBAAiB,CAAC,MAAM,CAAC;SACpB,IAAI,CAAC,eAAe,CAAC,EAAE,CACpB,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAClC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CACrC,CACJ,CAAC;AACd,CAAC;AAED,eAAe;AACf,SAAS,iBAAiB,CAAC,MAAmB;IAC1C,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;AAC/B,CAAC;AAED,eAAe;AACf,SAAS,GAAG,CAAC,KAAc,EAAE,MAAe;IACxC,OAAO,KAAK,KAAK,MAAM,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../src/screenplay/interactions/Select.ts"],"names":[],"mappings":"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"}