snapshot.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. "use strict";
  2. var __create = Object.create;
  3. var __defProp = Object.defineProperty;
  4. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  5. var __getOwnPropNames = Object.getOwnPropertyNames;
  6. var __getProtoOf = Object.getPrototypeOf;
  7. var __hasOwnProp = Object.prototype.hasOwnProperty;
  8. var __export = (target, all) => {
  9. for (var name in all)
  10. __defProp(target, name, { get: all[name], enumerable: true });
  11. };
  12. var __copyProps = (to, from, except, desc) => {
  13. if (from && typeof from === "object" || typeof from === "function") {
  14. for (let key of __getOwnPropNames(from))
  15. if (!__hasOwnProp.call(to, key) && key !== except)
  16. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  17. }
  18. return to;
  19. };
  20. var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  21. // If the importer is in node compatibility mode or this is not an ESM
  22. // file that has been converted to a CommonJS file using a Babel-
  23. // compatible transform (i.e. "__esModule" has not been set), then set
  24. // "default" to the CommonJS "module.exports" for node compatibility.
  25. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  26. mod
  27. ));
  28. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  29. var snapshot_exports = {};
  30. __export(snapshot_exports, {
  31. default: () => snapshot_default,
  32. elementSchema: () => elementSchema
  33. });
  34. module.exports = __toCommonJS(snapshot_exports);
  35. var import_bundle = require("../../sdk/bundle");
  36. var import_tool = require("./tool");
  37. var javascript = __toESM(require("../codegen"));
  38. const snapshot = (0, import_tool.defineTool)({
  39. capability: "core",
  40. schema: {
  41. name: "browser_snapshot",
  42. title: "Page snapshot",
  43. description: "Capture accessibility snapshot of the current page, this is better than screenshot",
  44. inputSchema: import_bundle.z.object({}),
  45. type: "readOnly"
  46. },
  47. handle: async (context, params, response) => {
  48. await context.ensureTab();
  49. response.setIncludeSnapshot("full");
  50. }
  51. });
  52. const elementSchema = import_bundle.z.object({
  53. element: import_bundle.z.string().describe("Human-readable element description used to obtain permission to interact with the element"),
  54. ref: import_bundle.z.string().describe("Exact target element reference from the page snapshot")
  55. });
  56. const clickSchema = elementSchema.extend({
  57. doubleClick: import_bundle.z.boolean().optional().describe("Whether to perform a double click instead of a single click"),
  58. button: import_bundle.z.enum(["left", "right", "middle"]).optional().describe("Button to click, defaults to left"),
  59. modifiers: import_bundle.z.array(import_bundle.z.enum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"])).optional().describe("Modifier keys to press")
  60. });
  61. const click = (0, import_tool.defineTabTool)({
  62. capability: "core",
  63. schema: {
  64. name: "browser_click",
  65. title: "Click",
  66. description: "Perform click on a web page",
  67. inputSchema: clickSchema,
  68. type: "input"
  69. },
  70. handle: async (tab, params, response) => {
  71. response.setIncludeSnapshot();
  72. const { locator, resolved } = await tab.refLocator(params);
  73. const options = {
  74. button: params.button,
  75. modifiers: params.modifiers
  76. };
  77. const formatted = javascript.formatObject(options, " ", "oneline");
  78. const optionsAttr = formatted !== "{}" ? formatted : "";
  79. if (params.doubleClick)
  80. response.addCode(`await page.${resolved}.dblclick(${optionsAttr});`);
  81. else
  82. response.addCode(`await page.${resolved}.click(${optionsAttr});`);
  83. await tab.waitForCompletion(async () => {
  84. if (params.doubleClick)
  85. await locator.dblclick(options);
  86. else
  87. await locator.click(options);
  88. });
  89. }
  90. });
  91. const drag = (0, import_tool.defineTabTool)({
  92. capability: "core",
  93. schema: {
  94. name: "browser_drag",
  95. title: "Drag mouse",
  96. description: "Perform drag and drop between two elements",
  97. inputSchema: import_bundle.z.object({
  98. startElement: import_bundle.z.string().describe("Human-readable source element description used to obtain the permission to interact with the element"),
  99. startRef: import_bundle.z.string().describe("Exact source element reference from the page snapshot"),
  100. endElement: import_bundle.z.string().describe("Human-readable target element description used to obtain the permission to interact with the element"),
  101. endRef: import_bundle.z.string().describe("Exact target element reference from the page snapshot")
  102. }),
  103. type: "input"
  104. },
  105. handle: async (tab, params, response) => {
  106. response.setIncludeSnapshot();
  107. const [start, end] = await tab.refLocators([
  108. { ref: params.startRef, element: params.startElement },
  109. { ref: params.endRef, element: params.endElement }
  110. ]);
  111. await tab.waitForCompletion(async () => {
  112. await start.locator.dragTo(end.locator);
  113. });
  114. response.addCode(`await page.${start.resolved}.dragTo(page.${end.resolved});`);
  115. }
  116. });
  117. const hover = (0, import_tool.defineTabTool)({
  118. capability: "core",
  119. schema: {
  120. name: "browser_hover",
  121. title: "Hover mouse",
  122. description: "Hover over element on page",
  123. inputSchema: elementSchema,
  124. type: "input"
  125. },
  126. handle: async (tab, params, response) => {
  127. response.setIncludeSnapshot();
  128. const { locator, resolved } = await tab.refLocator(params);
  129. response.addCode(`await page.${resolved}.hover();`);
  130. await tab.waitForCompletion(async () => {
  131. await locator.hover();
  132. });
  133. }
  134. });
  135. const selectOptionSchema = elementSchema.extend({
  136. values: import_bundle.z.array(import_bundle.z.string()).describe("Array of values to select in the dropdown. This can be a single value or multiple values.")
  137. });
  138. const selectOption = (0, import_tool.defineTabTool)({
  139. capability: "core",
  140. schema: {
  141. name: "browser_select_option",
  142. title: "Select option",
  143. description: "Select an option in a dropdown",
  144. inputSchema: selectOptionSchema,
  145. type: "input"
  146. },
  147. handle: async (tab, params, response) => {
  148. response.setIncludeSnapshot();
  149. const { locator, resolved } = await tab.refLocator(params);
  150. response.addCode(`await page.${resolved}.selectOption(${javascript.formatObject(params.values)});`);
  151. await tab.waitForCompletion(async () => {
  152. await locator.selectOption(params.values);
  153. });
  154. }
  155. });
  156. const pickLocator = (0, import_tool.defineTabTool)({
  157. capability: "testing",
  158. schema: {
  159. name: "browser_generate_locator",
  160. title: "Create locator for element",
  161. description: "Generate locator for the given element to use in tests",
  162. inputSchema: elementSchema,
  163. type: "readOnly"
  164. },
  165. handle: async (tab, params, response) => {
  166. const { resolved } = await tab.refLocator(params);
  167. response.addResult(resolved);
  168. }
  169. });
  170. var snapshot_default = [
  171. snapshot,
  172. click,
  173. drag,
  174. hover,
  175. selectOption,
  176. pickLocator
  177. ];
  178. // Annotate the CommonJS export names for ESM import in node:
  179. 0 && (module.exports = {
  180. elementSchema
  181. });