@vardot/varbase-e2e 2.0.2 → 2.0.4

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 (281) hide show
  1. package/.playwright-mcp/console-2026-09-07T08-40-17-262Z.log +28 -0
  2. package/.playwright-mcp/console-2026-09-07T08-40-55-044Z.log +4 -0
  3. package/.playwright-mcp/console-2026-09-07T08-41-12-557Z.log +18 -0
  4. package/.playwright-mcp/console-2026-09-07T08-42-32-413Z.log +38 -0
  5. package/.playwright-mcp/console-2026-09-07T09-02-43-145Z.log +1 -0
  6. package/.playwright-mcp/console-2026-09-07T09-03-15-665Z.log +17 -0
  7. package/.playwright-mcp/page-2026-09-07T08-40-18-956Z.yml +261 -0
  8. package/.playwright-mcp/page-2026-09-07T08-40-55-673Z.yml +132 -0
  9. package/.playwright-mcp/page-2026-09-07T08-41-13-471Z.yml +386 -0
  10. package/.playwright-mcp/page-2026-09-07T08-42-33-250Z.yml +287 -0
  11. package/AGENTS.md +1 -1
  12. package/CLAUDE.md +6 -5
  13. package/README.md +2 -0
  14. package/docs/04-step-reference.md +15 -1
  15. package/docs/README.md +8 -5
  16. package/docs/install-varbase-e2e.md +0 -2
  17. package/docs/steps/README.md +6 -5
  18. package/docs/steps/assertion.md +90 -5
  19. package/docs/steps/drupal-drimage-improved.md +372 -0
  20. package/docs/steps/navigation.md +81 -1
  21. package/docs/steps/varbase.md +6 -65
  22. package/examples/access-denied.html +6 -0
  23. package/examples/drimage.html +55 -0
  24. package/examples/styles/drimage_improved_1000_667/public/sample.png +0 -0
  25. package/examples/styles/drimage_improved_1200_800/public/sample.png +0 -0
  26. package/examples/styles/drimage_improved_1400_933/public/sample.png +0 -0
  27. package/examples/styles/drimage_improved_1600_1067/public/sample.png +0 -0
  28. package/examples/styles/drimage_improved_1800_1200/public/sample.png +0 -0
  29. package/examples/styles/drimage_improved_2000_1333/public/sample.png +0 -0
  30. package/examples/styles/drimage_improved_200_133/public/sample.png +0 -0
  31. package/examples/styles/drimage_improved_2200_1467/public/sample.png +0 -0
  32. package/examples/styles/drimage_improved_2400_1600/public/sample.png +0 -0
  33. package/examples/styles/drimage_improved_2600_1734/public/sample.png +0 -0
  34. package/examples/styles/drimage_improved_2800_1867/public/sample.png +0 -0
  35. package/examples/styles/drimage_improved_3000_2000/public/sample.png +0 -0
  36. package/examples/styles/drimage_improved_3200_2134/public/sample.png +0 -0
  37. package/examples/styles/drimage_improved_3400_2267/public/sample.png +0 -0
  38. package/examples/styles/drimage_improved_3600_2400/public/sample.png +0 -0
  39. package/examples/styles/drimage_improved_3800_2534/public/sample.png +0 -0
  40. package/examples/styles/drimage_improved_4000_2667/public/sample.png +0 -0
  41. package/examples/styles/drimage_improved_400_267/public/sample.png +0 -0
  42. package/examples/styles/drimage_improved_600_400/public/sample.png +0 -0
  43. package/examples/styles/drimage_improved_800_533/public/sample.png +0 -0
  44. package/examples/user-login.html +12 -0
  45. package/images/varbase-e2e-logo.svg +24 -0
  46. package/package.json +1 -1
  47. package/tests/features/access.feature +33 -0
  48. package/tests/features/drupal-drimage-improved.feature +59 -0
  49. package/tests/features/http-status.feature +21 -0
  50. package/tests/features/page-title.feature +24 -0
  51. package/tests/step-definitions/assertion.steps.js +108 -19
  52. package/tests/step-definitions/drupal-drimage-improved.steps.js +486 -0
  53. package/tests/step-definitions/navigation.steps.js +101 -1
  54. package/tests/step-definitions/varbase.steps.js +0 -83
  55. package/.playwright-mcp/console-2026-08-09T19-48-04-420Z.log +0 -6
  56. package/.playwright-mcp/console-2026-08-09T19-48-21-910Z.log +0 -4
  57. package/.playwright-mcp/console-2026-08-09T19-48-37-544Z.log +0 -5
  58. package/.playwright-mcp/console-2026-08-09T20-02-58-240Z.log +0 -5
  59. package/.playwright-mcp/console-2026-08-09T20-15-05-487Z.log +0 -71
  60. package/.playwright-mcp/console-2026-08-09T20-31-11-228Z.log +0 -14
  61. package/.playwright-mcp/console-2026-08-09T20-34-03-115Z.log +0 -7
  62. package/.playwright-mcp/console-2026-08-09T20-34-34-018Z.log +0 -85
  63. package/.playwright-mcp/console-2026-08-09T20-34-34-740Z.log +0 -46
  64. package/.playwright-mcp/console-2026-08-09T20-34-35-618Z.log +0 -92
  65. package/.playwright-mcp/console-2026-08-09T22-57-59-606Z.log +0 -14
  66. package/.playwright-mcp/console-2026-08-09T23-09-53-902Z.log +0 -28
  67. package/.playwright-mcp/console-2026-08-09T23-09-55-918Z.log +0 -49
  68. package/.playwright-mcp/console-2026-08-09T23-09-57-522Z.log +0 -42
  69. package/.playwright-mcp/console-2026-08-09T23-40-26-847Z.log +0 -28
  70. package/.playwright-mcp/console-2026-08-10T00-05-53-423Z.log +0 -8
  71. package/.playwright-mcp/console-2026-08-10T08-51-59-747Z.log +0 -5
  72. package/.playwright-mcp/console-2026-08-10T09-00-26-735Z.log +0 -7
  73. package/.playwright-mcp/page-2026-08-09T19-48-23-422Z.yml +0 -288
  74. package/.playwright-mcp/page-2026-08-09T19-48-32-827Z.yml +0 -39
  75. package/.playwright-mcp/page-2026-08-09T19-48-39-150Z.yml +0 -39
  76. package/.playwright-mcp/page-2026-08-09T19-50-55-594Z.yml +0 -787
  77. package/.playwright-mcp/page-2026-08-09T19-51-28-160Z.yml +0 -391
  78. package/.playwright-mcp/page-2026-08-09T19-51-45-546Z.yml +0 -391
  79. package/.playwright-mcp/page-2026-08-09T19-51-46-085Z.yml +0 -391
  80. package/.playwright-mcp/page-2026-08-09T19-51-46-355Z.yml +0 -391
  81. package/.playwright-mcp/page-2026-08-09T19-51-49-918Z.yml +0 -391
  82. package/.playwright-mcp/page-2026-08-09T19-52-30-248Z.yml +0 -415
  83. package/.playwright-mcp/page-2026-08-09T19-52-42-510Z.yml +0 -415
  84. package/.playwright-mcp/page-2026-08-09T19-52-45-588Z.yml +0 -391
  85. package/.playwright-mcp/page-2026-08-09T19-52-54-615Z.yml +0 -391
  86. package/.playwright-mcp/page-2026-08-09T19-52-55-424Z.yml +0 -391
  87. package/.playwright-mcp/page-2026-08-09T19-52-55-553Z.yml +0 -391
  88. package/.playwright-mcp/page-2026-08-09T19-52-58-991Z.yml +0 -391
  89. package/.playwright-mcp/page-2026-08-09T19-53-29-261Z.yml +0 -415
  90. package/.playwright-mcp/page-2026-08-09T19-53-40-322Z.yml +0 -415
  91. package/.playwright-mcp/page-2026-08-09T19-53-44-146Z.yml +0 -391
  92. package/.playwright-mcp/page-2026-08-09T19-53-51-021Z.yml +0 -391
  93. package/.playwright-mcp/page-2026-08-09T19-53-51-565Z.yml +0 -391
  94. package/.playwright-mcp/page-2026-08-09T19-53-51-979Z.yml +0 -391
  95. package/.playwright-mcp/page-2026-08-09T19-53-54-883Z.yml +0 -391
  96. package/.playwright-mcp/page-2026-08-09T19-54-24-537Z.yml +0 -415
  97. package/.playwright-mcp/page-2026-08-09T20-01-07-921Z.yml +0 -404
  98. package/.playwright-mcp/page-2026-08-09T20-01-35-366Z.yml +0 -404
  99. package/.playwright-mcp/page-2026-08-09T20-01-54-083Z.yml +0 -404
  100. package/.playwright-mcp/page-2026-08-09T20-02-07-954Z.yml +0 -416
  101. package/.playwright-mcp/page-2026-08-09T20-02-24-800Z.yml +0 -404
  102. package/.playwright-mcp/page-2026-08-09T20-02-29-695Z.yml +0 -404
  103. package/.playwright-mcp/page-2026-08-09T20-02-33-819Z.yml +0 -404
  104. package/.playwright-mcp/page-2026-08-09T20-02-41-437Z.yml +0 -404
  105. package/.playwright-mcp/page-2026-08-09T20-02-53-232Z.yml +0 -416
  106. package/.playwright-mcp/page-2026-08-09T20-03-00-246Z.yml +0 -404
  107. package/.playwright-mcp/page-2026-08-09T20-03-03-297Z.yml +0 -404
  108. package/.playwright-mcp/page-2026-08-09T20-03-11-014Z.yml +0 -404
  109. package/.playwright-mcp/page-2026-08-09T20-03-21-049Z.yml +0 -416
  110. package/.playwright-mcp/page-2026-08-10T01-04-54-039Z.yml +0 -410
  111. package/.playwright-mcp/page-2026-08-10T01-05-06-967Z.png +0 -0
  112. package/.playwright-mcp/page-2026-08-10T01-05-52-136Z.yml +0 -720
  113. package/.playwright-mcp/page-2026-08-10T01-06-05-985Z.yml +0 -410
  114. package/.playwright-mcp/page-2026-08-10T01-06-25-942Z.yml +0 -726
  115. package/.playwright-mcp/page-2026-08-10T01-25-57-152Z.yml +0 -395
  116. package/.playwright-mcp/page-2026-08-10T01-26-48-853Z.yml +0 -395
  117. package/.playwright-mcp/page-2026-08-10T01-27-47-127Z.yml +0 -413
  118. package/.playwright-mcp/page-2026-08-10T01-27-57-349Z.yml +0 -413
  119. package/.playwright-mcp/page-2026-08-10T01-28-07-943Z.yml +0 -425
  120. package/.playwright-mcp/page-2026-08-10T01-28-30-462Z.yml +0 -369
  121. package/.playwright-mcp/page-2026-08-10T01-29-00-369Z.yml +0 -413
  122. package/.playwright-mcp/page-2026-08-10T01-29-08-988Z.yml +0 -413
  123. package/.playwright-mcp/page-2026-08-10T01-29-19-888Z.yml +0 -425
  124. package/.playwright-mcp/page-2026-08-10T01-29-30-189Z.yml +0 -369
  125. package/.playwright-mcp/page-2026-08-10T01-30-08-272Z.yml +0 -413
  126. package/.playwright-mcp/page-2026-08-10T01-30-16-955Z.yml +0 -413
  127. package/.playwright-mcp/page-2026-08-10T01-30-27-612Z.yml +0 -425
  128. package/.playwright-mcp/page-2026-08-10T01-30-37-943Z.yml +0 -465
  129. package/.playwright-mcp/page-2026-08-10T01-31-15-265Z.yml +0 -413
  130. package/.playwright-mcp/page-2026-08-10T01-31-24-328Z.yml +0 -413
  131. package/.playwright-mcp/page-2026-08-10T01-31-36-622Z.yml +0 -425
  132. package/.playwright-mcp/page-2026-08-10T01-31-45-965Z.yml +0 -470
  133. package/.playwright-mcp/page-2026-08-10T01-32-13-400Z.yml +0 -413
  134. package/.playwright-mcp/page-2026-08-10T01-32-23-469Z.yml +0 -413
  135. package/.playwright-mcp/page-2026-08-10T01-32-33-859Z.yml +0 -425
  136. package/.playwright-mcp/page-2026-08-10T01-32-43-461Z.yml +0 -513
  137. package/.playwright-mcp/page-2026-08-10T01-33-13-160Z.yml +0 -413
  138. package/.playwright-mcp/page-2026-08-10T01-33-23-937Z.yml +0 -413
  139. package/.playwright-mcp/page-2026-08-10T01-33-35-367Z.yml +0 -425
  140. package/.playwright-mcp/page-2026-08-10T01-33-47-266Z.yml +0 -459
  141. package/.playwright-mcp/page-2026-08-10T01-34-14-452Z.yml +0 -413
  142. package/.playwright-mcp/page-2026-08-10T01-34-26-042Z.yml +0 -413
  143. package/.playwright-mcp/page-2026-08-10T01-34-40-869Z.yml +0 -425
  144. package/.playwright-mcp/page-2026-08-10T01-34-49-587Z.yml +0 -391
  145. package/.playwright-mcp/page-2026-08-10T01-35-16-735Z.yml +0 -413
  146. package/.playwright-mcp/page-2026-08-10T01-35-24-882Z.yml +0 -413
  147. package/.playwright-mcp/page-2026-08-10T01-35-36-165Z.yml +0 -425
  148. package/.playwright-mcp/page-2026-08-10T01-35-45-644Z.yml +0 -455
  149. package/.playwright-mcp/page-2026-08-10T01-36-18-148Z.yml +0 -413
  150. package/.playwright-mcp/page-2026-08-10T01-36-26-751Z.yml +0 -413
  151. package/.playwright-mcp/page-2026-08-10T01-36-37-834Z.yml +0 -425
  152. package/.playwright-mcp/page-2026-08-10T01-36-48-078Z.yml +0 -370
  153. package/.playwright-mcp/page-2026-08-10T01-37-16-309Z.yml +0 -413
  154. package/.playwright-mcp/page-2026-08-10T01-37-28-723Z.yml +0 -413
  155. package/.playwright-mcp/page-2026-08-10T01-37-39-325Z.yml +0 -425
  156. package/.playwright-mcp/page-2026-08-10T01-37-48-278Z.yml +0 -409
  157. package/.playwright-mcp/page-2026-08-10T01-38-27-405Z.yml +0 -413
  158. package/.playwright-mcp/page-2026-08-10T01-38-36-994Z.yml +0 -413
  159. package/.playwright-mcp/page-2026-08-10T01-38-49-584Z.yml +0 -425
  160. package/.playwright-mcp/page-2026-08-10T01-38-59-289Z.yml +0 -396
  161. package/.playwright-mcp/page-2026-08-10T01-39-24-880Z.yml +0 -413
  162. package/.playwright-mcp/page-2026-08-10T01-39-35-551Z.yml +0 -413
  163. package/.playwright-mcp/page-2026-08-10T01-39-47-960Z.yml +0 -425
  164. package/.playwright-mcp/page-2026-08-10T01-39-56-844Z.yml +0 -549
  165. package/.playwright-mcp/page-2026-08-10T01-40-24-645Z.yml +0 -413
  166. package/.playwright-mcp/page-2026-08-10T01-40-33-806Z.yml +0 -413
  167. package/.playwright-mcp/page-2026-08-10T01-40-46-946Z.yml +0 -425
  168. package/.playwright-mcp/page-2026-08-10T01-40-56-503Z.yml +0 -443
  169. package/.playwright-mcp/page-2026-08-10T01-41-32-064Z.yml +0 -413
  170. package/.playwright-mcp/page-2026-08-10T01-41-40-666Z.yml +0 -413
  171. package/.playwright-mcp/page-2026-08-10T01-41-51-325Z.yml +0 -425
  172. package/.playwright-mcp/page-2026-08-10T01-41-58-790Z.yml +0 -368
  173. package/.playwright-mcp/page-2026-08-10T01-42-26-459Z.yml +0 -413
  174. package/.playwright-mcp/page-2026-08-10T01-42-38-306Z.yml +0 -413
  175. package/.playwright-mcp/page-2026-08-10T01-42-49-073Z.yml +0 -425
  176. package/.playwright-mcp/page-2026-08-10T01-42-57-453Z.yml +0 -443
  177. package/.playwright-mcp/page-2026-08-10T01-43-32-099Z.yml +0 -413
  178. package/.playwright-mcp/page-2026-08-10T01-43-42-882Z.yml +0 -413
  179. package/.playwright-mcp/page-2026-08-10T01-43-54-853Z.yml +0 -425
  180. package/.playwright-mcp/page-2026-08-10T01-44-04-373Z.yml +0 -399
  181. package/.playwright-mcp/page-2026-08-10T01-44-30-874Z.yml +0 -413
  182. package/.playwright-mcp/page-2026-08-10T01-44-39-830Z.yml +0 -413
  183. package/.playwright-mcp/page-2026-08-10T01-44-51-515Z.yml +0 -425
  184. package/.playwright-mcp/page-2026-08-10T01-44-59-974Z.yml +0 -503
  185. package/.playwright-mcp/page-2026-08-10T01-45-26-748Z.yml +0 -413
  186. package/.playwright-mcp/page-2026-08-10T01-45-36-685Z.yml +0 -413
  187. package/.playwright-mcp/page-2026-08-10T01-45-47-715Z.yml +0 -425
  188. package/.playwright-mcp/page-2026-08-10T01-45-57-895Z.yml +0 -469
  189. package/.playwright-mcp/page-2026-08-10T01-46-36-371Z.yml +0 -413
  190. package/.playwright-mcp/page-2026-08-10T01-46-49-906Z.yml +0 -413
  191. package/.playwright-mcp/page-2026-08-10T01-47-01-554Z.yml +0 -425
  192. package/.playwright-mcp/page-2026-08-10T01-47-12-712Z.yml +0 -581
  193. package/.playwright-mcp/page-2026-08-10T01-47-39-024Z.yml +0 -413
  194. package/.playwright-mcp/page-2026-08-10T01-47-49-714Z.yml +0 -413
  195. package/.playwright-mcp/page-2026-08-10T01-48-00-608Z.yml +0 -425
  196. package/.playwright-mcp/page-2026-08-10T01-48-09-739Z.yml +0 -604
  197. package/.playwright-mcp/page-2026-08-10T01-48-51-940Z.yml +0 -413
  198. package/.playwright-mcp/page-2026-08-10T01-49-01-562Z.yml +0 -413
  199. package/.playwright-mcp/page-2026-08-10T01-49-13-751Z.yml +0 -425
  200. package/.playwright-mcp/page-2026-08-10T01-49-22-503Z.yml +0 -400
  201. package/.playwright-mcp/page-2026-08-10T01-49-49-311Z.yml +0 -413
  202. package/.playwright-mcp/page-2026-08-10T01-50-00-769Z.yml +0 -413
  203. package/.playwright-mcp/page-2026-08-10T01-50-12-083Z.yml +0 -425
  204. package/.playwright-mcp/page-2026-08-10T01-50-23-765Z.yml +0 -458
  205. package/.playwright-mcp/page-2026-08-10T01-51-02-339Z.yml +0 -413
  206. package/.playwright-mcp/page-2026-08-10T01-51-12-711Z.yml +0 -413
  207. package/.playwright-mcp/page-2026-08-10T01-51-25-370Z.yml +0 -425
  208. package/.playwright-mcp/page-2026-08-10T01-51-33-936Z.yml +0 -368
  209. package/.playwright-mcp/page-2026-08-10T01-52-09-467Z.yml +0 -413
  210. package/.playwright-mcp/page-2026-08-10T01-52-21-616Z.yml +0 -413
  211. package/.playwright-mcp/page-2026-08-10T01-52-32-806Z.yml +0 -425
  212. package/.playwright-mcp/page-2026-08-10T01-52-42-382Z.yml +0 -407
  213. package/.playwright-mcp/page-2026-08-10T01-53-11-994Z.yml +0 -413
  214. package/.playwright-mcp/page-2026-08-10T01-53-21-669Z.yml +0 -413
  215. package/.playwright-mcp/page-2026-08-10T01-53-33-141Z.yml +0 -425
  216. package/.playwright-mcp/page-2026-08-10T01-53-43-582Z.yml +0 -443
  217. package/.playwright-mcp/page-2026-08-10T01-54-19-884Z.yml +0 -413
  218. package/.playwright-mcp/page-2026-08-10T01-54-32-359Z.yml +0 -413
  219. package/.playwright-mcp/page-2026-08-10T01-54-43-530Z.yml +0 -425
  220. package/.playwright-mcp/page-2026-08-10T01-54-53-891Z.yml +0 -474
  221. package/.playwright-mcp/page-2026-08-10T01-55-24-634Z.yml +0 -413
  222. package/.playwright-mcp/page-2026-08-10T01-55-35-283Z.yml +0 -413
  223. package/.playwright-mcp/page-2026-08-10T01-55-46-649Z.yml +0 -425
  224. package/.playwright-mcp/page-2026-08-10T01-55-56-585Z.yml +0 -431
  225. package/.playwright-mcp/page-2026-08-10T01-56-31-670Z.yml +0 -413
  226. package/.playwright-mcp/page-2026-08-10T01-56-40-782Z.yml +0 -413
  227. package/.playwright-mcp/page-2026-08-10T01-56-52-065Z.yml +0 -425
  228. package/.playwright-mcp/page-2026-08-10T01-57-03-705Z.yml +0 -445
  229. package/.playwright-mcp/page-2026-08-10T01-57-31-390Z.yml +0 -413
  230. package/.playwright-mcp/page-2026-08-10T01-57-44-756Z.yml +0 -413
  231. package/.playwright-mcp/page-2026-08-10T01-57-56-802Z.yml +0 -425
  232. package/.playwright-mcp/page-2026-08-10T01-58-06-937Z.yml +0 -468
  233. package/.playwright-mcp/page-2026-08-10T01-58-40-595Z.yml +0 -413
  234. package/.playwright-mcp/page-2026-08-10T01-58-51-715Z.yml +0 -413
  235. package/.playwright-mcp/page-2026-08-10T01-59-04-402Z.yml +0 -425
  236. package/.playwright-mcp/page-2026-08-10T01-59-15-638Z.yml +0 -472
  237. package/.playwright-mcp/page-2026-08-10T01-59-58-162Z.yml +0 -413
  238. package/.playwright-mcp/page-2026-08-10T02-00-09-962Z.yml +0 -413
  239. package/.playwright-mcp/page-2026-08-10T02-00-21-468Z.yml +0 -425
  240. package/.playwright-mcp/page-2026-08-10T02-00-33-248Z.yml +0 -451
  241. package/.playwright-mcp/page-2026-08-10T02-01-15-418Z.yml +0 -413
  242. package/.playwright-mcp/page-2026-08-10T02-01-27-182Z.yml +0 -413
  243. package/.playwright-mcp/page-2026-08-10T02-01-38-250Z.yml +0 -425
  244. package/.playwright-mcp/page-2026-08-10T04-20-27-979Z.yml +0 -513
  245. package/.playwright-mcp/page-2026-08-10T04-20-41-431Z.yml +0 -513
  246. package/.playwright-mcp/page-2026-08-10T04-21-46-133Z.yml +0 -406
  247. package/.playwright-mcp/page-2026-08-10T04-22-10-938Z.yml +0 -406
  248. package/.playwright-mcp/page-2026-08-10T04-23-00-626Z.yml +0 -406
  249. package/.playwright-mcp/page-2026-08-10T04-23-19-844Z.yml +0 -418
  250. package/.playwright-mcp/page-2026-08-10T04-25-00-732Z.yml +0 -455
  251. package/.playwright-mcp/page-2026-08-10T04-25-35-125Z.yml +0 -412
  252. package/.playwright-mcp/page-2026-08-10T04-25-46-640Z.yml +0 -412
  253. package/.playwright-mcp/page-2026-08-10T04-25-55-092Z.yml +0 -549
  254. package/.playwright-mcp/page-2026-08-10T04-26-26-403Z.yml +0 -406
  255. package/.playwright-mcp/page-2026-08-10T04-26-40-673Z.yml +0 -406
  256. package/.playwright-mcp/page-2026-08-10T04-26-48-427Z.yml +0 -604
  257. package/.playwright-mcp/page-2026-08-10T04-27-23-584Z.yml +0 -408
  258. package/.playwright-mcp/page-2026-08-10T04-27-34-294Z.yml +0 -408
  259. package/.playwright-mcp/page-2026-08-10T04-27-42-299Z.yml +0 -443
  260. package/.playwright-mcp/page-2026-08-10T04-28-20-032Z.yml +0 -406
  261. package/.playwright-mcp/page-2026-08-10T04-28-32-275Z.yml +0 -406
  262. package/.playwright-mcp/page-2026-08-10T04-28-41-592Z.yml +0 -581
  263. package/.playwright-mcp/page-2026-08-10T04-29-19-972Z.yml +0 -414
  264. package/.playwright-mcp/page-2026-08-10T04-29-30-961Z.yml +0 -414
  265. package/.playwright-mcp/page-2026-08-10T04-29-39-044Z.yml +0 -465
  266. package/.playwright-mcp/page-2026-08-10T04-30-13-196Z.yml +0 -402
  267. package/.playwright-mcp/page-2026-08-10T04-30-24-867Z.yml +0 -402
  268. package/.playwright-mcp/page-2026-08-10T04-30-32-372Z.yml +0 -409
  269. package/.playwright-mcp/page-2026-08-10T04-31-06-199Z.yml +0 -402
  270. package/.playwright-mcp/page-2026-08-10T04-31-17-733Z.yml +0 -402
  271. package/.playwright-mcp/page-2026-08-10T04-31-26-296Z.yml +0 -445
  272. package/.playwright-mcp/page-2026-08-10T04-32-02-456Z.yml +0 -402
  273. package/.playwright-mcp/page-2026-08-10T04-32-14-091Z.yml +0 -402
  274. package/.playwright-mcp/page-2026-08-10T04-32-23-437Z.yml +0 -396
  275. package/.playwright-mcp/page-2026-08-10T04-32-58-401Z.yml +0 -403
  276. package/.playwright-mcp/page-2026-08-10T04-33-09-818Z.yml +0 -403
  277. package/.playwright-mcp/page-2026-08-10T04-33-20-858Z.yml +0 -468
  278. package/.playwright-mcp/page-2026-08-10T04-33-53-074Z.yml +0 -407
  279. package/.playwright-mcp/page-2026-08-10T04-34-05-806Z.yml +0 -407
  280. package/.playwright-mcp/page-2026-08-10T08-52-00-165Z.yml +0 -0
  281. package/.playwright-mcp/page-2026-08-10T08-52-17-430Z.yml +0 -410
