@oracle/oraclejet-webdriver 16.1.6 → 17.0.1

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 (249) hide show
  1. package/elements/OjWebElement.js +2 -26
  2. package/elements/OjWebElement.js.map +1 -1
  3. package/elements/OjWebElement.ts +6 -40
  4. package/elements/oj-chart/OjChartBase.ts +8 -0
  5. package/elements/oj-checkboxset/OjCheckboxset.js +11 -12
  6. package/elements/oj-checkboxset/OjCheckboxset.js.map +1 -1
  7. package/elements/oj-checkboxset/OjCheckboxset.ts +14 -14
  8. package/elements/oj-combobox-many/OjComboboxMany.js +11 -20
  9. package/elements/oj-combobox-many/OjComboboxMany.js.map +1 -1
  10. package/elements/oj-combobox-many/OjComboboxMany.ts +14 -22
  11. package/elements/oj-combobox-one/OjComboboxOne.js +9 -18
  12. package/elements/oj-combobox-one/OjComboboxOne.js.map +1 -1
  13. package/elements/oj-combobox-one/OjComboboxOne.ts +12 -20
  14. package/elements/oj-data-grid/OjDataGridBase.ts +24 -0
  15. package/elements/oj-date-picker/OjDatePickerBase.js +20 -20
  16. package/elements/oj-date-picker/OjDatePickerBase.ts +53 -20
  17. package/elements/oj-date-time-picker/OjDateTimePickerBase.js +16 -16
  18. package/elements/oj-date-time-picker/OjDateTimePickerBase.ts +48 -16
  19. package/elements/oj-diagram/OjDiagramBase.ts +4 -0
  20. package/elements/oj-file-picker/OjFilePicker.js +90 -24
  21. package/elements/oj-file-picker/OjFilePicker.js.map +1 -1
  22. package/elements/oj-file-picker/OjFilePicker.ts +101 -27
  23. package/elements/oj-input-date/OjInputDateBase.js +7 -7
  24. package/elements/oj-input-date/OjInputDateBase.ts +37 -7
  25. package/elements/oj-input-date-time/OjInputDateTimeBase.js +7 -7
  26. package/elements/oj-input-date-time/OjInputDateTimeBase.ts +37 -7
  27. package/elements/oj-list-view/OjListView.js +6 -6
  28. package/elements/oj-list-view/OjListView.js.map +1 -1
  29. package/elements/oj-list-view/OjListView.ts +9 -8
  30. package/elements/oj-navigation-list/OjNavigationList.js +8 -10
  31. package/elements/oj-navigation-list/OjNavigationList.js.map +1 -1
  32. package/elements/oj-navigation-list/OjNavigationList.ts +11 -12
  33. package/elements/oj-navigation-list/OjNavigationListBase.js +2 -2
  34. package/elements/oj-navigation-list/OjNavigationListBase.ts +3 -2
  35. package/elements/oj-popup/OjPopupBase.js +1 -1
  36. package/elements/oj-popup/OjPopupBase.ts +1 -1
  37. package/elements/oj-row-expander/OjRowExpanderBase.ts +4 -0
  38. package/elements/oj-select-many/OjSelectMany.js +11 -20
  39. package/elements/oj-select-many/OjSelectMany.js.map +1 -1
  40. package/elements/oj-select-many/OjSelectMany.ts +14 -22
  41. package/elements/oj-select-one/OjSelectOne.js +9 -17
  42. package/elements/oj-select-one/OjSelectOne.js.map +1 -1
  43. package/elements/oj-select-one/OjSelectOne.ts +12 -19
  44. package/elements/oj-select-single/OjSelectSingle.js +7 -14
  45. package/elements/oj-select-single/OjSelectSingle.js.map +1 -1
  46. package/elements/oj-select-single/OjSelectSingle.ts +10 -16
  47. package/elements/oj-stream-list/OjStreamList.js +28 -33
  48. package/elements/oj-stream-list/OjStreamList.js.map +1 -1
  49. package/elements/oj-stream-list/OjStreamList.ts +28 -34
  50. package/elements/oj-sunburst/OjSunburstBase.ts +8 -0
  51. package/elements/oj-swipe-actions/OjSwipeActions.js +7 -10
  52. package/elements/oj-swipe-actions/OjSwipeActions.js.map +1 -1
  53. package/elements/oj-swipe-actions/OjSwipeActions.ts +11 -15
  54. package/elements/oj-tab-bar/OjTabBarBase.ts +1 -0
  55. package/elements/oj-table/OjTable.js +100 -81
  56. package/elements/oj-table/OjTable.js.map +1 -1
  57. package/elements/oj-table/OjTable.ts +146 -97
  58. package/elements/oj-table/OjTableBase.js +9 -0
  59. package/elements/oj-table/OjTableBase.js.map +1 -1
  60. package/elements/oj-table/OjTableBase.ts +10 -0
  61. package/elements/oj-tree-view/OjTreeView.js +25 -29
  62. package/elements/oj-tree-view/OjTreeView.js.map +1 -1
  63. package/elements/oj-tree-view/OjTreeView.ts +34 -35
  64. package/elements/oj-treemap/OjTreemapBase.ts +8 -0
  65. package/index.js +28 -139
  66. package/index.js.map +1 -1
  67. package/index.ts +29 -151
  68. package/lib/busy-context-utils.js +28 -46
  69. package/lib/busy-context-utils.js.map +1 -1
  70. package/lib/busy-context-utils.ts +39 -48
  71. package/lib/dataprovider-utils.js +24 -28
  72. package/lib/dataprovider-utils.js.map +1 -1
  73. package/lib/dataprovider-utils.ts +28 -31
  74. package/lib/no-require-jet.js +12 -0
  75. package/lib/no-require-jet.js.map +1 -0
  76. package/lib/no-require-jet.ts +8 -0
  77. package/lib/oj-module-proxy.js +113 -0
  78. package/lib/oj-module-proxy.js.map +1 -0
  79. package/lib/oj-module-proxy.ts +123 -0
  80. package/lib/viewmodel-utils.js +99 -0
  81. package/lib/viewmodel-utils.js.map +1 -0
  82. package/lib/viewmodel-utils.ts +107 -0
  83. package/package.json +6 -6
  84. package/tsconfig.json +2 -1
  85. package/wdtsdoc/assets/navigation.js +1 -1
  86. package/wdtsdoc/assets/search.js +1 -1
  87. package/wdtsdoc/classes/elements.OjAccordion.html +2 -2
  88. package/wdtsdoc/classes/elements.OjActionCard.html +2 -2
  89. package/wdtsdoc/classes/elements.OjButton.html +2 -2
  90. package/wdtsdoc/classes/elements.OjButtonsetMany.html +2 -2
  91. package/wdtsdoc/classes/elements.OjButtonsetOne.html +2 -2
  92. package/wdtsdoc/classes/elements.OjChart.html +2 -2
  93. package/wdtsdoc/classes/elements.OjCheckboxset.html +2 -2
  94. package/wdtsdoc/classes/elements.OjCollapsible.html +2 -2
  95. package/wdtsdoc/classes/elements.OjColorPalette.html +2 -2
  96. package/wdtsdoc/classes/elements.OjColorSpectrum.html +2 -2
  97. package/wdtsdoc/classes/elements.OjComboboxMany.html +2 -2
  98. package/wdtsdoc/classes/elements.OjComboboxOne.html +2 -2
  99. package/wdtsdoc/classes/elements.OjConveyorBelt.html +2 -2
  100. package/wdtsdoc/classes/elements.OjDataGrid.html +2 -2
  101. package/wdtsdoc/classes/elements.OjDatePicker.html +67 -49
  102. package/wdtsdoc/classes/elements.OjDateTimePicker.html +57 -42
  103. package/wdtsdoc/classes/elements.OjDiagram.html +2 -2
  104. package/wdtsdoc/classes/elements.OjDialog.html +2 -2
  105. package/wdtsdoc/classes/elements.OjDrawerLayout.html +2 -2
  106. package/wdtsdoc/classes/elements.OjDrawerPopup.html +2 -2
  107. package/wdtsdoc/classes/elements.OjFilePicker.html +11 -2
  108. package/wdtsdoc/classes/elements.OjFilmStrip.html +2 -2
  109. package/wdtsdoc/classes/elements.OjGantt.html +2 -2
  110. package/wdtsdoc/classes/elements.OjIndexer.html +2 -2
  111. package/wdtsdoc/classes/elements.OjInputDate.html +28 -21
  112. package/wdtsdoc/classes/elements.OjInputDateTime.html +28 -21
  113. package/wdtsdoc/classes/elements.OjInputNumber.html +2 -2
  114. package/wdtsdoc/classes/elements.OjInputPassword.html +2 -2
  115. package/wdtsdoc/classes/elements.OjInputSearch.html +2 -2
  116. package/wdtsdoc/classes/elements.OjInputText.html +2 -2
  117. package/wdtsdoc/classes/elements.OjInputTime.html +2 -2
  118. package/wdtsdoc/classes/elements.OjLabel.html +2 -2
  119. package/wdtsdoc/classes/elements.OjLedGauge.html +2 -2
  120. package/wdtsdoc/classes/elements.OjLegend.html +2 -2
  121. package/wdtsdoc/classes/elements.OjListView.html +4 -4
  122. package/wdtsdoc/classes/elements.OjMasonryLayout.html +2 -2
  123. package/wdtsdoc/classes/elements.OjMenu.html +2 -2
  124. package/wdtsdoc/classes/elements.OjMenuButton.html +2 -2
  125. package/wdtsdoc/classes/elements.OjMessage.html +2 -2
  126. package/wdtsdoc/classes/elements.OjMessageBanner.html +2 -2
  127. package/wdtsdoc/classes/elements.OjNBox.html +2 -2
  128. package/wdtsdoc/classes/elements.OjNavigationList.html +14 -12
  129. package/wdtsdoc/classes/elements.OjPagingControl.html +2 -2
  130. package/wdtsdoc/classes/elements.OjPictoChart.html +2 -2
  131. package/wdtsdoc/classes/elements.OjPopup.html +6 -5
  132. package/wdtsdoc/classes/elements.OjProgress.html +2 -2
  133. package/wdtsdoc/classes/elements.OjProgressList.html +2 -2
  134. package/wdtsdoc/classes/elements.OjRadioset.html +2 -2
  135. package/wdtsdoc/classes/elements.OjRatingGauge.html +2 -2
  136. package/wdtsdoc/classes/elements.OjRefresher.html +2 -2
  137. package/wdtsdoc/classes/elements.OjRowExpander.html +2 -2
  138. package/wdtsdoc/classes/elements.OjSelectMany.html +2 -2
  139. package/wdtsdoc/classes/elements.OjSelectOne.html +2 -2
  140. package/wdtsdoc/classes/elements.OjSelectSingle.html +2 -2
  141. package/wdtsdoc/classes/elements.OjSelector.html +2 -2
  142. package/wdtsdoc/classes/elements.OjSlider.html +2 -2
  143. package/wdtsdoc/classes/elements.OjSparkChart.html +2 -2
  144. package/wdtsdoc/classes/elements.OjStatusMeterGauge.html +2 -2
  145. package/wdtsdoc/classes/elements.OjStreamList.html +2 -2
  146. package/wdtsdoc/classes/elements.OjSunburst.html +2 -2
  147. package/wdtsdoc/classes/elements.OjSwipeActions.html +2 -2
  148. package/wdtsdoc/classes/elements.OjSwitch.html +2 -2
  149. package/wdtsdoc/classes/elements.OjTabBar.html +2 -2
  150. package/wdtsdoc/classes/elements.OjTable.html +27 -9
  151. package/wdtsdoc/classes/elements.OjTagCloud.html +2 -2
  152. package/wdtsdoc/classes/elements.OjTextArea.html +2 -2
  153. package/wdtsdoc/classes/elements.OjThematicMap.html +2 -2
  154. package/wdtsdoc/classes/elements.OjTimeAxis.html +2 -2
  155. package/wdtsdoc/classes/elements.OjTimeline.html +2 -2
  156. package/wdtsdoc/classes/elements.OjTrain.html +2 -2
  157. package/wdtsdoc/classes/elements.OjTreeView.html +5 -5
  158. package/wdtsdoc/classes/elements.OjTreemap.html +2 -2
  159. package/wdtsdoc/classes/elements.OjWaterfallLayout.html +2 -2
  160. package/wdtsdoc/classes/elements.OjWebElement.html +2 -2
  161. package/wdtsdoc/classes/index.DriverManager.html +2 -2
  162. package/wdtsdoc/classes/index.Expectation.html +2 -2
  163. package/wdtsdoc/functions/elements.ojAccordion-1.html +2 -2
  164. package/wdtsdoc/functions/elements.ojActionCard-1.html +2 -2
  165. package/wdtsdoc/functions/elements.ojButton-1.html +2 -2
  166. package/wdtsdoc/functions/elements.ojButtonsetMany-1.html +2 -2
  167. package/wdtsdoc/functions/elements.ojButtonsetOne-1.html +2 -2
  168. package/wdtsdoc/functions/elements.ojChart-1.html +2 -2
  169. package/wdtsdoc/functions/elements.ojCheckboxset-1.html +2 -2
  170. package/wdtsdoc/functions/elements.ojCollapsible-1.html +2 -2
  171. package/wdtsdoc/functions/elements.ojColorPalette-1.html +2 -2
  172. package/wdtsdoc/functions/elements.ojColorSpectrum-1.html +2 -2
  173. package/wdtsdoc/functions/elements.ojComboboxMany-1.html +2 -2
  174. package/wdtsdoc/functions/elements.ojComboboxOne-1.html +2 -2
  175. package/wdtsdoc/functions/elements.ojConveyorBelt-1.html +2 -2
  176. package/wdtsdoc/functions/elements.ojDataGrid-1.html +2 -2
  177. package/wdtsdoc/functions/elements.ojDatePicker-1.html +2 -2
  178. package/wdtsdoc/functions/elements.ojDateTimePicker-1.html +2 -2
  179. package/wdtsdoc/functions/elements.ojDiagram-1.html +2 -2
  180. package/wdtsdoc/functions/elements.ojDialog-1.html +2 -2
  181. package/wdtsdoc/functions/elements.ojDrawerLayout-1.html +2 -2
  182. package/wdtsdoc/functions/elements.ojDrawerPopup-1.html +2 -2
  183. package/wdtsdoc/functions/elements.ojFilePicker-1.html +2 -2
  184. package/wdtsdoc/functions/elements.ojFilmStrip-1.html +2 -2
  185. package/wdtsdoc/functions/elements.ojGantt-1.html +2 -2
  186. package/wdtsdoc/functions/elements.ojIndexer-1.html +2 -2
  187. package/wdtsdoc/functions/elements.ojInputDate-1.html +2 -2
  188. package/wdtsdoc/functions/elements.ojInputDateTime-1.html +2 -2
  189. package/wdtsdoc/functions/elements.ojInputNumber-1.html +2 -2
  190. package/wdtsdoc/functions/elements.ojInputPassword-1.html +2 -2
  191. package/wdtsdoc/functions/elements.ojInputSearch-1.html +2 -2
  192. package/wdtsdoc/functions/elements.ojInputText-1.html +2 -2
  193. package/wdtsdoc/functions/elements.ojInputTime-1.html +2 -2
  194. package/wdtsdoc/functions/elements.ojLabel-1.html +2 -2
  195. package/wdtsdoc/functions/elements.ojLedGauge-1.html +2 -2
  196. package/wdtsdoc/functions/elements.ojLegend-1.html +2 -2
  197. package/wdtsdoc/functions/elements.ojListView-1.html +2 -2
  198. package/wdtsdoc/functions/elements.ojMasonryLayout-1.html +2 -2
  199. package/wdtsdoc/functions/elements.ojMenu-1.html +2 -2
  200. package/wdtsdoc/functions/elements.ojMenuButton-1.html +2 -2
  201. package/wdtsdoc/functions/elements.ojMessage-1.html +2 -2
  202. package/wdtsdoc/functions/elements.ojMessageBanner-1.html +2 -2
  203. package/wdtsdoc/functions/elements.ojNBox-1.html +2 -2
  204. package/wdtsdoc/functions/elements.ojNavigationList-1.html +2 -2
  205. package/wdtsdoc/functions/elements.ojPagingControl-1.html +2 -2
  206. package/wdtsdoc/functions/elements.ojPictoChart-1.html +2 -2
  207. package/wdtsdoc/functions/elements.ojPopup-1.html +2 -2
  208. package/wdtsdoc/functions/elements.ojProgress-1.html +2 -2
  209. package/wdtsdoc/functions/elements.ojProgressList-1.html +2 -2
  210. package/wdtsdoc/functions/elements.ojRadioset-1.html +2 -2
  211. package/wdtsdoc/functions/elements.ojRatingGauge-1.html +2 -2
  212. package/wdtsdoc/functions/elements.ojRefresher-1.html +2 -2
  213. package/wdtsdoc/functions/elements.ojRowExpander-1.html +2 -2
  214. package/wdtsdoc/functions/elements.ojSelectMany-1.html +2 -2
  215. package/wdtsdoc/functions/elements.ojSelectOne-1.html +2 -2
  216. package/wdtsdoc/functions/elements.ojSelectSingle-1.html +2 -2
  217. package/wdtsdoc/functions/elements.ojSelector-1.html +2 -2
  218. package/wdtsdoc/functions/elements.ojSlider-1.html +2 -2
  219. package/wdtsdoc/functions/elements.ojSparkChart-1.html +2 -2
  220. package/wdtsdoc/functions/elements.ojStatusMeterGauge-1.html +2 -2
  221. package/wdtsdoc/functions/elements.ojStreamList-1.html +2 -2
  222. package/wdtsdoc/functions/elements.ojSunburst-1.html +2 -2
  223. package/wdtsdoc/functions/elements.ojSwipeActions-1.html +2 -2
  224. package/wdtsdoc/functions/elements.ojSwitch-1.html +2 -2
  225. package/wdtsdoc/functions/elements.ojTabBar-1.html +2 -2
  226. package/wdtsdoc/functions/elements.ojTable-1.html +2 -2
  227. package/wdtsdoc/functions/elements.ojTagCloud-1.html +2 -2
  228. package/wdtsdoc/functions/elements.ojTextArea-1.html +2 -2
  229. package/wdtsdoc/functions/elements.ojThematicMap-1.html +2 -2
  230. package/wdtsdoc/functions/elements.ojTimeAxis-1.html +2 -2
  231. package/wdtsdoc/functions/elements.ojTimeline-1.html +2 -2
  232. package/wdtsdoc/functions/elements.ojTrain-1.html +2 -2
  233. package/wdtsdoc/functions/elements.ojTreeView-1.html +2 -2
  234. package/wdtsdoc/functions/elements.ojTreemap-1.html +2 -2
  235. package/wdtsdoc/functions/elements.ojWaterfallLayout-1.html +2 -2
  236. package/wdtsdoc/functions/elements.ojWebElement-1.html +2 -2
  237. package/wdtsdoc/functions/index.ScreenshotManager.create.html +2 -2
  238. package/wdtsdoc/functions/index.ScreenshotManager.get.html +2 -2
  239. package/wdtsdoc/functions/index.ScreenshotManager.set.html +2 -2
  240. package/wdtsdoc/functions/index.fetchKeyByFilter.html +2 -2
  241. package/wdtsdoc/functions/index.register.html +2 -2
  242. package/wdtsdoc/functions/index.slotProxy-1.html +2 -2
  243. package/wdtsdoc/index.html +2 -2
  244. package/wdtsdoc/interfaces/index.DriverLike.html +2 -2
  245. package/wdtsdoc/interfaces/index.SlotProxy.html +2 -2
  246. package/wdtsdoc/modules/elements.html +2 -2
  247. package/wdtsdoc/modules/index.ScreenshotManager.html +2 -2
  248. package/wdtsdoc/modules/index.html +2 -2
  249. package/wdtsdoc/variables/index.default.html +7 -4
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeWithModules = exports.TEST_OBJ_NAME = void 0;
4
+ const selenium_webdriver_1 = require("selenium-webdriver");
5
+ const no_require_jet_1 = require("./no-require-jet");
6
+ exports.TEST_OBJ_NAME = '__ojwebdrivertest_proxy';
7
+ let _BROWSER_NAME;
8
+ /**
9
+ * Run a remote script on the browser utilizing the requested modules. If JET runtime modules are
10
+ * needed, test adapters should only use this script to access them. Never do direct imports/requires
11
+ * in remote scripts.
12
+ *
13
+ * Only modules made available by ojs/ojwebdrivertest-proxy may be used.
14
+ *
15
+ * @param {WebDriver} driver
16
+ * @param {string[]} moduleNames An array of strings of the modules to be made available
17
+ * @param {any[]} scriptArgs An array of arguments to pass to the script. Pass blank array if no args
18
+ * @param {string} script The script to be executed. The script should define a function that takes the
19
+ * arguments containg: each requested module as separate parameters, and each script argument as
20
+ * separate parameters after the modules.
21
+ * @return {Promise<T>} Anything returned from the script
22
+ * @template T
23
+ */
24
+ async function executeWithModules(driver, moduleNames, scriptArgs = [], script) {
25
+ const testProxyScript = getTestProxyScript();
26
+ const hasProxy = !(await driver.executeAsyncScript(testProxyScript));
27
+ if (!hasProxy) {
28
+ throw new Error('executeWithModules called on a non-JET page');
29
+ }
30
+ if (!_BROWSER_NAME) {
31
+ const caps = await driver.getCapabilities();
32
+ _BROWSER_NAME = caps.get(selenium_webdriver_1.Capability.BROWSER_NAME);
33
+ }
34
+ if (_BROWSER_NAME === selenium_webdriver_1.Browser.FIREFOX) {
35
+ return _executeWithModulesFirefox(driver, moduleNames, scriptArgs, script);
36
+ }
37
+ const s = `
38
+ const args = Array.from(arguments);
39
+
40
+ console.log('${exports.TEST_OBJ_NAME} importing modules ${moduleNames}');
41
+ return ${exports.TEST_OBJ_NAME}.getProxy(...${JSON.stringify(moduleNames)}).then((modules) => {
42
+ console.log('${exports.TEST_OBJ_NAME} running script');
43
+ return (${script})(...modules.concat(args));
44
+ })
45
+ `;
46
+ return driver.executeScript(s, ...scriptArgs);
47
+ }
48
+ exports.executeWithModules = executeWithModules;
49
+ /**
50
+ * Workaround https://github.com/mozilla/geckodriver/issues/1701 where properties defined via a getter are not returned
51
+ * a) via executeAsyncScript
52
+ * b) via a Promise returned from executeScript
53
+ *
54
+ * @param driver
55
+ * @param moduleNames
56
+ * @param scriptArgs
57
+ * @param script
58
+ * @returns
59
+ */
60
+ async function _executeWithModulesFirefox(driver, moduleNames, scriptArgs = [], script) {
61
+ const s1 = `
62
+ console.log('${exports.TEST_OBJ_NAME} importing modules ${moduleNames}');
63
+ // We don't actually need the returned module values here, we just want to
64
+ // trigger the imports. Throw away the return values so that we don't run
65
+ // into problems trying to encode them
66
+ return ${exports.TEST_OBJ_NAME}.getProxy(...${JSON.stringify(moduleNames)}).then(() => {});
67
+ `;
68
+ await driver.executeScript(s1);
69
+ const s2 = `
70
+ const args = Array.from(arguments);
71
+ const modules = ${exports.TEST_OBJ_NAME}.getCachedModules(...${JSON.stringify(moduleNames)});
72
+ console.log('${exports.TEST_OBJ_NAME} running script');
73
+ return (${script})(...modules.concat(args));
74
+ `;
75
+ return driver.executeScript(s2, ...scriptArgs);
76
+ }
77
+ function getTestProxyScript() {
78
+ if ((0, no_require_jet_1.isNoRequireJet)()) {
79
+ return `
80
+ const done = arguments[0];
81
+ (function pollForProxy() {
82
+ if ('${exports.TEST_OBJ_NAME}' in window) {
83
+ done();
84
+ }
85
+ setTimeout(pollForProxy, 100);
86
+ })();
87
+ `;
88
+ }
89
+ else {
90
+ return `
91
+ const done = arguments[0];
92
+ function success() {
93
+ done();
94
+ }
95
+ function failure() {
96
+ done('Unable to load ojs/ojcore-base via RequireJS');
97
+ }
98
+ if (typeof require === 'function') {
99
+ // Try sync require first
100
+ try {
101
+ require('ojs/ojcore-base');
102
+ success();
103
+ } catch (ex) {
104
+ require(['ojs/ojcore-base'], success, failure);
105
+ return;
106
+ }
107
+ } else {
108
+ failure();
109
+ }
110
+ `;
111
+ }
112
+ }
113
+ //# sourceMappingURL=oj-module-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oj-module-proxy.js","sourceRoot":"","sources":["../../lib/oj-module-proxy.ts"],"names":[],"mappings":";;;AAAA,2DAAoE;AACpE,qDAAkD;AAErC,QAAA,aAAa,GAAG,yBAAyB,CAAC;AAEvD,IAAI,aAAqB,CAAC;AAE1B;;;;;;;;;;;;;;;GAeG;AACI,KAAK,UAAU,kBAAkB,CACtC,MAAiB,EACjB,WAAqB,EACrB,aAAoB,EAAE,EACtB,MAAc;IAEd,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5C,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,+BAAU,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,aAAa,KAAK,4BAAO,CAAC,OAAO,EAAE,CAAC;QACtC,OAAO,0BAA0B,CAAI,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,GAAG;;;mBAGO,qBAAa,sBAAsB,WAAW;aACpD,qBAAa,gBAAgB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;qBAChD,qBAAa;gBAClB,MAAM;;GAEnB,CAAC;IACF,OAAO,MAAM,CAAC,aAAa,CAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;AACnD,CAAC;AA7BD,gDA6BC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,0BAA0B,CACvC,MAAiB,EACjB,WAAqB,EACrB,aAAoB,EAAE,EACtB,MAAc;IAEd,MAAM,EAAE,GAAG;mBACM,qBAAa,sBAAsB,WAAW;;;;aAIpD,qBAAa,gBAAgB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;GAClE,CAAC;IACF,MAAM,MAAM,CAAC,aAAa,CAAI,EAAE,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG;;sBAES,qBAAa,wBAAwB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;mBACnE,qBAAa;cAClB,MAAM;GACjB,CAAC;IACF,OAAO,MAAM,CAAC,aAAa,CAAI,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,IAAA,+BAAc,GAAE,EAAE,CAAC;QACrB,OAAO;;;eAGI,qBAAa;;;;;KAKvB,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO;;;;;;;;;;;;;;;;;;;;KAoBN,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { Browser, Capability, WebDriver } from 'selenium-webdriver';
2
+ import { isNoRequireJet } from './no-require-jet';
3
+
4
+ export const TEST_OBJ_NAME = '__ojwebdrivertest_proxy';
5
+
6
+ let _BROWSER_NAME: string;
7
+
8
+ /**
9
+ * Run a remote script on the browser utilizing the requested modules. If JET runtime modules are
10
+ * needed, test adapters should only use this script to access them. Never do direct imports/requires
11
+ * in remote scripts.
12
+ *
13
+ * Only modules made available by ojs/ojwebdrivertest-proxy may be used.
14
+ *
15
+ * @param {WebDriver} driver
16
+ * @param {string[]} moduleNames An array of strings of the modules to be made available
17
+ * @param {any[]} scriptArgs An array of arguments to pass to the script. Pass blank array if no args
18
+ * @param {string} script The script to be executed. The script should define a function that takes the
19
+ * arguments containg: each requested module as separate parameters, and each script argument as
20
+ * separate parameters after the modules.
21
+ * @return {Promise<T>} Anything returned from the script
22
+ * @template T
23
+ */
24
+ export async function executeWithModules<T>(
25
+ driver: WebDriver,
26
+ moduleNames: string[],
27
+ scriptArgs: any[] = [],
28
+ script: string
29
+ ) {
30
+ const testProxyScript = getTestProxyScript();
31
+ const hasProxy = !(await driver.executeAsyncScript(testProxyScript));
32
+ if (!hasProxy) {
33
+ throw new Error('executeWithModules called on a non-JET page');
34
+ }
35
+ if (!_BROWSER_NAME) {
36
+ const caps = await driver.getCapabilities();
37
+ _BROWSER_NAME = caps.get(Capability.BROWSER_NAME);
38
+ }
39
+ if (_BROWSER_NAME === Browser.FIREFOX) {
40
+ return _executeWithModulesFirefox<T>(driver, moduleNames, scriptArgs, script);
41
+ }
42
+
43
+ const s = `
44
+ const args = Array.from(arguments);
45
+
46
+ console.log('${TEST_OBJ_NAME} importing modules ${moduleNames}');
47
+ return ${TEST_OBJ_NAME}.getProxy(...${JSON.stringify(moduleNames)}).then((modules) => {
48
+ console.log('${TEST_OBJ_NAME} running script');
49
+ return (${script})(...modules.concat(args));
50
+ })
51
+ `;
52
+ return driver.executeScript<T>(s, ...scriptArgs);
53
+ }
54
+
55
+ /**
56
+ * Workaround https://github.com/mozilla/geckodriver/issues/1701 where properties defined via a getter are not returned
57
+ * a) via executeAsyncScript
58
+ * b) via a Promise returned from executeScript
59
+ *
60
+ * @param driver
61
+ * @param moduleNames
62
+ * @param scriptArgs
63
+ * @param script
64
+ * @returns
65
+ */
66
+ async function _executeWithModulesFirefox<T>(
67
+ driver: WebDriver,
68
+ moduleNames: string[],
69
+ scriptArgs: any[] = [],
70
+ script: string
71
+ ) {
72
+ const s1 = `
73
+ console.log('${TEST_OBJ_NAME} importing modules ${moduleNames}');
74
+ // We don't actually need the returned module values here, we just want to
75
+ // trigger the imports. Throw away the return values so that we don't run
76
+ // into problems trying to encode them
77
+ return ${TEST_OBJ_NAME}.getProxy(...${JSON.stringify(moduleNames)}).then(() => {});
78
+ `;
79
+ await driver.executeScript<T>(s1);
80
+ const s2 = `
81
+ const args = Array.from(arguments);
82
+ const modules = ${TEST_OBJ_NAME}.getCachedModules(...${JSON.stringify(moduleNames)});
83
+ console.log('${TEST_OBJ_NAME} running script');
84
+ return (${script})(...modules.concat(args));
85
+ `;
86
+ return driver.executeScript<T>(s2, ...scriptArgs);
87
+ }
88
+
89
+ function getTestProxyScript() {
90
+ if (isNoRequireJet()) {
91
+ return `
92
+ const done = arguments[0];
93
+ (function pollForProxy() {
94
+ if ('${TEST_OBJ_NAME}' in window) {
95
+ done();
96
+ }
97
+ setTimeout(pollForProxy, 100);
98
+ })();
99
+ `;
100
+ } else {
101
+ return `
102
+ const done = arguments[0];
103
+ function success() {
104
+ done();
105
+ }
106
+ function failure() {
107
+ done('Unable to load ojs/ojcore-base via RequireJS');
108
+ }
109
+ if (typeof require === 'function') {
110
+ // Try sync require first
111
+ try {
112
+ require('ojs/ojcore-base');
113
+ success();
114
+ } catch (ex) {
115
+ require(['ojs/ojcore-base'], success, failure);
116
+ return;
117
+ }
118
+ } else {
119
+ failure();
120
+ }
121
+ `;
122
+ }
123
+ }
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertViewModelValue = void 0;
4
+ const oj_module_proxy_1 = require("./oj-module-proxy");
5
+ /**
6
+ * Assert a given expectation against a JET application's viewmodel.
7
+ * Assertions are [Chai](https://www.chaijs.com)-like expressions, represented
8
+ * by the {@link Expectation} class, and compared remotely on the test browser
9
+ * against the identified viewmodel and its path to the target value.
10
+ *
11
+ * The viewmodel is typically identiied by the DOM node on which Knockout's
12
+ * <code>ko.applyBindings</code> was called, but can also be descendants of
13
+ * that originial "root" node.
14
+ * ```javascript
15
+ * new Expectation(...)
16
+ * ```
17
+ *
18
+ * The target value within the viewmodel is identified by a dot-notated path
19
+ * and/or expression which yields the value. For instance, a value may be an
20
+ * observable, therefore, the expression must include parenthesis to unwrap
21
+ * the observable.
22
+ * ```javascript
23
+ * new Expecation(By.id('view-container'), 'firstName()')
24
+ * ```
25
+ *
26
+ * The expression to which the viewmodel value will be compared is expressed
27
+ * as BDD-style chains, such as
28
+ * ```javascript
29
+ * const fnExpectation = new Expectation('firstName()')
30
+ * .to.equal('Joe');
31
+ * ```
32
+ *
33
+ * If a viewmodel value returns a Promise, the assertion will wait for it to
34
+ * resolve before doing the comparison.
35
+ *
36
+ * @param driver The instance of WebDriver to use in performing the expectation
37
+ * @param vmLocator The Locator which identifies the DOM node associated with the
38
+ * viewmodel on the client.
39
+ * @param expression The path within the viewmodel to locate the value
40
+ * @param expectation The Expectation object to evaluate on the client browser.
41
+ */
42
+ async function assertViewModelValue(driver, vmLocator, expectation) {
43
+ const viewmodelEl = (await driver.findElement(vmLocator));
44
+ // Script executes on client to build the Chai assertion from the Expectation.
45
+ // Any exceptions (including failed assertions) will be returned to the test.
46
+ await viewmodelEl.whenBusyContextReady();
47
+ const result = await (0, oj_module_proxy_1.executeWithModules)(driver, ['Chai', 'Knockout', 'CspExpressionEvaluator'], [viewmodelEl, expectation.assertion], `
48
+ ((chai, ko, ExpressionEval, viewmodelEl, assertion) => {
49
+ try {
50
+ var viewmodel = ko.dataFor(viewmodelEl);
51
+ // Use ExpressionEval to get the value from the viewmodel
52
+ var evaluator = new ExpressionEval();
53
+ var value = evaluator.createEvaluator(assertion.expression).evaluate([viewmodel]);
54
+
55
+ function compare(value) {
56
+ var expect = chai.expect(value);
57
+ // For each chained assertion, call the assertion method with the arguments
58
+ assertion.chain.forEach((desc) => {
59
+ if (typeof desc === 'string') {
60
+ // Simple assertions, "is", "to", "be", etc
61
+ expect = expect[desc];
62
+ } else {
63
+ // Complex assertions (chained functions)
64
+ const name = desc.name;
65
+ const args = desc.args;
66
+ let evaluatedArgs = [];
67
+
68
+ if (name === 'match') {
69
+ args[0] = new RegExp(args[0]);
70
+ }
71
+
72
+ if (args) {
73
+ evaluatedArgs = args;
74
+ }
75
+
76
+ expect = expect[name](...evaluatedArgs);
77
+ }
78
+ });
79
+ return true;
80
+ }
81
+
82
+ // If "value" is a Promise
83
+ if (value && typeof value.then === 'function') {
84
+ value.then(compare).catch((ex) => ex.message);
85
+ } else {
86
+ return compare(value);
87
+ }
88
+ } catch (ex) {
89
+ return ex.message;
90
+ }
91
+ })
92
+ `);
93
+ if (result !== true) {
94
+ throw Error(String(result));
95
+ }
96
+ return result;
97
+ }
98
+ exports.assertViewModelValue = assertViewModelValue;
99
+ //# sourceMappingURL=viewmodel-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewmodel-utils.js","sourceRoot":"","sources":["../../lib/viewmodel-utils.ts"],"names":[],"mappings":";;;AAGA,uDAAuD;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACI,KAAK,UAAU,oBAAoB,CACxC,MAAiB,EACjB,SAAkB,EAClB,WAAwB;IAExB,MAAM,WAAW,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAiB,CAAC;IAC1E,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,WAAW,CAAC,oBAAoB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAkB,EACrC,MAAM,EACN,CAAC,MAAM,EAAE,UAAU,EAAE,wBAAwB,CAAC,EAC9C,CAAC,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC,EACpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6CC,CACF,CAAC;IACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAhED,oDAgEC"}
@@ -0,0 +1,107 @@
1
+ import { Locator, WebDriver } from 'selenium-webdriver';
2
+ import { Expectation } from './Expectation';
3
+ import { OjWebElement } from '../elements/OjWebElement';
4
+ import { executeWithModules } from './oj-module-proxy';
5
+
6
+ /**
7
+ * Assert a given expectation against a JET application's viewmodel.
8
+ * Assertions are [Chai](https://www.chaijs.com)-like expressions, represented
9
+ * by the {@link Expectation} class, and compared remotely on the test browser
10
+ * against the identified viewmodel and its path to the target value.
11
+ *
12
+ * The viewmodel is typically identiied by the DOM node on which Knockout's
13
+ * <code>ko.applyBindings</code> was called, but can also be descendants of
14
+ * that originial "root" node.
15
+ * ```javascript
16
+ * new Expectation(...)
17
+ * ```
18
+ *
19
+ * The target value within the viewmodel is identified by a dot-notated path
20
+ * and/or expression which yields the value. For instance, a value may be an
21
+ * observable, therefore, the expression must include parenthesis to unwrap
22
+ * the observable.
23
+ * ```javascript
24
+ * new Expecation(By.id('view-container'), 'firstName()')
25
+ * ```
26
+ *
27
+ * The expression to which the viewmodel value will be compared is expressed
28
+ * as BDD-style chains, such as
29
+ * ```javascript
30
+ * const fnExpectation = new Expectation('firstName()')
31
+ * .to.equal('Joe');
32
+ * ```
33
+ *
34
+ * If a viewmodel value returns a Promise, the assertion will wait for it to
35
+ * resolve before doing the comparison.
36
+ *
37
+ * @param driver The instance of WebDriver to use in performing the expectation
38
+ * @param vmLocator The Locator which identifies the DOM node associated with the
39
+ * viewmodel on the client.
40
+ * @param expression The path within the viewmodel to locate the value
41
+ * @param expectation The Expectation object to evaluate on the client browser.
42
+ */
43
+ export async function assertViewModelValue(
44
+ driver: WebDriver,
45
+ vmLocator: Locator,
46
+ expectation: Expectation
47
+ ): Promise<any> {
48
+ const viewmodelEl = (await driver.findElement(vmLocator)) as OjWebElement;
49
+ // Script executes on client to build the Chai assertion from the Expectation.
50
+ // Any exceptions (including failed assertions) will be returned to the test.
51
+ await viewmodelEl.whenBusyContextReady();
52
+ const result = await executeWithModules(
53
+ driver,
54
+ ['Chai', 'Knockout', 'CspExpressionEvaluator'],
55
+ [viewmodelEl, expectation.assertion],
56
+ `
57
+ ((chai, ko, ExpressionEval, viewmodelEl, assertion) => {
58
+ try {
59
+ var viewmodel = ko.dataFor(viewmodelEl);
60
+ // Use ExpressionEval to get the value from the viewmodel
61
+ var evaluator = new ExpressionEval();
62
+ var value = evaluator.createEvaluator(assertion.expression).evaluate([viewmodel]);
63
+
64
+ function compare(value) {
65
+ var expect = chai.expect(value);
66
+ // For each chained assertion, call the assertion method with the arguments
67
+ assertion.chain.forEach((desc) => {
68
+ if (typeof desc === 'string') {
69
+ // Simple assertions, "is", "to", "be", etc
70
+ expect = expect[desc];
71
+ } else {
72
+ // Complex assertions (chained functions)
73
+ const name = desc.name;
74
+ const args = desc.args;
75
+ let evaluatedArgs = [];
76
+
77
+ if (name === 'match') {
78
+ args[0] = new RegExp(args[0]);
79
+ }
80
+
81
+ if (args) {
82
+ evaluatedArgs = args;
83
+ }
84
+
85
+ expect = expect[name](...evaluatedArgs);
86
+ }
87
+ });
88
+ return true;
89
+ }
90
+
91
+ // If "value" is a Promise
92
+ if (value && typeof value.then === 'function') {
93
+ value.then(compare).catch((ex) => ex.message);
94
+ } else {
95
+ return compare(value);
96
+ }
97
+ } catch (ex) {
98
+ return ex.message;
99
+ }
100
+ })
101
+ `
102
+ );
103
+ if (result !== true) {
104
+ throw Error(String(result));
105
+ }
106
+ return result;
107
+ }
package/package.json CHANGED
@@ -1,9 +1,8 @@
1
1
  {
2
2
  "name": "@oracle/oraclejet-webdriver",
3
- "version": "16.1.6",
4
3
  "description": "Oracle JET WebDriverJS WebElements",
5
4
  "config": {
6
- "revision": "2024-08-22_16-29-50"
5
+ "revision": "2024-08-23_09-56-34"
7
6
  },
8
7
  "scripts": {
9
8
  "clean": "rimraf built dist dist.failed test/built test_results",
@@ -18,10 +17,10 @@
18
17
  "test": "jest -c test/jest.config.js"
19
18
  },
20
19
  "dependencies": {
21
- "@oracle/oraclejet": "16.1.6"
20
+ "@oracle/oraclejet": "17.0.1"
22
21
  },
23
22
  "devDependencies": {
24
- "@oracle/build": "workspace:^",
23
+ "@oracle/oraclejet-internal-ws-build": "workspace:^",
25
24
  "@oracle/oraclejet-test-utils": "workspace:^",
26
25
  "chai": "4.3.10",
27
26
  "copyfiles": "2.4.1",
@@ -33,7 +32,7 @@
33
32
  "rimraf": "3.0.2",
34
33
  "typedoc": "0.25.3",
35
34
  "typedoc-plugin-missing-exports": "^0.22.6",
36
- "typescript": "5.3.2",
35
+ "typescript": "5.4.5",
37
36
  "typescript-parser": "^2.6.1"
38
37
  },
39
38
  "files": [
@@ -50,5 +49,6 @@
50
49
  "peerDependencies": {
51
50
  "@types/selenium-webdriver": ">=3.6.0",
52
51
  "selenium-webdriver": ">=3.6.0"
53
- }
52
+ },
53
+ "version": "17.0.1"
54
54
  }
package/tsconfig.json CHANGED
@@ -23,6 +23,7 @@
23
23
  },
24
24
  "include": [
25
25
  "index.ts",
26
- "elements/**/*.ts"
26
+ "elements/**/*.ts",
27
+ "lib/**/*.ts"
27
28
  ]
28
29
  }
@@ -1 +1 @@
1
- window.navigationData = "data:application/octet-stream;base64,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"
1
+ window.navigationData = "data:application/octet-stream;base64,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"