misoai-web 1.0.2 → 1.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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -8
  3. package/bin/midscene-playground +2 -2
  4. package/dist/es/agent.js +167 -44
  5. package/dist/es/agent.js.map +1 -1
  6. package/dist/es/bridge-mode-browser.js +64 -17
  7. package/dist/es/bridge-mode-browser.js.map +1 -1
  8. package/dist/es/bridge-mode.js +169 -46
  9. package/dist/es/bridge-mode.js.map +1 -1
  10. package/dist/es/chrome-extension.js +229 -59
  11. package/dist/es/chrome-extension.js.map +1 -1
  12. package/dist/es/index.js +183 -45
  13. package/dist/es/index.js.map +1 -1
  14. package/dist/es/midscene-playground.js +173 -44
  15. package/dist/es/midscene-playground.js.map +1 -1
  16. package/dist/es/midscene-server.js.map +1 -1
  17. package/dist/es/playground.js +173 -44
  18. package/dist/es/playground.js.map +1 -1
  19. package/dist/es/playwright-report.js.map +1 -1
  20. package/dist/es/playwright.js +183 -45
  21. package/dist/es/playwright.js.map +1 -1
  22. package/dist/es/puppeteer-agent-launcher.js +183 -45
  23. package/dist/es/puppeteer-agent-launcher.js.map +1 -1
  24. package/dist/es/puppeteer.js +183 -45
  25. package/dist/es/puppeteer.js.map +1 -1
  26. package/dist/es/ui-utils.js.map +1 -1
  27. package/dist/es/utils.js.map +1 -1
  28. package/dist/es/yaml.js +21 -3
  29. package/dist/es/yaml.js.map +1 -1
  30. package/dist/lib/agent.js +167 -44
  31. package/dist/lib/agent.js.map +1 -1
  32. package/dist/lib/bridge-mode-browser.js +64 -17
  33. package/dist/lib/bridge-mode-browser.js.map +1 -1
  34. package/dist/lib/bridge-mode.js +169 -46
  35. package/dist/lib/bridge-mode.js.map +1 -1
  36. package/dist/lib/chrome-extension.js +229 -59
  37. package/dist/lib/chrome-extension.js.map +1 -1
  38. package/dist/lib/index.js +181 -46
  39. package/dist/lib/index.js.map +1 -1
  40. package/dist/lib/midscene-playground.js +173 -44
  41. package/dist/lib/midscene-playground.js.map +1 -1
  42. package/dist/lib/midscene-server.js.map +1 -1
  43. package/dist/lib/playground.js +173 -44
  44. package/dist/lib/playground.js.map +1 -1
  45. package/dist/lib/playwright-report.js.map +1 -1
  46. package/dist/lib/playwright.js +181 -46
  47. package/dist/lib/playwright.js.map +1 -1
  48. package/dist/lib/puppeteer-agent-launcher.js +181 -46
  49. package/dist/lib/puppeteer-agent-launcher.js.map +1 -1
  50. package/dist/lib/puppeteer.js +181 -46
  51. package/dist/lib/puppeteer.js.map +1 -1
  52. package/dist/lib/ui-utils.js.map +1 -1
  53. package/dist/lib/utils.js.map +1 -1
  54. package/dist/lib/yaml.js +21 -3
  55. package/dist/lib/yaml.js.map +1 -1
  56. package/dist/types/agent.d.ts +16 -6
  57. package/dist/types/bridge-mode-browser.d.ts +2 -2
  58. package/dist/types/bridge-mode.d.ts +2 -2
  59. package/dist/types/{browser-d447695b.d.ts → browser-a1877d18.d.ts} +1 -1
  60. package/dist/types/chrome-extension.d.ts +2 -2
  61. package/dist/types/index.d.ts +1 -1
  62. package/dist/types/midscene-server.d.ts +1 -1
  63. package/dist/types/{page-b8ada1f3.d.ts → page-663ece08.d.ts} +41 -30
  64. package/dist/types/playground.d.ts +2 -2
  65. package/dist/types/playwright.d.ts +1 -1
  66. package/dist/types/puppeteer-agent-launcher.d.ts +1 -1
  67. package/dist/types/puppeteer.d.ts +1 -1
  68. package/dist/types/utils.d.ts +1 -1
  69. package/dist/types/yaml.d.ts +1 -1
  70. package/iife-script/htmlElement.js +99 -37
  71. package/iife-script/htmlElementDebug.js +92 -9
  72. package/package.json +23 -24