@@ -0,0 +1,287 @@
1
+ - generic [active] [ref=f3e1]:
2
+ - link "Skip to main content" [ref=f3e2] [cursor=pointer]:
3
+ - /url: "#main-content"
4
+ - generic [ref=f3e4]:
5
+ - banner [ref=f3e5]:
6
+ - generic [ref=f3e11]:
7
+ - link [ref=f3e14] [cursor=pointer]:
8
+ - /url: /
9
+ - img "Horizon Aid Client Demo 1 logo" [ref=f3e15]
10
+ - generic [ref=f3e17]:
11
+ - navigation [ref=f3e20]:
12
+ - list [ref=f3e22]:
13
+ - listitem [ref=f3e23]:
14
+ - link "About" [ref=f3e24] [cursor=pointer]:
15
+ - /url: /about
16
+ - listitem [ref=f3e25]:
17
+ - link "Resources" [ref=f3e26] [cursor=pointer]:
18
+ - /url: /resources
19
+ - listitem [ref=f3e27]:
20
+ - link "Programs" [ref=f3e28] [cursor=pointer]:
21
+ - /url: /programs
22
+ - listitem [ref=f3e29]:
23
+ - link "Countries" [ref=f3e30] [cursor=pointer]:
24
+ - /url: /countries
25
+ - listitem [ref=f3e31]:
26
+ - link "Events" [ref=f3e32] [cursor=pointer]:
27
+ - /url: /events
28
+ - listitem [ref=f3e33]:
29
+ - link "Donate" [ref=f3e34] [cursor=pointer]:
30
+ - /url: /donate
31
+ - generic [ref=f3e35]:
32
+ - button "Search" [ref=f3e36] [cursor=pointer]:
33
+ - generic [ref=f3e37]: 
34
+ - text:  
35
+ - main [ref=f3e38]:
36
+ - generic [ref=f3e41]:
37
+ - generic [ref=f3e42]:
38
+ - figure [ref=f3e44]:
39
+ - img "Home Page Header Banner" [ref=f3e47]
40
+ - generic [ref=f3e48]:
41
+ - heading "Focus Forward" [level=1] [ref=f3e49]
42
+ - paragraph [ref=f3e51]: Empowering local communities to defend human rights and rebuild together.
43
+ - link "Donate Today" [ref=f3e53] [cursor=pointer]:
44
+ - /url: /donate
45
+ - generic [ref=f3e60]:
46
+ - heading "Delivering life-saving aid and sustainable development to communities in crisis." [level=2] [ref=f3e61]
47
+ - link "Learn About Our Role" [ref=f3e64] [cursor=pointer]:
48
+ - /url: /about
49
+ - generic [ref=f3e69]:
50
+ - generic [ref=f3e75]:
51
+ - generic [ref=f3e76]:
52
+ - heading "Global Impact" [level=2] [ref=f3e77]
53
+ - paragraph [ref=f3e79]: We believe in absolute transparency. Through partnerships and direct community funding, we track every dollar to ensure your support creates immediate, sustainable protection for human rights worldwide.
54
+ - link "Explore Our Impact" [ref=f3e81] [cursor=pointer]:
55
+ - /url: /countries
56
+ - generic [ref=f3e83]:
57
+ - generic [ref=f3e85]:
58
+ - generic [ref=f3e86]: 0K+
59
+ - paragraph [ref=f3e87]: Lives Protected
60
+ - generic [ref=f3e89]:
61
+ - generic [ref=f3e90]: 0K+
62
+ - paragraph [ref=f3e91]: Legal Aid Hours
63
+ - generic [ref=f3e93]:
64
+ - generic [ref=f3e94]: 0K+
65
+ - paragraph [ref=f3e95]: Communities Served
66
+ - generic [ref=f3e101]:
67
+ - heading "Explore Our Programs" [level=2] [ref=f3e102]
68
+ - generic [ref=f3e106]:
69
+ - tablist [ref=f3e107]:
70
+ - tab "Education" [selected] [ref=f3e108] [cursor=pointer]
71
+ - tab "Women" [ref=f3e109] [cursor=pointer]
72
+ - tab "Agriculture" [ref=f3e110] [cursor=pointer]
73
+ - tab "Medicine" [ref=f3e111] [cursor=pointer]
74
+ - tab "Health" [ref=f3e112] [cursor=pointer]
75
+ - tabpanel [ref=f3e114]:
76
+ - generic [ref=f3e115]:
77
+ - figure [ref=f3e117]:
78
+ - img "Children sitting together outside tents in a camp" [ref=f3e120]
79
+ - generic [ref=f3e121]:
80
+ - heading "Education" [level=3] [ref=f3e122]
81
+ - paragraph [ref=f3e123]: Building safe schools and training local teachers to give children a clear path to a brighter future.
82
+ - link "Learn More" [ref=f3e124] [cursor=pointer]:
83
+ - /url: /programs/education
84
+ - generic [ref=f3e139]:
85
+ - generic [ref=f3e140]:
86
+ - heading "Where We Work" [level=2] [ref=f3e141]
87
+ - generic [ref=f3e142]: We work where displacement, conflict and climate pressure hit hardest. Each country page sets out our role, the work on the ground, the figures behind it and the partners we work with.
88
+ - generic [ref=f3e143]:
89
+ - generic [ref=f3e144]:
90
+ - figure [ref=f3e146]:
91
+ - img "Girls in a classroom in Afghanistan" [ref=f3e148]
92
+ - generic [ref=f3e149]:
93
+ - generic [ref=f3e150]:
94
+ - heading "Afghanistan" [level=3] [ref=f3e151]
95
+ - generic [ref=f3e152]: One of the most complex humanitarian contexts in the world. We have worked alongside Afghan communities through displacement, conflict and recovery for over a decade.
96
+ - link "View Country" [ref=f3e154] [cursor=pointer]:
97
+ - /url: /countries/afghanistan
98
+ - generic [ref=f3e155]:
99
+ - figure [ref=f3e157]:
100
+ - img "Bangladesh country programme" [ref=f3e159]
101
+ - generic [ref=f3e160]:
102
+ - generic [ref=f3e161]:
103
+ - heading "Bangladesh" [level=3] [ref=f3e162]
104
+ - generic [ref=f3e163]: Shelter, water and sanitation support in dense displacement settlements exposed to cyclones and monsoon flooding.
105
+ - link "View Country" [ref=f3e165] [cursor=pointer]:
106
+ - /url: /countries/bangladesh
107
+ - generic [ref=f3e166]:
108
+ - figure [ref=f3e168]:
109
+ - img "Colombia country programme" [ref=f3e170]
110
+ - generic [ref=f3e171]:
111
+ - generic [ref=f3e172]:
112
+ - heading "Colombia" [level=3] [ref=f3e173]
113
+ - generic [ref=f3e174]: Legal aid, documentation and integration support for migrant and host communities along the migration corridor.
114
+ - link "View Country" [ref=f3e176] [cursor=pointer]:
115
+ - /url: /countries/colombia
116
+ - generic [ref=f3e177]:
117
+ - figure [ref=f3e179]:
118
+ - img "Ecuador country programme" [ref=f3e181]
119
+ - generic [ref=f3e182]:
120
+ - generic [ref=f3e183]:
121
+ - heading "Ecuador" [level=3] [ref=f3e184]
122
+ - generic [ref=f3e185]: Emergency legal aid and protection services for migrant families moving through major border corridors.
123
+ - link "View Country" [ref=f3e187] [cursor=pointer]:
124
+ - /url: /countries/ecuador
125
+ - generic [ref=f3e188]:
126
+ - link "View All Countries" [ref=f3e189] [cursor=pointer]:
127
+ - /url: /countries
128
+ - generic [ref=f3e191]:
129
+ - button "Previous" [disabled]
130
+ - button "Next" [disabled]
131
+ - generic [ref=f3e197]:
132
+ - heading "Collaborating With Partners to Drive Community Impact" [level=2] [ref=f3e205]
133
+ - generic [ref=f3e206]:
134
+ - figure [ref=f3e208]:
135
+ - img "Invert Partner" [ref=f3e210]
136
+ - figure [ref=f3e212]:
137
+ - img "Cloud Partner" [ref=f3e214]
138
+ - figure [ref=f3e216]:
139
+ - img "Minty Partner" [ref=f3e218]
140
+ - figure [ref=f3e220]:
141
+ - img "Greenish Partner" [ref=f3e222]
142
+ - figure [ref=f3e224]:
143
+ - img "Vision Partner" [ref=f3e226]
144
+ - generic [ref=f3e230]:
145
+ - heading "Upcoming Events" [level=2] [ref=f3e232]
146
+ - generic [ref=f3e240]:
147
+ - generic [ref=f3e242]:
148
+ - generic [ref=f3e243]:
149
+ - generic [ref=f3e244]: Webinar
150
+ - generic [ref=f3e246]:
151
+ - heading "Digital security for advocacy groups" [level=3] [ref=f3e247]
152
+ - generic [ref=f3e248]: Learn how to protect field communications, secure donor data, and defend your organisation against cyber threats in high-risk environments.
153
+ - generic [ref=f3e249]:
154
+ - paragraph [ref=f3e250]: 12 Jun – 30 Jul
155
+ - paragraph [ref=f3e251]: 11:00 - 14:30 +03
156
+ - link "Digital security for advocacy groups Learn how to protect field communications, secure donor data, and defend your organisation against cyber threats in high-risk environments.":
157
+ - /url: /events/digital-security-advocacy-groups
158
+ - generic [ref=f3e253]:
159
+ - generic [ref=f3e254]:
160
+ - generic [ref=f3e255]: In-person
161
+ - generic [ref=f3e257]:
162
+ - heading "Global refugee policy briefing" [level=3] [ref=f3e258]
163
+ - generic [ref=f3e259]: Senior legal advisors present new frameworks on asylum rights and cross-border protection standards.
164
+ - generic [ref=f3e260]:
165
+ - paragraph [ref=f3e261]: 17 Jun
166
+ - paragraph [ref=f3e262]: 11:00 - 14:30 +03
167
+ - link "Global refugee policy briefing Senior legal advisors present new frameworks on asylum rights and cross-border protection standards.":
168
+ - /url: /events/global-refugee-policy-briefing
169
+ - generic [ref=f3e264]:
170
+ - generic [ref=f3e265]:
171
+ - generic [ref=f3e266]: Summit
172
+ - generic [ref=f3e268]:
173
+ - heading "Grassroots leadership summit" [level=3] [ref=f3e269]
174
+ - generic [ref=f3e270]: A two-day convening for community leaders working in displacement and humanitarian response.
175
+ - generic [ref=f3e271]:
176
+ - paragraph [ref=f3e272]: 28 Jun – 29 Jun
177
+ - paragraph [ref=f3e273]: 11:00 - 14:30 +03
178
+ - link "Grassroots leadership summit A two-day convening for community leaders working in displacement and humanitarian response.":
179
+ - /url: /events/grassroots-leadership-summit
180
+ - link "See All Events" [ref=f3e275] [cursor=pointer]:
181
+ - /url: /events
182
+ - generic [ref=f3e284]:
183
+ - generic [ref=f3e285]:
184
+ - heading "Latest Updates" [level=2] [ref=f3e286]
185
+ - list [ref=f3e287]:
186
+ - listitem [ref=f3e288]:
187
+ - link "Healthcare & Medicine" [ref=f3e289] [cursor=pointer]:
188
+ - /url: /resources
189
+ - listitem [ref=f3e290]:
190
+ - link "Sustenance & Growth" [ref=f3e291] [cursor=pointer]:
191
+ - /url: /resources
192
+ - listitem [ref=f3e292]:
193
+ - link "Universal Education" [ref=f3e293] [cursor=pointer]:
194
+ - /url: /resources
195
+ - link "Explore More" [ref=f3e294] [cursor=pointer]:
196
+ - /url: /resources
197
+ - generic [ref=f3e296]:
198
+ - generic [ref=f3e297]:
199
+ - generic [ref=f3e298]:
200
+ - generic [ref=f3e299]:
201
+ - figure [ref=f3e300]:
202
+ - img "Two people walking through irrigated fields at first light" [ref=f3e303]
203
+ - generic "Report" [ref=f3e305]
204
+ - generic [ref=f3e307]:
205
+ - heading "Cultivating independence in rural farms" [level=3] [ref=f3e308]
206
+ - time [ref=f3e309]:
207
+ - generic [ref=f3e310]: Aug 19, 2026
208
+ - generic [ref=f3e311]: Cooperatives using climate-resilient tools secured steady yields for a second consecutive season.
209
+ - link "Cultivating independence in rural farms Aug 19, 2026 Cooperatives using climate-resilient tools secured steady yields for a second consecutive season.":
210
+ - /url: /resources/cultivating-independence-rural-farms
211
+ - generic [ref=f3e312]:
212
+ - generic [ref=f3e313]:
213
+ - figure [ref=f3e314]:
214
+ - img "An aid worker handing supplies to a man beside a mobile clinic van" [ref=f3e317]
215
+ - generic "News" [ref=f3e319]
216
+ - generic [ref=f3e321]:
217
+ - heading "Bridging medical gaps in border corridors" [level=3] [ref=f3e322]
218
+ - time [ref=f3e323]:
219
+ - generic [ref=f3e324]: Aug 19, 2026
220
+ - generic [ref=f3e325]: Mobile health units delivered emergency paediatric care and preventative supplies to more than forty remote settlements this quarter.
221
+ - link "Bridging medical gaps in border corridors Aug 19, 2026 Mobile health units delivered emergency paediatric care and preventative supplies to more than forty remote settlements this quarter.":
222
+ - /url: /resources/bridging-medical-gaps-border-corridors
223
+ - generic [ref=f3e326]:
224
+ - generic [ref=f3e327]:
225
+ - figure [ref=f3e328]:
226
+ - img "An aid worker handing supplies to a man beside a mobile clinic van" [ref=f3e331]
227
+ - generic "Report" [ref=f3e333]
228
+ - generic [ref=f3e335]:
229
+ - heading "Border health screening outcomes" [level=3] [ref=f3e336]
230
+ - time [ref=f3e337]:
231
+ - generic [ref=f3e338]: Aug 19, 2026
232
+ - generic [ref=f3e339]: Screening results from four crossings over twelve months.
233
+ - link "Border health screening outcomes Aug 19, 2026 Screening results from four crossings over twelve months.":
234
+ - /url: /resources/border-health-screening-outcomes
235
+ - generic [ref=f3e340]:
236
+ - button "Previous" [disabled]
237
+ - button "Next" [ref=f3e341] [cursor=pointer]
238
+ - contentinfo [ref=f3e347]:
239
+ - generic [ref=f3e348]:
240
+ - generic [ref=f3e355]:
241
+ - generic [ref=f3e356]:
242
+ - figure [ref=f3e366]:
243
+ - img "Horizon Aid" [ref=f3e367]
244
+ - paragraph [ref=f3e370]: A nonprofit fighting poverty, disease, and inequity around the world.
245
+ - list [ref=f3e374]:
246
+ - listitem [ref=f3e375]:
247
+ - link " Linkedin" [ref=f3e376] [cursor=pointer]:
248
+ - /url: https://www.linkedin.com/company/vardot
249
+ - listitem [ref=f3e377]:
250
+ - link " Facebook" [ref=f3e378] [cursor=pointer]:
251
+ - /url: https://www.facebook.com/vardotters/
252
+ - listitem [ref=f3e379]:
253
+ - link " Instagram" [ref=f3e380] [cursor=pointer]:
254
+ - /url: https://www.instagram.com/vardotters/
255
+ - listitem [ref=f3e381]:
256
+ - link " X-Twitter" [ref=f3e382] [cursor=pointer]:
257
+ - /url: https://x.com/Vardot
258
+ - list [ref=f3e386]:
259
+ - listitem [ref=f3e387]:
260
+ - link "Quicklinks":
261
+ - /url: ""
262
+ - list [ref=f3e388]:
263
+ - listitem [ref=f3e389]:
264
+ - link "Learn" [ref=f3e390] [cursor=pointer]:
265
+ - /url: /resources
266
+ - listitem [ref=f3e391]:
267
+ - link "Explore" [ref=f3e392] [cursor=pointer]:
268
+ - /url: /programs
269
+ - listitem [ref=f3e393]:
270
+ - link "Impact" [ref=f3e394] [cursor=pointer]:
271
+ - /url: /impact
272
+ - listitem [ref=f3e395]:
273
+ - link "Act" [ref=f3e396] [cursor=pointer]:
274
+ - /url: /donate
275
+ - generic [ref=f3e397]:
276
+ - heading "Join Our Mission" [level=2] [ref=f3e398]
277
+ - paragraph [ref=f3e401]: Stay informed about our latest initiatives and how you can help.
278
+ - button "Subscribe" [ref=f3e403] [cursor=pointer]
279
+ - generic [ref=f3e409]:
280
+ - list [ref=f3e413]:
281
+ - listitem [ref=f3e414]:
282
+ - link "Terms and Conditions" [ref=f3e415] [cursor=pointer]:
283
+ - /url: /terms-and-conditions
284
+ - listitem [ref=f3e416]:
285
+ - link "My privacy settings" [ref=f3e417] [cursor=pointer]:
286
+ - /url: ""
287
+ - paragraph [ref=f3e420]: Copyright © 2026
package/AGENTS.md CHANGED
@@ -109,7 +109,7 @@ step definitions. Critical takeaways:
109
109
 
