@intuned/browser-dev 2.2.3-test-build.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 (206) hide show
  1. package/.babelrc +21 -0
  2. package/.eslintignore +10 -0
  3. package/.eslintrc.js +39 -0
  4. package/LICENSE +43 -0
  5. package/dist/ai/export.d.js +5 -0
  6. package/dist/ai/export.d.ts +641 -0
  7. package/dist/ai/extractStructuredData.js +320 -0
  8. package/dist/ai/extractStructuredDataUsingAi.js +139 -0
  9. package/dist/ai/extractionHelpers/screenshotHelpers.js +56 -0
  10. package/dist/ai/extractionHelpers/validateSchema.js +148 -0
  11. package/dist/ai/index.d.ts +641 -0
  12. package/dist/ai/index.js +19 -0
  13. package/dist/ai/isPageLoaded.js +77 -0
  14. package/dist/ai/prompt.js +39 -0
  15. package/dist/ai/tests/testCheckAllTypesAreStrings.spec.js +137 -0
  16. package/dist/ai/tests/testExtractFromContent.spec.js +372 -0
  17. package/dist/ai/tests/testExtractStructuredData.spec.js +646 -0
  18. package/dist/ai/tests/testIsPageLoaded.spec.js +277 -0
  19. package/dist/ai/tools/index.js +48 -0
  20. package/dist/ai/types/errors.js +67 -0
  21. package/dist/ai/types/models.js +45 -0
  22. package/dist/ai/types/types.js +48 -0
  23. package/dist/ai/validators.js +167 -0
  24. package/dist/common/Logger/index.js +60 -0
  25. package/dist/common/Logger/types.js +5 -0
  26. package/dist/common/SdkError.js +50 -0
  27. package/dist/common/aiModelsValidations.js +32 -0
  28. package/dist/common/browser_scripts.js +2596 -0
  29. package/dist/common/ensureBrowserScripts.js +18 -0
  30. package/dist/common/extendedTest.js +148 -0
  31. package/dist/common/extractionHelpers.js +19 -0
  32. package/dist/common/formatZodError.js +18 -0
  33. package/dist/common/fuzzySearch/fuzzySearch.test.js +250 -0
  34. package/dist/common/fuzzySearch/levenshtein-search.js +298 -0
  35. package/dist/common/fuzzySearch/utils.js +23 -0
  36. package/dist/common/getModelProvider.js +18 -0
  37. package/dist/common/getSimplifiedHtml.js +122 -0
  38. package/dist/common/hashObject.js +32 -0
  39. package/dist/common/html2markdown/convertElementToMarkdown.js +469 -0
  40. package/dist/common/html2markdown/index.js +19 -0
  41. package/dist/common/jwtTokenManager.js +18 -0
  42. package/dist/common/loadRuntime.js +16 -0
  43. package/dist/common/locatorHelpers.js +41 -0
  44. package/dist/common/matching/collectStrings.js +32 -0
  45. package/dist/common/matching/levenshtein.js +40 -0
  46. package/dist/common/matching/matching.js +317 -0
  47. package/dist/common/matching/types.js +1 -0
  48. package/dist/common/noEmpty.js +9 -0
  49. package/dist/common/saveSnapshotWithExamples.js +60 -0
  50. package/dist/common/tests/testEnsureBrowserScript.spec.js +31 -0
  51. package/dist/common/xpathMapping.js +107 -0
  52. package/dist/helpers/clickUntilExhausted.js +85 -0
  53. package/dist/helpers/downloadFile.js +125 -0
  54. package/dist/helpers/export.d.js +5 -0
  55. package/dist/helpers/export.d.ts +1220 -0
  56. package/dist/helpers/extractMarkdown.js +35 -0
  57. package/dist/helpers/filterEmptyValues.js +54 -0
  58. package/dist/helpers/gotoUrl.js +98 -0
  59. package/dist/helpers/index.d.ts +1220 -0
  60. package/dist/helpers/index.js +128 -0
  61. package/dist/helpers/processDate.js +25 -0
  62. package/dist/helpers/resolveUrl.js +64 -0
  63. package/dist/helpers/sanitizeHtml.js +74 -0
  64. package/dist/helpers/saveFileToS3.js +50 -0
  65. package/dist/helpers/scrollToLoadContent.js +57 -0
  66. package/dist/helpers/tests/extendedTest.js +130 -0
  67. package/dist/helpers/tests/testClickUntilExhausted.spec.js +387 -0
  68. package/dist/helpers/tests/testDownloadFile.spec.js +204 -0
  69. package/dist/helpers/tests/testExtractMarkdown.spec.js +290 -0
  70. package/dist/helpers/tests/testFilterEmptyValues.spec.js +151 -0
  71. package/dist/helpers/tests/testGoToUrl.spec.js +37 -0
  72. package/dist/helpers/tests/testProcessDate.spec.js +13 -0
  73. package/dist/helpers/tests/testResolveUrl.spec.js +341 -0
  74. package/dist/helpers/tests/testSanitizeHtml.spec.js +330 -0
  75. package/dist/helpers/tests/testScrollToLoadContent.spec.js +163 -0
  76. package/dist/helpers/tests/testValidateDataUsingSchema.spec.js +342 -0
  77. package/dist/helpers/tests/testWithDomSettledWait.spec.js +164 -0
  78. package/dist/helpers/tests/testWithNetworkIdleWait.spec.js +114 -0
  79. package/dist/helpers/types/Attachment.js +115 -0
  80. package/dist/helpers/types/CustomTypeRegistry.js +48 -0
  81. package/dist/helpers/types/RunEnvironment.js +18 -0
  82. package/dist/helpers/types/ValidationError.js +17 -0
  83. package/dist/helpers/types/index.js +51 -0
  84. package/dist/helpers/uploadFileToS3.js +154 -0
  85. package/dist/helpers/utils/getS3Client.js +22 -0
  86. package/dist/helpers/utils/index.js +73 -0
  87. package/dist/helpers/utils/isDownload.js +10 -0
  88. package/dist/helpers/utils/isGenerateCodeMode.js +9 -0
  89. package/dist/helpers/utils/isLocator.js +9 -0
  90. package/dist/helpers/utils/jwtTokenManager.js +18 -0
  91. package/dist/helpers/validateDataUsingSchema.js +103 -0
  92. package/dist/helpers/waitForDomSettled.js +90 -0
  93. package/dist/helpers/withNetworkSettledWait.js +91 -0
  94. package/dist/index.d.js +16 -0
  95. package/dist/index.d.ts +10 -0
  96. package/dist/index.js +16 -0
  97. package/dist/intunedServices/ApiGateway/aiApiGateway.js +99 -0
  98. package/dist/intunedServices/ApiGateway/factory.js +13 -0
  99. package/dist/intunedServices/ApiGateway/providers/Anthropic.js +26 -0
  100. package/dist/intunedServices/ApiGateway/providers/Gemini.js +29 -0
  101. package/dist/intunedServices/ApiGateway/providers/OpenAI.js +29 -0
  102. package/dist/intunedServices/ApiGateway/tests/testApiGateway.spec.js +224 -0
  103. package/dist/intunedServices/ApiGateway/types.js +11 -0
  104. package/dist/intunedServices/cache/cache.js +61 -0
  105. package/dist/intunedServices/cache/index.js +12 -0
  106. package/dist/intunedServices/cache/tests/testCache.spec.js +117 -0
  107. package/dist/optimized-extractors/common/buildExamplesPrompt.js +12 -0
  108. package/dist/optimized-extractors/common/buildImagesFromPage.js +55 -0
  109. package/dist/optimized-extractors/common/extractStructuredDataUsingClaude.js +135 -0
  110. package/dist/optimized-extractors/common/extractStructuredDataUsingGoogle.js +37 -0
  111. package/dist/optimized-extractors/common/extractStructuredDataUsingOpenAi.js +132 -0
  112. package/dist/optimized-extractors/common/extractStrucutredDataUsingAiInstance.js +122 -0
  113. package/dist/optimized-extractors/common/findTableHeaders.js +162 -0
  114. package/dist/optimized-extractors/common/index.js +55 -0
  115. package/dist/optimized-extractors/common/isTableHeaderOrFooter.js +84 -0
  116. package/dist/optimized-extractors/common/matching/matching.js +212 -0
  117. package/dist/optimized-extractors/common/matching/matching.test.js +655 -0
  118. package/dist/optimized-extractors/common/matching/types.js +18 -0
  119. package/dist/optimized-extractors/common/matching/utils.js +184 -0
  120. package/dist/optimized-extractors/common/utils.js +58 -0
  121. package/dist/optimized-extractors/export.d.js +5 -0
  122. package/dist/optimized-extractors/export.d.ts +397 -0
  123. package/dist/optimized-extractors/extractArray.js +120 -0
  124. package/dist/optimized-extractors/extractObject.js +104 -0
  125. package/dist/optimized-extractors/index.d.ts +397 -0
  126. package/dist/optimized-extractors/index.js +31 -0
  127. package/dist/optimized-extractors/listExtractionHelpers/__tests__/dynamicListExtractor.spec.js +312 -0
  128. package/dist/optimized-extractors/listExtractionHelpers/__tests__/findSetOfXpathsToCreateAnArrayExtractor.test.js +22 -0
  129. package/dist/optimized-extractors/listExtractionHelpers/__tests__/getContainerElement.test.js +21 -0
  130. package/dist/optimized-extractors/listExtractionHelpers/__tests__/partOfSameArrayXpath.test.js +42 -0
  131. package/dist/optimized-extractors/listExtractionHelpers/__tests__/verifyThatAllXpathsArePartOfSameArray.test.js +9 -0
  132. package/dist/optimized-extractors/listExtractionHelpers/dynamicListExtractor.js +152 -0
  133. package/dist/optimized-extractors/listExtractionHelpers/errors.js +46 -0
  134. package/dist/optimized-extractors/listExtractionHelpers/getListMatches.js +14 -0
  135. package/dist/optimized-extractors/listExtractionHelpers/runAiExtraction.js +240 -0
  136. package/dist/optimized-extractors/listExtractionHelpers/typesAndSchema.js +5 -0
  137. package/dist/optimized-extractors/listExtractionHelpers/utils/extractPropertiesUsingGPTFromArray.js +277 -0
  138. package/dist/optimized-extractors/listExtractionHelpers/utils/extractStructuredListUsingAi.js +44 -0
  139. package/dist/optimized-extractors/listExtractionHelpers/utils/getListContainerXpath.js +94 -0
  140. package/dist/optimized-extractors/listExtractionHelpers/utils/getRelativeContainerXpathSelector.js +20 -0
  141. package/dist/optimized-extractors/listExtractionHelpers/utils/getSimplifiedHtmlPerListItem.js +21 -0
  142. package/dist/optimized-extractors/listExtractionHelpers/utils/tablesUtils.js +48 -0
  143. package/dist/optimized-extractors/listExtractionHelpers/utils/validateOptions.js +52 -0
  144. package/dist/optimized-extractors/models/anthropicModel.js +23 -0
  145. package/dist/optimized-extractors/models/openaiModel.js +23 -0
  146. package/dist/optimized-extractors/objectExtractionHelpers/AIExtractors.js +73 -0
  147. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/checksumUtils.test.js +103 -0
  148. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromLocator.spec.js +107 -0
  149. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromPage.spec.js +107 -0
  150. package/dist/optimized-extractors/objectExtractionHelpers/calculateObjectExampleHash.js +28 -0
  151. package/dist/optimized-extractors/objectExtractionHelpers/captureSnapshot.js +26 -0
  152. package/dist/optimized-extractors/objectExtractionHelpers/checksumUtils.js +32 -0
  153. package/dist/optimized-extractors/objectExtractionHelpers/constants.js +7 -0
  154. package/dist/optimized-extractors/objectExtractionHelpers/dynamicObjectExtractor.js +106 -0
  155. package/dist/optimized-extractors/objectExtractionHelpers/errors.js +42 -0
  156. package/dist/optimized-extractors/objectExtractionHelpers/findDomMatches.js +54 -0
  157. package/dist/optimized-extractors/objectExtractionHelpers/getSimplifiedHtml.js +122 -0
  158. package/dist/optimized-extractors/objectExtractionHelpers/typesAndSchemas.js +5 -0
  159. package/dist/optimized-extractors/objectExtractionHelpers/validateDynamicObjectExtractorOptions.js +52 -0
  160. package/dist/optimized-extractors/types/aiModelsValidation.js +45 -0
  161. package/dist/optimized-extractors/types/errors.js +42 -0
  162. package/dist/optimized-extractors/types/jsonSchema.d.js +5 -0
  163. package/dist/optimized-extractors/types/jsonSchema.d.ts +50 -0
  164. package/dist/optimized-extractors/types/types.js +5 -0
  165. package/dist/optimized-extractors/validators.js +152 -0
  166. package/dist/vite-env.d.js +1 -0
  167. package/dist/vite-env.d.ts +9 -0
  168. package/docs.md +14 -0
  169. package/generated-docs/ai/functions/extractStructuredData.mdx +255 -0
  170. package/generated-docs/ai/functions/isPageLoaded.mdx +88 -0
  171. package/generated-docs/ai/interfaces/ArraySchema.mdx +36 -0
  172. package/generated-docs/ai/interfaces/BasicSchema.mdx +14 -0
  173. package/generated-docs/ai/interfaces/BooleanSchema.mdx +28 -0
  174. package/generated-docs/ai/interfaces/ImageBufferContentItem.mdx +16 -0
  175. package/generated-docs/ai/interfaces/ImageUrlContentItem.mdx +16 -0
  176. package/generated-docs/ai/interfaces/NumberSchema.mdx +35 -0
  177. package/generated-docs/ai/interfaces/ObjectSchema.mdx +39 -0
  178. package/generated-docs/ai/interfaces/StringSchema.mdx +35 -0
  179. package/generated-docs/ai/interfaces/TextContentItem.mdx +14 -0
  180. package/generated-docs/ai/type-aliases/ContentItem.mdx +12 -0
  181. package/generated-docs/ai/type-aliases/JsonSchema.mdx +47 -0
  182. package/generated-docs/ai/type-aliases/SUPPORTED_MODELS.mdx +85 -0
  183. package/generated-docs/helpers/functions/downloadFile.mdx +99 -0
  184. package/generated-docs/helpers/functions/extractMarkdown.mdx +56 -0
  185. package/generated-docs/helpers/functions/filterEmptyValues.mdx +51 -0
  186. package/generated-docs/helpers/functions/goToUrl.mdx +124 -0
  187. package/generated-docs/helpers/functions/processDate.mdx +55 -0
  188. package/generated-docs/helpers/functions/resolveUrl.mdx +165 -0
  189. package/generated-docs/helpers/functions/sanitizeHtml.mdx +113 -0
  190. package/generated-docs/helpers/functions/saveFileToS3.mdx +127 -0
  191. package/generated-docs/helpers/functions/scrollToLoadContent.mdx +89 -0
  192. package/generated-docs/helpers/functions/uploadFileToS3.mdx +121 -0
  193. package/generated-docs/helpers/functions/validateDataUsingSchema.mdx +90 -0
  194. package/generated-docs/helpers/functions/waitForDomSettled.mdx +91 -0
  195. package/generated-docs/helpers/functions/withNetworkSettledWait.mdx +76 -0
  196. package/generated-docs/helpers/interfaces/Attachment.mdx +56 -0
  197. package/generated-docs/helpers/interfaces/S3Configs.mdx +52 -0
  198. package/generated-docs/helpers/interfaces/SanitizeHtmlOptions.mdx +22 -0
  199. package/generated-docs/helpers/type-aliases/AttachmentType.mdx +10 -0
  200. package/generated-docs/helpers/type-aliases/FileType.mdx +61 -0
  201. package/generated-docs/helpers/type-aliases/Trigger.mdx +62 -0
  202. package/how-to-run-tests.md +10 -0
  203. package/intuned-runtime-setup.md +13 -0
  204. package/package.json +119 -0
  205. package/tsconfig.eslint.json +5 -0
  206. package/tsconfig.json +26 -0