@@ -208,7 +208,9 @@ var ScriptPlayer = class {
208
208
  typeof prompt === "string",
209
209
  "prompt for aiAction must be a string"
210
210
  );
211
- await agent.aiAction(prompt);
211
+ await agent.aiAction(prompt, {
212
+ cacheable: actionTask.cacheable
213
+ });
212
214
  } else if ("aiAssert" in flowItem) {
213
215
  const assertTask = flowItem;
214
216
  const prompt = assertTask.aiAssert;
@@ -410,8 +412,24 @@ function interpolateEnvVars(content) {
410
412
  });
411
413
  }
412
414
  function parseYamlScript(content, filePath, ignoreCheckingTarget) {
413
- const interpolatedContent = interpolateEnvVars(content);
414
- const obj = yaml2.load(interpolatedContent);
415
+ let processedContent = content;
416
+ if (content.indexOf("android") !== -1 && content.match(/deviceId:\s*(\d+)/)) {
417
+ let matchedDeviceId;
418
+ processedContent = content.replace(
419
+ /deviceId:\s*(\d+)/g,
420
+ (match, deviceId) => {
421
+ matchedDeviceId = deviceId;
422
+ return `deviceId: '${deviceId}'`;
423
+ }
424
+ );
425
+ console.warn(
426
+ `please use string-style deviceId in yaml script, for example: deviceId: "${matchedDeviceId}"`
427
+ );
428
+ }
429
+ const interpolatedContent = interpolateEnvVars(processedContent);
430
+ const obj = yaml2.load(interpolatedContent, {
431
+ schema: yaml2.JSON_SCHEMA
432
+ });
415
433
  const pathTip = filePath ? `, failed to load ${filePath}` : "";
416
434
  const android = typeof obj.android !== "undefined" ? Object.assign({}, obj.android || {}) : void 0;
417
435
  const webConfig = obj.web || obj.target;
@@ -467,7 +485,6 @@ import {
467
485
  } from "misoai-core/ai-model";
468
486
  import { sleep } from "misoai-core/utils";
469
487
  import { NodeType } from "misoai-shared/constants";
470
- import { getElementInfosScriptContent } from "misoai-shared/fs";
471
488
  import { getDebug } from "misoai-shared/logger";
472
489
  import { assert as assert4 } from "misoai-shared/utils";
473
490
 
@@ -585,16 +602,18 @@ var PageTaskExecutor = class {
585
602
  );
586
603
  if (info?.id) {
587
604
  elementId = info.id;
605
+ } else {
606
+ debug(
607
+ "no element id found for position node, will not update cache",
608
+ element
609
+ );
588
610
  }
589
611
  }
590
612
  if (!elementId) {
591
613
  return void 0;
592
614
  }
593
615
  try {
594
- const elementInfosScriptContent = getElementInfosScriptContent();
595
- const result = await this.page.evaluateJavaScript?.(
596
- `${elementInfosScriptContent}midscene_element_inspector.getXpathsById('${elementId}')`
597
- );
616
+ const result = await this.page.getXpathsById(elementId);
598
617
  return result;
599
618
  } catch (error) {
600
619
  debug("getXpathsById error: ", error);
@@ -633,7 +652,7 @@ var PageTaskExecutor = class {
633
652
  };
634
653
  return taskWithScreenshot;
635
654
  }