110
110
  ## Source map
111
111
 
112
- Step definitions: `tests/step-definitions/` — 495 steps across 44
112
+ Step definitions: `tests/step-definitions/` — 512 steps across 45
113
113
  `*.steps.js` files, all auto-loaded, including the Drupal and Varbase packs
114
114
  (`drupal-core`, `drupal-ckeditor`, `drupal-media`, `drupal-moderation`,
115
115
  `drupal-layout-builder`, `drupal-paragraphs`, `drupal-canvas`, `varbase`)
package/CLAUDE.md CHANGED
@@ -266,7 +266,7 @@ Some pairs look similar but cover different domains. NEVER merge:
266
266
 
267
267
  ## 5. File organisation
268
268
 
269
- 495 built-in steps across 44 step files. Cucumber auto-loads every
269
+ 512 built-in steps across 45 step files. Cucumber auto-loads every
270
270
  `*.steps.js` in `tests/step-definitions/`.
271
271
 
272
272
  ```
@@ -276,7 +276,7 @@ tests/step-definitions/
276
276
  ├── a11y.steps.js (26) # axe-core WCAG audits + POUR hygiene probes (axe loaded lazily)
277
277
  ├── action.steps.js (7) # press / click / follow / attach file (actOrExplain lives here)
278
278
  ├── api.steps.js (22) # REST long form — base URL, headers, query, body, JSON Pointer
279
- ├── assertion.steps.js (14) # see / not see, in row, in element, response, count
279
+ ├── assertion.steps.js (17) # see / not see, in row, in element, page title, response, HTTP status, count
280
280
  ├── auth.steps.js (3) # storageState save / restore / clear
281
281
  ├── clock.steps.js (7) # page.clock — install / advance / pause / set
282
282
  ├── cookie.steps.js (12) # cookie exists / equals / contains
@@ -293,7 +293,7 @@ tests/step-definitions/
293
293
  ├── link.steps.js (9) # href / title / target / rel assertions
294
294
  ├── metatag.steps.js (3) # <meta> description / keywords / OG / Twitter
295
295
  ├── modal.steps.js (9) # HTML modal visibility / content / interactions
296
- ├── navigation.steps.js (11) # anonymous user, homepage, paths, history, URL assertions
296
+ ├── navigation.steps.js (14) # anonymous user, homepage, paths, history, URL + access assertions
297
297
  ├── network.steps.js (10) # route stubs / blocks / delays / offline
298
298
  ├── path.steps.js (8) # URL path / query parameter / fragment
299
299
  ├── response.steps.js (4) # response header inspection
@@ -310,15 +310,16 @@ tests/step-definitions/
310
310
  ├── xml.steps.js (20) # XPath equals / contains / count / attr
311
311
  ├── drupal-canvas.steps.js (12) # Drupal Canvas editor + authoring API (pages, library, patterns, publish)
312
312
  ├── drupal-ckeditor.steps.js (4) # CKEditor 5 body writing, toolbar commands, Linkit dialog
313
+ ├── drupal-drimage-improved.steps.js (13) # Drimage Improved: loaded / lazy / sized / webp / noscript / figure / caption / alt / title, selector-free
313
314
  ├── drupal-core.steps.js (27) # Drupal core: session, rows, operations, breadcrumbs, toolbar, waits
314
315
  ├── drupal-layout-builder.steps.js (17) # Layout Builder sections + the form controls that configure them
315
316
  ├── drupal-media.steps.js (4) # media library open / select / insert / submit dialog
316
317
  ├── drupal-moderation.steps.js (3)# moderation sidebar open + shows / does not show
317
318
  ├── drupal-paragraphs.steps.js (1)# choose a paragraph component in the add-widget dialog
318
- ├── varbase.steps.js (14) # Varbase: users, tour, theme settings, sticky header, a11y checker, warm-up
319
+ ├── varbase.steps.js (12) # Varbase: users, tour, theme settings, sticky header, a11y checker, warm-up
319
320
  └── yaml.steps.js (38) # multi-doc, types, numerics, JSON Schema, diff
320
321
 
321
- tests/features/ # 71 .feature files
322
+ tests/features/ # 72 .feature files
322
323
  tests/selectors/ # 26 JSON presets + _canonical-keys.json
323
324
  tests/assets/ # upload fixtures (pdf, png)
324
325
  examples/ # static HTML fixtures served by `npm start`
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ ![Varbase E2E](images/varbase-e2e-logo.svg)
2
+
1
3
  # Varbase E2E
2
4
 
3
5
  [![Github Actions](https://github.com/Vardot/varbase-e2e/actions/workflows/github-actions.yml/badge.svg?branch=2.0.x)](https://github.com/Vardot/varbase-e2e/actions)
@@ -4,7 +4,7 @@ All step definitions ship in `tests/step-definitions/*.steps.js`. Cucumber-js lo
4
4
 
5
5
  This is a topical reference — the fast lookup when you know roughly what you want.
6
6
 
7
- For the **full catalogue**, with every step's pattern and at least five valid Gherkin examples each, see [`steps/`](steps/README.md): 495 steps across 44 category pages, generated from the step definitions themselves. The Drupal and Varbase packs are documented there and not repeated below.
7
+ For the **full catalogue**, with every step's pattern and at least five valid Gherkin examples each, see [`steps/`](steps/README.md): 508 steps across 45 category pages, generated from the step definitions themselves. The Drupal and Varbase packs are documented there and not repeated below.
8
8
 
9
9
  ## Navigation
10
10
 
@@ -18,6 +18,14 @@ For the **full catalogue**, with every step's pattern and at least five valid Gh
18
18
  | `When I move forward one page` | `varbase-e2e.js` |
19
19
  | `When I reload the page` | `varbase-e2e.js` |
20
20
 
21
+ ## Access
22
+
23
+ | Step | Notes |
24
+ | --- | --- |
25
+ | `Then I am denied access to "/path"` | Refused: 403, 404, an access-denied page, or a log-in redirect. `should be refused` is the same step. |
26
+ | `Then I should be allowed "/path"` | 2xx and no refusal marker. `am granted access to` is the same step. |
27
+ | `Then I should be denied access` | The page already open. `the page should be access restricted` is the same step. |
28
+
21
29
  ## Click & press
22
30
 
23
31
  | Step | Notes |
@@ -358,9 +366,12 @@ This index lists every public step grouped by source file, with one Gherkin exam
358
366
  - *^(the )*"([^"]*)?" element should( not)* contain "([^"]*)?"$* · Example: `Then the "body" element should contain "color:white;"`
359
367
  - *^(I |we )*should see (\d+) "([^"]*)" elements?$* · Example: `Then I should see 3 "li" elements`
360
368
  - *^(the )*"([^"]*)?" link should contain "([^"]*)?"$* · Example: `Then the "Login" link should contain "/log-in"`
369
+ - *^(the )*page title should( not)* be "([^"]*)?"$* · Example: `Then the page title should be "About Us"`
370
+ - *^(the )*page title should( not)* contain "([^"]*)?"$* · Example: `Then the page title should contain "About"`
361
371
  - *^(the )*"([^"]*)?" link should contain "([^"]*)?" by( its)*(?: "([^"]*)?")* (attribute|attr)$* · Example: `Then the "#about-us-id" link should contain "about" by attr`
362
372
  - *^(the )*response should( not)* contain "([^"]*)?"$* · Example: `Then the response should contain "Welcome visitor"`
363
373
  - *^(the )*response status code should( not)* be (\d+)$* · Example: `Then the response status code should be 200`
374
+ - *^(the )*page should( not)* return HTTP status (\d+)$* · Example: `Then the page should return HTTP status 404`
364
375
 
365
376
  ### auth.steps.js
366
377
 
@@ -570,6 +581,9 @@ This index lists every public step grouped by source file, with one Gherkin exam
570
581
  - *^(I |we )*should( not)* be on( the)* (homepage|frontpage)$* · Example: `Then I should be on homepage`
571
582
  - *^(I |we )*should( not)* be on( the)* "([^"]*)?"( page)*$* · Example: `Then I should be on "/"`
572
583
  - *^(the )*url should( not)* match "([^"]*)?"$* · Example: `Then the url should match "/contact-us.html"`
584
+ - *^(I |we )*(?:am|should be) (?:denied access to|refused) "([^"]*)?"$* · Example: `Then I am denied access to "/admin/config"`
585
+ - *^(I |we )*(?:am|should be) (?:allowed|granted access to) "([^"]*)?"$* · Example: `Then I should be allowed "/admin/content"`
586
+ - *^(?:(?:I |we )*should be denied access|(?:the )*page should be access restricted)$* · Example: `Then I should be denied access`
573
587
 
574
588
  ### network.steps.js
575
589
 
package/docs/README.md CHANGED
@@ -1,8 +1,10 @@
1
+ ![Varbase E2E](../images/varbase-e2e-logo.svg)
2
+
1
3
  # Varbase E2E Documentation
2
4
 
3
5
  Varbase E2E is a BDD-first browser-automation harness built on Playwright + Cucumber-js. Feature files in plain Gherkin; selectors that survive redesigns; smart waits that never sleep.
4
6
 
5
- **495 built-in steps** across **44 step files**, including the Drupal and Varbase packs. **282 example scenarios / 1,372 step executions** in the bundled suite, all green on chromium.
7
+ **512 built-in steps** across **45 step files**, including the Drupal and Varbase packs. **299 example scenarios / 1,456 step executions** in the bundled suite, all green on chromium.
6
8
 
7
9
  The full step catalogue — one page per category, generated from the step definitions themselves — is in **[`steps/`](steps/README.md)**.
8
10
 
@@ -39,7 +41,7 @@ The full step catalogue — one page per category, generated from the step defin
39
41
  | [Install — DDEV](install-varbase-e2e/ddev-varbase-e2e.md) | DDEV-Varbase-E2E variant |
40
42
  | [Global settings](global-settings.md) | `cucumber.js` `worldParameters` reference |
41
43
  | [Step definitions](step-definitions.md) | Step-definition hub — what a step is, the rules, where the catalogue lives |
42
- | [Step catalogue](steps/README.md) | All 495 steps, 44 category pages under `steps/`, generated from the source |
44
+ | [Step catalogue](steps/README.md) | All 512 steps, 45 category pages under `steps/`, generated from the source |
43
45
  | [API step definitions](api-step-definitions.md) | REST step definitions |
44
46
  | [Advanced screenshots](advanced-screenshots.md) | Per-size, full-page, named (3 sub-pages under `advanced-screenshots/`) |
45
47
  | [Advanced selectors](advanced-selectors.md) | Named selector registry, position assertions |
@@ -79,7 +81,7 @@ varbase-e2e/
79
81
  │ ├── a11y.steps.js (26) # axe-core audits + WCAG hygiene probes
80
82
  │ ├── action.steps.js (7) # press / click / follow / attach
81
83
  │ ├── api.steps.js (22) # REST long form (base URL, headers, query, body, JSON Pointer)
82
- │ ├── assertion.steps.js (14) # see / not see, in row, in element, response, count
84
+ │ ├── assertion.steps.js (17) # see / not see, in row, in element, page title, response, HTTP status, count
83
85
  │ ├── auth.steps.js (3) # save / restore / clear storageState
84
86
  │ ├── clock.steps.js (7) # install / advance / pause / set system time
85
87
  │ ├── cookie.steps.js (12) # cookie exists / equals / contains
@@ -96,7 +98,7 @@ varbase-e2e/
96
98
  │ ├── link.steps.js (9) # href / title / target / rel
97
99
  │ ├── metatag.steps.js (3) # description / keywords / OG / Twitter
98
100
  │ ├── modal.steps.js (9) # HTML modal visibility / content / interactions
99
- │ ├── navigation.steps.js (11) # homepage / paths / history / URL assertions
101
+ │ ├── navigation.steps.js (14) # homepage / paths / history / URL assertions
100
102
  │ ├── network.steps.js (10) # route stubs / mocks / delays / offline
101
103
  │ ├── path.steps.js (8) # URL path / query / fragment
102
104
  │ ├── response.steps.js (4) # response header inspection
@@ -117,7 +119,8 @@ varbase-e2e/
117
119
  │ ├── drupal-media.steps.js (4) # media library open / select / insert
118
120
  │ ├── drupal-moderation.steps.js (3) # moderation sidebar open + assertions
119
121
  │ ├── drupal-paragraphs.steps.js (1) # choose a paragraph component
120
- │ ├── varbase.steps.js (14) # Varbase users, tour, theme settings, a11y checker
122
+ │ ├── drupal-drimage-improved.steps.js (13) # Drimage Improved: loaded / lazy / sized / webp / noscript / figure / caption / alt / title, no selectors
123
+ │ ├── varbase.steps.js (12) # Varbase users, tour, theme settings, a11y checker
121
124
  │ ├── xml.steps.js (20) # XPath equals / contains / count / attr
122
125
  │ └── yaml.steps.js (38) # multi-doc + types + numerics + JSON Schema + diff
123
126
  ├── examples/ <— Static HTML fixtures
@@ -30,5 +30,3 @@ The page is part of the Varbase E2E 2.0.x documentation section, which includes:
30
30
  - Advanced Selectors
31
31
  - Assertions
32
32
  - Commands
33
-
34
- There is also a subsection on "[DDEV Varbase E2E](/docs/varbase-e2e/2.0.x/install-varbase-e2e/ddev-varbase-e2e)" available under the installation guide.
@@ -4,7 +4,7 @@ Every step Varbase E2E ships, one page per category, generated from the step
4
4
  definitions themselves — so the phrasing, the pattern and the examples on these
5
5
  pages are exactly what the runner matches.
6
6
 
7
- **495 steps across 44 categories.**
7
+ **512 steps across 45 categories.**
8
8
 
9
9
  Cucumber-js loads every `*.steps.js` under `tests/step-definitions/`
10
10
  automatically. You never `require()` a step file from a feature: write the
@@ -37,10 +37,11 @@ Steps for the Drupal and Varbase surfaces the team tests every day — the node
37
37
  | Content moderation | 3 | [`drupal-moderation.md`](drupal-moderation.md) |
38
38
  | Layout Builder | 17 | [`drupal-layout-builder.md`](drupal-layout-builder.md) |
39
39
  | Paragraphs | 1 | [`drupal-paragraphs.md`](drupal-paragraphs.md) |
40
+ | Drimage Improved | 13 | [`drupal-drimage-improved.md`](drupal-drimage-improved.md) |
40
41
  | Drupal Canvas | 12 | [`drupal-canvas.md`](drupal-canvas.md) |
41
- | Varbase | 14 | [`varbase.md`](varbase.md) |
42
+ | Varbase | 12 | [`varbase.md`](varbase.md) |
42
43
 
43
- **82 steps.**
44
+ **95 steps.**
44
45
 
45
46
  ## User journeys
46
47
 
@@ -48,7 +49,7 @@ Driving the browser the way a person does: going somewhere, filling something in
48
49
 
49
50
  | Category | Steps | Page |
50
51
  | --- | --- | --- |
51
- | Navigation | 11 | [`navigation.md`](navigation.md) |
52
+ | Navigation | 14 | [`navigation.md`](navigation.md) |
52
53
  | Actions | 7 | [`action.md`](action.md) |
53
54
  | Forms | 13 | [`form.md`](form.md) |
54
55
  | Field state | 27 | [`field.md`](field.md) |
@@ -67,7 +68,7 @@ Asserting what the page ended up showing.
67
68
 
68
69
  | Category | Steps | Page |
69
70
  | --- | --- | --- |
70
- | Assertions | 14 | [`assertion.md`](assertion.md) |
71
+ | Assertions | 17 | [`assertion.md`](assertion.md) |
71
72
  | Web-first matchers | 12 | [`web-first.md`](web-first.md) |
72
73
  | Element interactions | 19 | [`element.md`](element.md) |
73
74
  | Tables | 8 | [`table.md`](table.md) |
@@ -1,6 +1,6 @@
1
1
  # Assertions steps
2
2
 
3
- 14 steps, defined in `tests/step-definitions/assertion.steps.js`.
3
+ 17 steps, defined in `tests/step-definitions/assertion.steps.js`.
4
4
 
5
5
  Cucumber-js loads every `*.steps.js` in that directory automatically — you never `require()` a step file from a feature.
6
6
 
@@ -18,8 +18,11 @@ Cucumber-js loads every `*.steps.js` in that directory automatically — you nev
18
18
  | 10 | `Then I should see 3 "li" elements` |
19
19
  | 11 | `Then the "Login" link should contain "/log-in"` |
20
20
  | 12 | `Then the "#about-us-id" link should contain "about" by attr` |
21
- | 13 | `Then the response should contain "Welcome visitor"` |
22
- | 14 | `Then the response status code should be 200` |
21
+ | 13 | `Then the page title should be "About Us"` |
22
+ | 14 | `Then the page title should contain "About"` |
23
+ | 15 | `Then the response should contain "Welcome visitor"` |
24
+ | 16 | `Then the response status code should be 200` |
25
+ | 17 | `Then the page should return HTTP status 200` |
23
26
 
24
27
  ---
25
28
 
@@ -280,7 +283,59 @@ And the "aboutUs" link should contain "about" by its "class" attribute
280
283
  And the ".contactUs" link should contain "/contact-" by attr
281
284
  ```
282
285
 
283
- ## 13. Then the response should contain "Welcome visitor"
286
+ ## 13. Then the page title should be "About Us"
287
+
288
+ Assert the page title is, or is not, exactly this text.
289
+
290
+ The title is `document.title` — the `<title>` element, which is the browser tab text, the bookmark name, the search-result heading and what a screen reader announces first on a new page. On a Drupal site it is the head title pattern, so this is how a test proves the pattern and the token that fills it both work. Compared after trimming, because a title built from a template often carries stray whitespace around the separator.
291
+
292
+ **Keyword**: `Then`
293
+
294
+ **Pattern**
295
+
296
+ ```js
297
+ /^(the )*page title should( not)* be "([^"]*)?"$/
298
+ ```
299
+
300
+ **Examples**
301
+
302
+ ```gherkin
303
+ Then the page title should be "About Us"
304
+ Then the page title should not be "Access denied"
305
+ And the page title should be "Contact Us | Example"
306
+ When I go to "/blog"
307
+ Then the page title should be "Blog | Example"
308
+ Then the page title should not be "Page not found | Example"
309
+ ```
310
+
311
+ ## 14. Then the page title should contain "About"
312
+
313
+ Assert the page title contains, or does not contain, this text.
314
+
315
+ The form to reach for on a real site: the head title carries the site name and a separator the test has no business hardcoding, so assert the part the page owns. Case-sensitive, compared after trimming.
316
+
317
+ **Keyword**: `Then`
318
+
319
+ **Pattern**
320
+
321
+ ```js
322
+ /^(the )*page title should( not)* contain "([^"]*)?"$/
323
+ ```
324
+
325
+ **Examples**
326
+
327
+ ```gherkin
328
+ Then the page title should contain "About"
329
+ Then the page title should not contain "Access denied"
330
+ And the page title should contain "Getting Started"
331
+ When I go to "/contact-us"
332
+ Then the page title should contain "Contact"
333
+ Then the page title should not contain "Untitled"
334
+ ```
335
+
336
+ Related: `I wait until the page title is/contains "..."` in [`wait.md`](wait.md) waits for a title to become something; these two assert what it is now.
337
+
338
+ ## 15. Then the response should contain "Welcome visitor"
284
339
 
285
340
  Assert that the rendered HTML response contains or does not contain text.
286
341
 
@@ -307,10 +362,12 @@ When I am on "/about"
307
362
  And the response should not contain "TODO"
308
363
  ```
309
364
 
310
- ## 14. Then the response status code should be 200
365
+ ## 16. Then the response status code should be 200
311
366
 
312
367
  Assert that the current page's response status is or is not a given code.
313
368
 
369
+ Re-requests the current URL **through the browser's own context**, so the check sees what this user sees: the session cookies travel with the request, and redirects are not followed, so a 3xx can actually be asserted.
370
+
314
371
  **Keyword**: `Then`
315
372
 
316
373
  **Pattern**
@@ -325,4 +382,32 @@ Assert that the current page's response status is or is not a given code.
325
382
  Then the response status code should be 200
326
383
  And the response status code should not be 404
327
384
  Then the response status code should be 301
385
+ When I go to "/no-such-page"
386
+ Then the response status code should be 404
387
+ Then the response status code should not be 500
328
388
  ```
389
+
390
+ ## 17. Then the page should return HTTP status 200
391
+
392
+ The same assertion as step 16, in the phrasing that reads as a sentence about the page rather than about a response object — one implementation, two phrasings. A test about a 404 page reads better as "the page should return HTTP status 404"; a test about an API call reads better as "the response status code should be 404".
393
+
394
+ **Keyword**: `Then`
395
+
396
+ **Pattern**
397
+
398
+ ```js
399
+ /^(the )*page should( not)* return HTTP status (\d+)$/
400
+ ```
401
+
402
+ **Examples**
403
+
404
+ ```gherkin
405
+ Then the page should return HTTP status 200
406
+ Then the page should not return HTTP status 404
407
+ And the page should return HTTP status 403
408
+ When I go to "/no-such-page"
409
+ Then the page should return HTTP status 404
410
+ Then the page should return HTTP status 301
411
+ ```
412
+
413
+ Note: the status a page returns is not always what it renders. A Drupal site can answer 200 with an access-denied page, or 404 to keep a route unguessable — see the access assertions in [`navigation.md`](navigation.md) for asserting the refusal itself rather than its status.