@@ -0,0 +1,387 @@
1
+ "use strict";
2
+
3
+ var _extendedTest = require("./extendedTest");
4
+ var _ = require("..");
5
+ var _playwrightCore = require("playwright-core");
6
+ var _dotenv = require("dotenv");
7
+ (0, _dotenv.config)();
8
+ const basicClickHtml = `
9
+ <!DOCTYPE html>
10
+ <html>
11
+ <head>
12
+ <style>
13
+ body { margin: 0; padding: 20px; font-family: Arial; }
14
+ .item { height: 80px; margin: 10px; background: #e0e0e0; padding: 15px; border: 1px solid #999; }
15
+ #load-more { padding: 10px 20px; font-size: 16px; cursor: pointer; }
16
+ #content { margin-top: 20px; }
17
+ </style>
18
+ </head>
19
+ <body>
20
+ <button id="load-more">Load More</button>
21
+ <div id="content">
22
+ <div class="item">Item 1</div>
23
+ <div class="item">Item 2</div>
24
+ <div class="item">Item 3</div>
25
+ </div>
26
+ <script>
27
+ let itemCount = 3;
28
+ let maxItems = 10;
29
+
30
+ document.getElementById('load-more').addEventListener('click', () => {
31
+ if (itemCount >= maxItems) return;
32
+
33
+ itemCount++;
34
+ const newItem = document.createElement('div');
35
+ newItem.className = 'item';
36
+ newItem.textContent = 'Item ' + itemCount;
37
+ document.getElementById('content').appendChild(newItem);
38
+ });
39
+ </script>
40
+ </body>
41
+ </html>
42
+ `;
43
+ const buttonBecomesDisabledHtml = `
44
+ <!DOCTYPE html>
45
+ <html>
46
+ <head>
47
+ <style>
48
+ body { margin: 0; padding: 20px; font-family: Arial; }
49
+ .item { height: 80px; margin: 10px; background: #e0e0e0; padding: 15px; border: 1px solid #999; }
50
+ #load-more { padding: 10px 20px; font-size: 16px; cursor: pointer; }
51
+ #load-more:disabled { opacity: 0.5; cursor: not-allowed; }
52
+ #content { margin-top: 20px; }
53
+ </style>
54
+ </head>
55
+ <body>
56
+ <button id="load-more">Load More</button>
57
+ <div id="content">
58
+ <div class="item">Item 1</div>
59
+ </div>
60
+ <script>
61
+ let itemCount = 1;
62
+ let maxItems = 5;
63
+ const button = document.getElementById('load-more');
64
+
65
+ button.addEventListener('click', () => {
66
+ if (itemCount >= maxItems) {
67
+ button.disabled = true;
68
+ return;
69
+ }
70
+
71
+ itemCount++;
72
+ const newItem = document.createElement('div');
73
+ newItem.className = 'item';
74
+ newItem.textContent = 'Item ' + itemCount;
75
+ document.getElementById('content').appendChild(newItem);
76
+
77
+ if (itemCount >= maxItems) {
78
+ button.disabled = true;
79
+ }
80
+ });
81
+ </script>
82
+ </body>
83
+ </html>
84
+ `;
85
+ const buttonBecomesInvisibleHtml = `
86
+ <!DOCTYPE html>
87
+ <html>
88
+ <head>
89
+ <style>
90
+ body { margin: 0; padding: 20px; font-family: Arial; }
91
+ .item { height: 80px; margin: 10px; background: #e0e0e0; padding: 15px; border: 1px solid #999; }
92
+ #load-more { padding: 10px 20px; font-size: 16px; cursor: pointer; }
93
+ #content { margin-top: 20px; }
94
+ .hidden { display: none; }
95
+ </style>
96
+ </head>
97
+ <body>
98
+ <button id="load-more">Load More</button>
99
+ <div id="content">
100
+ <div class="item">Item 1</div>
101
+ </div>
102
+ <script>
103
+ let itemCount = 1;
104
+ let maxItems = 5;
105
+ const button = document.getElementById('load-more');
106
+
107
+ button.addEventListener('click', () => {
108
+ if (itemCount >= maxItems) {
109
+ button.classList.add('hidden');
110
+ return;
111
+ }
112
+
113
+ itemCount++;
114
+ const newItem = document.createElement('div');
115
+ newItem.className = 'item';
116
+ newItem.textContent = 'Item ' + itemCount;
117
+ document.getElementById('content').appendChild(newItem);
118
+
119
+ if (itemCount >= maxItems) {
120
+ button.classList.add('hidden');
121
+ }
122
+ });
123
+ </script>
124
+ </body>
125
+ </html>
126
+ `;
127
+ const containerTrackingHtml = `
128
+ <!DOCTYPE html>
129
+ <html>
130
+ <head>
131
+ <style>
132
+ body { margin: 0; padding: 20px; font-family: Arial; }
133
+ #container {
134
+ border: 2px solid #333;
135
+ padding: 10px;
136
+ min-height: 200px;
137
+ margin-top: 20px;
138
+ }
139
+ .container-item {
140
+ height: 60px;
141
+ margin: 10px;
142
+ background: #aaf;
143
+ padding: 10px;
144
+ border: 1px solid #006;
145
+ }
146
+ #load-more { padding: 10px 20px; font-size: 16px; cursor: pointer; }
147
+ </style>
148
+ </head>
149
+ <body>
150
+ <button id="load-more">Load More</button>
151
+ <div id="container">
152
+ <div class="container-item">Container Item 1</div>
153
+ <div class="container-item">Container Item 2</div>
154
+ </div>
155
+ <script>
156
+ let itemCount = 2;
157
+ let maxItems = 8;
158
+
159
+ document.getElementById('load-more').addEventListener('click', () => {
160
+ if (itemCount >= maxItems) return;
161
+
162
+ itemCount++;
163
+ const newItem = document.createElement('div');
164
+ newItem.className = 'container-item';
165
+ newItem.textContent = 'Container Item ' + itemCount;
166
+ document.getElementById('container').appendChild(newItem);
167
+ });
168
+ </script>
169
+ </body>
170
+ </html>
171
+ `;
172
+ const noChangeThresholdHtml = `
173
+ <!DOCTYPE html>
174
+ <html>
175
+ <head>
176
+ <style>
177
+ body { margin: 0; padding: 20px; font-family: Arial; }
178
+ .item { height: 80px; margin: 10px; background: #e0e0e0; padding: 15px; border: 1px solid #999; }
179
+ #load-more { padding: 10px 20px; font-size: 16px; cursor: pointer; }
180
+ #content { margin-top: 20px; }
181
+ </style>
182
+ </head>
183
+ <body>
184
+ <button id="load-more">Load More</button>
185
+ <div id="content">
186
+ <div class="item">Item 1</div>
187
+ </div>
188
+ <script>
189
+ let itemCount = 1;
190
+ let clickCount = 0;
191
+ let maxItems = 5;
192
+
193
+ document.getElementById('load-more').addEventListener('click', () => {
194
+ clickCount++;
195
+ // Only add items for first 5 clicks, then stop adding
196
+ if (clickCount <= 5 && itemCount < maxItems) {
197
+ itemCount++;
198
+ const newItem = document.createElement('div');
199
+ newItem.className = 'item';
200
+ newItem.textContent = 'Item ' + itemCount;
201
+ document.getElementById('content').appendChild(newItem);
202
+ }
203
+ // After 5 clicks, button still works but doesn't add content
204
+ });
205
+ </script>
206
+ </body>
207
+ </html>
208
+ `;
209
+ (0, _extendedTest.describe)("clickUntilExhausted E2E Tests", () => {
210
+ let browser;
211
+ let page;
212
+ (0, _extendedTest.beforeAll)(async () => {
213
+ browser = await _playwrightCore.chromium.launch({
214
+ headless: false
215
+ });
216
+ });
217
+ (0, _extendedTest.afterAll)(async () => {
218
+ await browser.close();
219
+ });
220
+ (0, _extendedTest.beforeEach)(async () => {
221
+ page = await browser.newPage();
222
+ });
223
+ (0, _extendedTest.afterEach)(async () => {
224
+ await page.close();
225
+ });
226
+ (0, _extendedTest.describe)("clickButtonAndWait", () => {
227
+ (0, _extendedTest.test)("should click button and wait for content", async () => {
228
+ await page.setContent(basicClickHtml);
229
+ const initialCount = await page.locator(".item").count();
230
+ (0, _extendedTest.expect)(initialCount).toBe(3);
231
+ const buttonLocator = page.locator("#load-more");
232
+ await (0, _.clickButtonAndWait)({
233
+ page,
234
+ buttonLocator,
235
+ clickDelay: 0.1
236
+ });
237
+ const finalCount = await page.locator(".item").count();
238
+ (0, _extendedTest.expect)(finalCount).toBe(4);
239
+ });
240
+ });
241
+ (0, _extendedTest.describe)("clickButtonUntilNoChange", () => {
242
+ (0, _extendedTest.test)("should click button until max items loaded with default parameters", async () => {
243
+ await page.setContent(basicClickHtml);
244
+ const initialCount = await page.locator(".item").count();
245
+ (0, _extendedTest.expect)(initialCount).toBe(3);
246
+ const buttonLocator = page.locator("#load-more");
247
+ await (0, _.clickButtonUntilNoChange)({
248
+ page,
249
+ buttonLocator
250
+ });
251
+ const finalCount = await page.locator(".item").count();
252
+ (0, _extendedTest.expect)(finalCount).toBe(10);
253
+ });
254
+ (0, _extendedTest.test)("should respect max_clicks parameter", async () => {
255
+ await page.setContent(basicClickHtml);
256
+ const initialCount = await page.locator(".item").count();
257
+ (0, _extendedTest.expect)(initialCount).toBe(3);
258
+ const buttonLocator = page.locator("#load-more");
259
+ await (0, _.clickButtonUntilNoChange)({
260
+ page,
261
+ buttonLocator,
262
+ maxClicks: 3,
263
+ clickDelay: 0.05
264
+ });
265
+ const finalCount = await page.locator(".item").count();
266
+ (0, _extendedTest.expect)(finalCount).toBe(6);
267
+ });
268
+ (0, _extendedTest.test)("should call heartbeat callback after each click", async () => {
269
+ await page.setContent(basicClickHtml);
270
+ const heartbeatCalls = [];
271
+ const onHeartbeat = () => {
272
+ heartbeatCalls.push(1);
273
+ };
274
+ const buttonLocator = page.locator("#load-more");
275
+ await (0, _.clickButtonUntilNoChange)({
276
+ page,
277
+ buttonLocator,
278
+ heartbeat: onHeartbeat,
279
+ maxClicks: 5,
280
+ clickDelay: 0.05
281
+ });
282
+ (0, _extendedTest.expect)(heartbeatCalls.length).toBe(5);
283
+ });
284
+ (0, _extendedTest.test)("should stop when button becomes disabled", async () => {
285
+ await page.setContent(buttonBecomesDisabledHtml);
286
+ const initialCount = await page.locator(".item").count();
287
+ (0, _extendedTest.expect)(initialCount).toBe(1);
288
+ const buttonLocator = page.locator("#load-more");
289
+ await (0, _.clickButtonUntilNoChange)({
290
+ page,
291
+ buttonLocator,
292
+ maxClicks: 20,
293
+ clickDelay: 0.05
294
+ });
295
+ const finalCount = await page.locator(".item").count();
296
+ (0, _extendedTest.expect)(finalCount).toBe(5);
297
+ const isDisabled = await page.evaluate(() => document.getElementById("load-more").disabled);
298
+ (0, _extendedTest.expect)(isDisabled).toBe(true);
299
+ });
300
+ (0, _extendedTest.test)("should stop when button becomes invisible", async () => {
301
+ await page.setContent(buttonBecomesInvisibleHtml);
302
+ const initialCount = await page.locator(".item").count();
303
+ (0, _extendedTest.expect)(initialCount).toBe(1);
304
+ const buttonLocator = page.locator("#load-more");
305
+ await (0, _.clickButtonUntilNoChange)({
306
+ page,
307
+ buttonLocator,
308
+ maxClicks: 20,
309
+ clickDelay: 0.05
310
+ });
311
+ const finalCount = await page.locator(".item").count();
312
+ (0, _extendedTest.expect)(finalCount).toBe(5);
313
+ const isVisible = await buttonLocator.isVisible();
314
+ (0, _extendedTest.expect)(isVisible).toBe(false);
315
+ });
316
+ (0, _extendedTest.test)("should track container changes", async () => {
317
+ await page.setContent(containerTrackingHtml);
318
+ const initialCount = await page.locator(".container-item").count();
319
+ (0, _extendedTest.expect)(initialCount).toBe(2);
320
+ const buttonLocator = page.locator("#load-more");
321
+ const containerLocator = page.locator("#container");
322
+ await (0, _.clickButtonUntilNoChange)({
323
+ page,
324
+ buttonLocator,
325
+ containerLocator,
326
+ maxClicks: 10,
327
+ clickDelay: 0.05
328
+ });
329
+ const finalCount = await page.locator(".container-item").count();
330
+ (0, _extendedTest.expect)(finalCount).toBe(8);
331
+ });
332
+ (0, _extendedTest.test)("should stop when content stops changing", async () => {
333
+ await page.setContent(noChangeThresholdHtml);
334
+ const initialCount = await page.locator(".item").count();
335
+ (0, _extendedTest.expect)(initialCount).toBe(1);
336
+ const buttonLocator = page.locator("#load-more");
337
+ const containerLocator = page.locator("#content");
338
+ await (0, _.clickButtonUntilNoChange)({
339
+ page,
340
+ buttonLocator,
341
+ containerLocator,
342
+ maxClicks: 20,
343
+ clickDelay: 0.05,
344
+ noChangeThreshold: 0
345
+ });
346
+ const finalCount = await page.locator(".item").count();
347
+ (0, _extendedTest.expect)(finalCount).toBe(5);
348
+ });
349
+ (0, _extendedTest.test)("should work with custom click delay", async () => {
350
+ await page.setContent(basicClickHtml);
351
+ const initialCount = await page.locator(".item").count();
352
+ (0, _extendedTest.expect)(initialCount).toBe(3);
353
+ const buttonLocator = page.locator("#load-more");
354
+ await (0, _.clickButtonUntilNoChange)({
355
+ page,
356
+ buttonLocator,
357
+ maxClicks: 3,
358
+ clickDelay: 0.2
359
+ });
360
+ const finalCount = await page.locator(".item").count();
361
+ (0, _extendedTest.expect)(finalCount).toBe(6);
362
+ });
363
+ (0, _extendedTest.test)("should work with all custom parameters combined", async () => {
364
+ await page.setContent(containerTrackingHtml);
365
+ const heartbeatCalls = [];
366
+ const onHeartbeat = () => {
367
+ heartbeatCalls.push(1);
368
+ };
369
+ const initialCount = await page.locator(".container-item").count();
370
+ (0, _extendedTest.expect)(initialCount).toBe(2);
371
+ const buttonLocator = page.locator("#load-more");
372
+ const containerLocator = page.locator("#container");
373
+ await (0, _.clickButtonUntilNoChange)({
374
+ page,
375
+ buttonLocator,
376
+ heartbeat: onHeartbeat,
377
+ containerLocator,
378
+ maxClicks: 4,
379
+ clickDelay: 0.1,
380
+ noChangeThreshold: 0
381
+ });
382
+ const finalCount = await page.locator(".container-item").count();
383
+ (0, _extendedTest.expect)(finalCount).toBe(6);
384
+ (0, _extendedTest.expect)(heartbeatCalls.length).toBe(4);
385
+ });
386
+ });
387
+ });
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+
3
+ var _extendedTest = require("./extendedTest");
4
+ var _playwrightCore = require("playwright-core");
5
+ var _fs = _interopRequireDefault(require("fs"));
6
+ var _ = require("..");
7
+ var _promises = require("fs/promises");
8
+ var _os = require("os");
9
+ var _path = require("path");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ const content = `
12
+ <!DOCTYPE html>
13
+ <html lang="en">
14
+ <head>
15
+ <meta charset="UTF-8">
16
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
17
+ <title>Test Fixture Page</title>
18
+ </head>
19
+ <body>
20
+ <h1>Test Fixture Page</h1>
21
+ <p>This is a simple HTML page used for testing purposes.</p>
22
+ <div>
23
+ <h3>Downloadable Image</h3>
24
+ <p>Image for download:</p>
25
+ <img src="https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2" alt="Sample placeholder image" width="400" height="300">
26
+ <br>
27
+ <a href="https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2" download="sample-image.png">Download Image</a>
28
+ </div>
29
+
30
+ <div>
31
+ <h3>Download normal file</h3>
32
+ <a href="https://intuned-docs-public-images.s3.amazonaws.com/32UP83A_ENG_US.pdf" download="sample-file.txt">Download Text File</a>
33
+ </div>
34
+
35
+ <div>
36
+ <h3>Large PDF Download</h3>
37
+ <a href="https://intuned-docs-public-images.s3.us-west-2.amazonaws.com/large_pdf.pdf">Download Text File</a>
38
+ </div>
39
+
40
+ </body>
41
+ </html>
42
+ `;
43
+ async function createUserDirWithPreferences() {
44
+ const tempDir = await (0, _promises.mkdtemp)((0, _path.join)((0, _os.tmpdir)(), "pw-"));
45
+ const userDir = (0, _path.join)(tempDir, "userdir");
46
+ const defaultDir = (0, _path.join)(userDir, "Default");
47
+ await (0, _promises.mkdir)(defaultDir, {
48
+ recursive: true
49
+ });
50
+ const preferences = {
51
+ plugins: {
52
+ always_open_pdf_externally: true
53
+ }
54
+ };
55
+ const preferencesPath = (0, _path.join)(defaultDir, "Preferences");
56
+ await (0, _promises.writeFile)(preferencesPath, JSON.stringify(preferences));
57
+ return (0, _path.resolve)(userDir);
58
+ }
59
+ _extendedTest.describe.skip("TestNotInGeneration", () => {
60
+ let context;
61
+ let page;
62
+ (0, _extendedTest.beforeAll)(async () => {
63
+ const dir = await createUserDirWithPreferences();
64
+ process.env.MODE = "";
65
+ context = await _playwrightCore.chromium.launchPersistentContext(dir, {
66
+ headless: false,
67
+ args: ["--no-first-run", "--disable-sync", "--disable-translate", "--disable-features=TranslateUI", "--disable-features=NetworkService", "--lang=en", "--disable-blink-features=AutomationControlled"],
68
+ acceptDownloads: true
69
+ });
70
+ });
71
+ (0, _extendedTest.afterAll)(async () => {
72
+ await context.close();
73
+ });
74
+ (0, _extendedTest.beforeEach)(async () => {
75
+ page = await context.newPage();
76
+ });
77
+ (0, _extendedTest.afterEach)(async () => {
78
+ await page.close();
79
+ });
80
+ (0, _extendedTest.test)("should not cancel download", async () => {
81
+ await page.setContent(content);
82
+ const download = await (0, _.downloadFile)({
83
+ page,
84
+ trigger: "https://intuned-docs-public-images.s3.amazonaws.com/32UP83A_ENG_US.pdf"
85
+ });
86
+ const downloadPath = await download.path();
87
+ (0, _extendedTest.expect)(download.suggestedFilename()).toBeDefined();
88
+ (0, _extendedTest.expect)(downloadPath).toBeDefined();
89
+ });
90
+ (0, _extendedTest.test)("should download image successfully", async () => {
91
+ await page.setContent(content);
92
+ const downloadedImage = await (0, _.downloadFile)({
93
+ page,
94
+ trigger: "https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2"
95
+ });
96
+ const path = await downloadedImage.path();
97
+ (0, _extendedTest.expect)(path).toBeDefined();
98
+ (0, _extendedTest.expect)(String(path)).toContain("/var/folders/");
99
+ });
100
+ (0, _extendedTest.test)("should upload image to s3", async () => {
101
+ await page.setContent(content);
102
+ const downloadedImage = await (0, _.downloadFile)({
103
+ page,
104
+ trigger: "https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2"
105
+ });
106
+ (0, _extendedTest.expect)(downloadedImage).toBeDefined();
107
+ const path = await downloadedImage.path();
108
+ (0, _extendedTest.expect)(_fs.default.existsSync(path)).toBe(true);
109
+ const uploadedFile = await (0, _.uploadFileToS3)({
110
+ file: downloadedImage,
111
+ configs: {
112
+ bucket: process.env.INTUNED_S3_BUCKET,
113
+ region: process.env.INTUNED_S3_REGION,
114
+ accessKeyId: process.env.INTUNED_S3_ACCESS_KEY_ID,
115
+ secretAccessKey: process.env.INTUNED_S3_SECRET_ACCESS_KEY,
116
+ endpoint: process.env.INTUNED_S3_ENDPOINT_URL
117
+ }
118
+ });
119
+ (0, _extendedTest.expect)(_fs.default.existsSync(path)).toBe(false);
120
+ (0, _extendedTest.expect)(uploadedFile.suggestedFileName).toBeDefined();
121
+ (0, _extendedTest.expect)(uploadedFile.bucket).toBe(process.env.INTUNED_S3_BUCKET);
122
+ });
123
+ (0, _extendedTest.test)("should upload file to s3", async () => {
124
+ await page.setContent(content);
125
+ const download = await (0, _.downloadFile)({
126
+ page,
127
+ trigger: "https://intuned-docs-public-images.s3.amazonaws.com/32UP83A_ENG_US.pdf"
128
+ });
129
+ _extendedTest.expect;
130
+ const uploadedFile = await (0, _.uploadFileToS3)({
131
+ file: download
132
+ });
133
+ (0, _extendedTest.expect)(uploadedFile.suggestedFileName).toBeDefined();
134
+ (0, _extendedTest.expect)(uploadedFile.bucket).toBe(process.env.INTUNED_S3_BUCKET);
135
+ });
136
+ });
137
+ (0, _extendedTest.describe)("TestInGeneration", () => {
138
+ let context;
139
+ let page;
140
+ (0, _extendedTest.beforeAll)(async () => {
141
+ process.env.MODE = "generate_code";
142
+ const dir = await createUserDirWithPreferences();
143
+ context = await _playwrightCore.chromium.launchPersistentContext(dir, {
144
+ headless: false,
145
+ userAgent: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
146
+ args: ["--no-first-run", "--disable-sync", "--disable-translate", "--disable-features=TranslateUI", "--disable-features=NetworkService", "--lang=en", "--disable-blink-features=AutomationControlled"],
147
+ acceptDownloads: true
148
+ });
149
+ });
150
+ (0, _extendedTest.afterAll)(async () => {
151
+ await context.close();
152
+ });
153
+ (0, _extendedTest.beforeEach)(async () => {
154
+ page = await context.newPage();
155
+ });
156
+ (0, _extendedTest.afterEach)(async () => {
157
+ await page.close();
158
+ });
159
+ (0, _extendedTest.test)("should cancel download", async () => {
160
+ await page.setContent(content);
161
+ const largePdfLocator = page.locator("xpath=//a[contains(@href, 'large_pdf.pdf')]");
162
+ const downloadedFile = await (0, _.downloadFile)({
163
+ page,
164
+ trigger: largePdfLocator
165
+ });
166
+ await (0, _extendedTest.expect)(async () => {
167
+ await downloadedFile.path();
168
+ }).rejects.toThrow(/canceled/);
169
+ });
170
+ (0, _extendedTest.test)("should download image successfully", async () => {
171
+ await page.setContent(content);
172
+ const downloadedImage = await (0, _.downloadFile)({
173
+ page,
174
+ trigger: "https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2"
175
+ });
176
+ const cancelled = await downloadedImage.failure();
177
+ (0, _extendedTest.expect)(cancelled).toContain("canceled");
178
+ });
179
+ (0, _extendedTest.test)("should upload image to s3", async () => {
180
+ process.env.S3_BUCKET = "mock-bucket";
181
+ process.env.S3_REGION = "mock-region";
182
+ await page.setContent(content);
183
+ const downloadedImage = await (0, _.downloadFile)({
184
+ page,
185
+ trigger: "https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2"
186
+ });
187
+ (0, _extendedTest.expect)(downloadedImage.path).toBeDefined();
188
+ });
189
+ (0, _extendedTest.test)("should upload file to s3", async () => {
190
+ await page.setContent(content);
191
+ const download = await (0, _.downloadFile)({
192
+ page,
193
+ trigger: "https://intuned-docs-public-images.s3.amazonaws.com/32UP83A_ENG_US.pdf"
194
+ });
195
+ (0, _extendedTest.expect)(download).toBeDefined();
196
+ (0, _extendedTest.expect)(typeof download.suggestedFilename).toBe("function");
197
+ (0, _extendedTest.expect)(typeof download.path).toBe("function");
198
+ const uploadedFile = await (0, _.uploadFileToS3)({
199
+ file: download
200
+ });
201
+ (0, _extendedTest.expect)(uploadedFile.bucket).toBe("testing_bucket");
202
+ (0, _extendedTest.expect)(uploadedFile.region).toBe("testing_region");
203
+ });
204
+ });