636
- async convertPlanToExecutable(plans) {
655
+ async convertPlanToExecutable(plans, opts) {
637
656
  const tasks = [];
638
657
  plans.forEach((plan2) => {
639
658
  if (plan2.type === "Locate") {
@@ -643,7 +662,10 @@ var PageTaskExecutor = class {
643
662
  const taskFind = {
644
663
  type: "Insight",
645
664
  subType: "Locate",
646
- param: plan2.locate || void 0,
665
+ param: plan2.locate ? {
666
+ ...plan2.locate,
667
+ cacheable: opts?.cacheable
668
+ } : void 0,
647
669
  thought: plan2.thought,
648
670
  locate: plan2.locate,
649
671
  executor: async (param, taskContext) => {
@@ -680,19 +702,21 @@ var PageTaskExecutor = class {
680
702
  let elementFromCache = null;
681
703
  try {
682
704
  if (xpaths?.length && this.taskCache?.isCacheResultUsed && param?.cacheable !== false) {
683
- const elementInfosScriptContent = getElementInfosScriptContent();
684
- const element2 = await this.page.evaluateJavaScript?.(
685
- `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath('${xpaths[0]}')`
686
- );
687
- if (element2?.id) {
688
- elementFromCache = element2;
689
- debug("cache hit, prompt: %s", cachePrompt);
690
- cacheHitFlag = true;
691
- debug(
692
- "found a new new element with same xpath, xpath: %s, id: %s",
693
- xpaths[0],
694
- element2?.id
705
+ for (let i = 0; i < xpaths.length; i++) {
706
+ const element2 = await this.page.getElementInfoByXpath(
707
+ xpaths[i]
695
708
  );
709
+ if (element2?.id) {
710
+ elementFromCache = element2;
711
+ debug("cache hit, prompt: %s", cachePrompt);
712
+ cacheHitFlag = true;
713
+ debug(
714
+ "found a new new element with same xpath, xpath: %s, id: %s",
715
+ xpaths[i],
716
+ element2?.id
717
+ );
718
+ break;
719
+ }
696
720
  }
697
721
  }
698
722
  } catch (error) {
@@ -705,12 +729,14 @@ var PageTaskExecutor = class {
705
729
  context: pageContext
706
730
  })).element;
707
731
  const aiCost = Date.now() - startTime;
732
+ let currentXpaths;
708
733
  if (element && this.taskCache && !cacheHitFlag && param?.cacheable !== false) {
709
734
  const elementXpaths = await this.getElementXpath(
710
735
  pageContext,
711
736
  element
712
737
  );
713
- if (elementXpaths) {
738
+ if (elementXpaths?.length) {
739
+ currentXpaths = elementXpaths;
714
740
  this.taskCache.updateOrAppendCacheRecord(
715
741
  {
716
742
  type: "locate",
@@ -720,7 +746,11 @@ var PageTaskExecutor = class {
720
746
  locateCacheRecord
721
747
  );
722
748
  } else {
723
- debug("no xpaths found, will not update cache", cachePrompt);
749
+ debug(
750
+ "no xpaths found, will not update cache",
751
+ cachePrompt,
752
+ elementXpaths
753
+ );
724
754
  }
725
755
  }
726
756
  if (!element) {
@@ -732,7 +762,9 @@ var PageTaskExecutor = class {
732
762
  },
733
763
  pageContext,
734
764
  cache: {
735
- hit: cacheHitFlag
765
+ hit: cacheHitFlag,
766
+ originalXpaths: xpaths,
767
+ currentXpaths
736
768
  },
737
769
  aiCost
738
770
  };
@@ -1100,6 +1132,7 @@ var PageTaskExecutor = class {
1100
1132
  sleep: sleep2
1101
1133
  } = planResult;
1102
1134
  executorContext.task.log = {
1135
+ ...executorContext.task.log || {},
1103
1136
  rawResponse
1104
1137
  };
1105
1138
  executorContext.task.usage = usage;
@@ -1224,11 +1257,11 @@ var PageTaskExecutor = class {
1224
1257
  };
1225
1258
  return task;
1226
1259
  }
1227
- async runPlans(title, plans) {
1260
+ async runPlans(title, plans, opts) {
1228
1261
  const taskExecutor = new Executor(title, {
1229
1262
  onTaskStart: this.onTaskStartCallback
1230
1263
  });
1231
- const { tasks } = await this.convertPlanToExecutable(plans);
1264
+ const { tasks } = await this.convertPlanToExecutable(plans, opts);
1232
1265
  await taskExecutor.append(tasks);
1233
1266
  const result = await taskExecutor.flush();
1234
1267
  return {
@@ -1236,7 +1269,7 @@ var PageTaskExecutor = class {
1236
1269
  executor: taskExecutor
1237
1270
  };
1238
1271
  }
1239
- async action(userPrompt, actionContext) {
1272
+ async action(userPrompt, actionContext, opts) {
1240
1273
  const taskExecutor = new Executor(taskTitleStr("Action", userPrompt), {
1241
1274
  onTaskStart: this.onTaskStartCallback
1242
1275
  });
@@ -1261,7 +1294,7 @@ var PageTaskExecutor = class {
1261
1294
  yamlFlow.push(...planResult.yamlFlow || []);
1262
1295
  let executables;
1263
1296
  try {
1264
- executables = await this.convertPlanToExecutable(plans);
1297
+ executables = await this.convertPlanToExecutable(plans, opts);
1265
1298
  taskExecutor.append(executables.tasks);
1266
1299
  } catch (error) {
1267
1300
  return this.appendErrorPlan(
@@ -1299,7 +1332,7 @@ var PageTaskExecutor = class {
1299
1332
  executor: taskExecutor
1300
1333
  };
1301
1334
  }
1302
- async actionToGoal(userPrompt) {
1335
+ async actionToGoal(userPrompt, opts) {
1303
1336
  const taskExecutor = new Executor(taskTitleStr("Action", userPrompt), {
1304
1337
  onTaskStart: this.onTaskStartCallback
1305
1338
  });
@@ -1323,7 +1356,7 @@ var PageTaskExecutor = class {
1323
1356
  yamlFlow.push(...output.yamlFlow || []);
1324
1357
  let executables;
1325
1358
  try {
1326
- executables = await this.convertPlanToExecutable(plans);
1359
+ executables = await this.convertPlanToExecutable(plans, opts);
1327
1360
  taskExecutor.append(executables.tasks);
1328
1361
  } catch (error) {
1329
1362
  return this.appendErrorPlan(
@@ -1628,7 +1661,7 @@ import yaml3 from "js-yaml";
1628
1661
  import semver from "semver";
1629
1662
 
1630
1663
  // package.json
1631
- var version = "1.0.2";
1664
+ var version = "1.0.4";
1632
1665
 
1633
1666
  // src/common/task-cache.ts
1634
1667
  var debug3 = getDebug3("cache");
@@ -1971,9 +2004,9 @@ var PageAgent = class {
1971
2004
  buildDetailedLocateParam(locatePrompt, opt) {
1972
2005
  assert7(locatePrompt, "missing locate prompt");
1973
2006
  if (typeof opt === "object") {
1974
- const prompt = opt.prompt || locatePrompt;
1975
- const deepThink = opt.deepThink || false;
1976
- const cacheable = opt.cacheable || true;
2007
+ const prompt = opt.prompt ?? locatePrompt;
2008
+ const deepThink = opt.deepThink ?? false;
2009
+ const cacheable = opt.cacheable ?? true;
1977
2010
  return {
1978
2011
  prompt,
1979
2012
  deepThink,
@@ -1992,7 +2025,8 @@ var PageAgent = class {
1992
2025
  const plans = buildPlans("Tap", detailedLocateParam);
1993
2026
  const { executor, output } = await this.taskExecutor.runPlans(
1994
2027
  taskTitleStr("Tap", locateParamStr(detailedLocateParam)),
1995
- plans
2028
+ plans,
2029
+ { cacheable: opt?.cacheable }
1996
2030
  );
1997
2031
  const metadata = this.afterTaskRunning(executor);
1998
2032
  return {
@@ -2008,7 +2042,8 @@ var PageAgent = class {
2008
2042
  const plans = buildPlans("Hover", detailedLocateParam);
2009
2043
  const { executor, output } = await this.taskExecutor.runPlans(
2010
2044
  taskTitleStr("Hover", locateParamStr(detailedLocateParam)),
2011
- plans
2045
+ plans,
2046
+ { cacheable: opt?.cacheable }
2012
2047
  );
2013
2048
  const metadata = this.afterTaskRunning(executor);
2014
2049
  return {
@@ -2031,7 +2066,8 @@ var PageAgent = class {
2031
2066
  });
2032
2067
  const { executor, output } = await this.taskExecutor.runPlans(
2033
2068
  taskTitleStr("Input", locateParamStr(detailedLocateParam)),
2034
- plans
2069
+ plans,
2070
+ { cacheable: opt?.cacheable }
2035
2071
  );
2036
2072
  const metadata = this.afterTaskRunning(executor);
2037
2073
  return {
@@ -2047,7 +2083,8 @@ var PageAgent = class {
2047
2083
  });
2048
2084
  const { executor, output } = await this.taskExecutor.runPlans(
2049
2085
  taskTitleStr("KeyboardPress", locateParamStr(detailedLocateParam)),
2050
- plans
2086
+ plans,
2087
+ { cacheable: opt?.cacheable }
2051
2088
  );
2052
2089
  const metadata = this.afterTaskRunning(executor);
2053
2090
  return {
@@ -2061,7 +2098,8 @@ var PageAgent = class {
2061
2098
  const paramInTitle = locatePrompt ? `${locateParamStr(detailedLocateParam)} - ${scrollParamStr(scrollParam)}` : scrollParamStr(scrollParam);
2062
2099
  const { executor, output } = await this.taskExecutor.runPlans(
2063
2100
  taskTitleStr("Scroll", paramInTitle),
2064
- plans
2101
+ plans,
2102
+ { cacheable: opt?.cacheable }
2065
2103
  );
2066
2104
  const metadata = this.afterTaskRunning(executor);
2067
2105
  return {
@@ -2070,6 +2108,19 @@ var PageAgent = class {
2070
2108
  };
2071
2109
  }
2072
2110
  async aiAction(taskPrompt, opt) {
2111
+ try {
2112
+ const aiModel = await import("misoai-core/ai-model");
2113
+ const contextStore = aiModel.getContextStore();
2114
+ const processedPrompt = contextStore.replaceAllReferences(taskPrompt, "action");
2115
+ contextStore.addStep({
2116
+ type: "action",
2117
+ summary: `Action: ${processedPrompt}`,
2118
+ prompt: processedPrompt
2119
+ });
2120
+ taskPrompt = processedPrompt;
2121
+ } catch (error) {
2122
+ debug4("Context store not available:", error);
2123
+ }
2073
2124
  const cacheable = opt?.cacheable;
2074
2125
  const isVlmUiTars = vlLocateMode() === "vlm-ui-tars";
2075
2126
  const matchedCache = isVlmUiTars || cacheable === false ? void 0 : this.taskCache?.matchPlanCache(taskPrompt);
@@ -2087,7 +2138,9 @@ var PageAgent = class {
2087
2138
  metadata: metadata2
2088
2139
  };
2089
2140
  }
2090
- const { output, executor } = await (isVlmUiTars ? this.taskExecutor.actionToGoal(taskPrompt) : this.taskExecutor.action(taskPrompt, this.opts.aiActionContext));
2141
+ const { output, executor } = await (isVlmUiTars ? this.taskExecutor.actionToGoal(taskPrompt, { cacheable }) : this.taskExecutor.action(taskPrompt, this.opts.aiActionContext, {
2142
+ cacheable
2143
+ }));
2091
2144
  if (this.taskCache && output?.yamlFlow && cacheable !== false) {
2092
2145
  const yamlContent = {
2093
2146
  tasks: [
@@ -2114,7 +2167,63 @@ var PageAgent = class {
2114
2167
  };
2115
2168
  }
2116
2169
  async aiQuery(demand) {
2117
- const { output, executor } = await this.taskExecutor.query(demand);
2170
+ let processedDemand = demand;
2171
+ let storageKey;
2172
+ try {
2173
+ const aiModel = await import("misoai-core/ai-model");
2174
+ const contextStore = aiModel.getContextStore();
2175
+ if (typeof demand === "string") {
2176
+ const storageInstruction = contextStore.parseStorageInstruction(demand);
2177
+ if (storageInstruction) {
2178
+ storageKey = storageInstruction.key;
2179
+ processedDemand = storageInstruction.cleanText;
2180
+ contextStore._pendingAliases = storageInstruction.aliases;
2181
+ } else {
2182
+ const storageMatch = demand.match(/store\s+(?:as\s+)?(\w+)/i);
2183
+ if (storageMatch) {
2184
+ storageKey = storageMatch[1];
2185
+ processedDemand = demand.replace(/,?\s*store\s+(?:as\s+)?\w+/i, "").trim();
2186
+ }
2187
+ }
2188
+ }
2189
+ } catch (error) {
2190
+ debug4("Context store not available:", error);
2191
+ }
2192
+ const { output, executor } = await this.taskExecutor.query(processedDemand);
2193
+ if (storageKey && output) {
2194
+ try {
2195
+ const aiModel = await import("misoai-core/ai-model");
2196
+ const contextStore = aiModel.getContextStore();
2197
+ const pendingAliases = contextStore._pendingAliases;
2198
+ if (pendingAliases) {
2199
+ contextStore.storeDataWithAliases(storageKey, output, pendingAliases, typeof processedDemand === "string" ? processedDemand : JSON.stringify(processedDemand));
2200
+ delete contextStore._pendingAliases;
2201
+ } else {
2202
+ contextStore.storeData(storageKey, output);
2203
+ }
2204
+ contextStore.addStep({
2205
+ type: "query",
2206
+ summary: `Query: ${typeof processedDemand === "string" ? processedDemand : JSON.stringify(processedDemand)} (stored as ${storageKey})`,
2207
+ data: output,
2208
+ prompt: typeof processedDemand === "string" ? processedDemand : JSON.stringify(processedDemand)
2209
+ });
2210
+ } catch (error) {
2211
+ debug4("Failed to store query result:", error);
2212
+ }
2213
+ } else {
2214
+ try {
2215
+ const aiModel = await import("misoai-core/ai-model");
2216
+ const contextStore = aiModel.getContextStore();
2217
+ contextStore.addStep({
2218
+ type: "query",
2219
+ summary: `Query: ${typeof processedDemand === "string" ? processedDemand : JSON.stringify(processedDemand)}`,
2220
+ data: output,
2221
+ prompt: typeof processedDemand === "string" ? processedDemand : JSON.stringify(processedDemand)
2222
+ });
2223
+ } catch (error) {
2224
+ debug4("Failed to add query step:", error);
2225
+ }
2226
+ }
2118
2227
  const metadata = this.afterTaskRunning(executor);
2119
2228
  return {
2120
2229
  result: output,
@@ -2209,7 +2318,8 @@ var PageAgent = class {
2209
2318
  const plans = buildPlans("Locate", detailedLocateParam);
2210
2319
  const { executor, output } = await this.taskExecutor.runPlans(
2211
2320
  taskTitleStr("Locate", locateParamStr(detailedLocateParam)),
2212
- plans
2321
+ plans,
2322
+ { cacheable: opt?.cacheable }
2213
2323
  );
2214
2324
  const metadata = this.afterTaskRunning(executor);
2215
2325
  const { element } = output;
@@ -2223,6 +2333,19 @@ var PageAgent = class {
2223
2333
  };
2224
2334
  }
2225
2335
  async aiAssert(assertion, msg, opt) {
2336
+ let processedAssertion = assertion;
2337
+ try {
2338
+ const aiModel = await import("misoai-core/ai-model");
2339
+ const contextStore = aiModel.getContextStore();
2340
+ processedAssertion = contextStore.replaceAllReferences(assertion, "assertion");
2341
+ contextStore.addStep({
2342
+ type: "assertion",
2343
+ summary: `Assertion: ${processedAssertion}`,
2344
+ prompt: processedAssertion
2345
+ });
2346
+ } catch (error) {
2347
+ debug4("Context store not available:", error);
2348
+ }
2226
2349
  let currentUrl = "";
2227
2350
  if (this.page.url) {
2228
2351
  try {
@@ -2230,7 +2353,7 @@ var PageAgent = class {
2230
2353
  } catch (e) {
2231
2354
  }
2232
2355
  }
2233
- const assertionWithContext = currentUrl ? `For the page at URL "${currentUrl}", ${assertion}` : assertion;
2356
+ const assertionWithContext = currentUrl ? `For the page at URL "${currentUrl}", ${processedAssertion}` : processedAssertion;
2234
2357
  const { output, executor } = await this.taskExecutor.assert(assertionWithContext);
2235
2358
  const metadata = this.afterTaskRunning(executor, true);
2236
2359
  if (output && opt?.keepRawResponse) {
@@ -2497,6 +2620,12 @@ var StaticPage = class {
2497
2620
  async getElementsNodeTree() {
2498
2621
  return ThrowNotImplemented("getElementsNodeTree");
2499
2622
  }
2623
+ async getXpathsById(id) {
2624
+ return ThrowNotImplemented("getXpathsById");
2625
+ }
2626
+ async getElementInfoByXpath(xpath) {
2627
+ return ThrowNotImplemented("getElementInfoByXpath");
2628
+ }
2500
2629
  async size() {
2501
2630
  return this.uiContext.size;
2502
2631
  }