WebdriverIO动态表格元素数组处理及Open状态订单删除问题
解决WebdriverIO中获取元素文本始终返回数组的问题&优化Open订单删除逻辑
首先,针对你提到的获取元素文本时0或1个元素不返回数组的问题,WebdriverIO的browser.getText()方法确实有这个行为:匹配多个元素时返回数组,单个元素返回字符串,没有匹配到则返回undefined。要解决这个问题,我们可以换一种方式——先通过$$选择器获取元素数组,再提取每个元素的文本,这样不管匹配到多少元素,最终都会得到一个数组:
// 用$$选择器获取所有订单编号元素,再映射提取文本 const orderNumbers = $$(".jum-order-list-table-b2c .jum-order-number div:nth-child(2)") .map(element => element.getText()); console.log(orderNumbers); // 结果始终是数组:空数组([])、单元素数组(["订单号1"])或多元素数组(["订单号1", "订单号2"])
$$是WebdriverIO专门用于获取多个元素的API,返回的是ElementArray对象,调用map方法遍历每个元素并提取文本,就能保证结果始终是数组类型,完美适配你习惯的Java式数组处理思路。
接下来,针对你删除Open订单的循环逻辑,我也给你优化一下——去掉不稳定的固定pause,改用WebdriverIO的等待API,并且让循环更智能(直到顶部没有Open订单为止):
// 循环处理顶部的Open订单,直到第一个订单状态不是Open while (true) { // 定位顶部的Open订单状态元素,等待它加载完成(超时5秒) const topOrderStatusEl = $("tr.jum-open-order-row .jum-status div:nth-child(2) span"); const isStatusElExist = topOrderStatusEl.waitForExist({ timeout: 5000, timeoutMsg: "未找到订单状态元素" }); // 如果没有找到状态元素,说明没有订单了,退出循环 if (!isStatusElExist) break; const orderStatus = topOrderStatusEl.getText(); console.log(`当前顶部订单状态:${orderStatus}`); // 遇到非Open订单,终止循环 if (orderStatus !== "Open") break; // 执行删除操作,每一步都等待元素加载完成 // 1. 点击订单操作按钮 const actionBtn = $("tr.jum-open-order-row .jum-list-actions div a"); actionBtn.waitForExist({ timeout: 5000 }); actionBtn.click(); // 2. 点击"Bestelling annuleren"按钮 const cancelBtn = $("//*[@value='Bestelling annuleren']"); cancelBtn.waitForExist({ timeout: 5000 }); cancelBtn.click(); // 3. 点击确认按钮 const confirmBtn = $(".ui-dialog-buttonset button:nth-child(2)"); confirmBtn.waitForExist({ timeout: 5000 }); confirmBtn.click(); // 4. 等待当前Open订单被删除(页面更新) browser.waitUntil( () => !$("tr.jum-open-order-row").isExisting(), { timeout: 10000, timeoutMsg: "订单删除超时,页面未更新" } ); }
优化点说明:
- 替换固定
pause为智能等待:waitForExist会等待元素出现后再执行操作,waitUntil会等待指定条件满足(比如当前Open订单消失),比固定等待时间更稳定,避免因页面加载慢导致的操作失败。 - 更精准的选择器:直接用
tr.jum-open-order-row定位Open订单行,比tr[1]更可靠——删除顶部订单后,下一个Open订单会自动成为新的第一行,选择器依然有效。 - 无限循环+终止条件:用
while(true)配合终止条件(找不到订单、订单状态非Open),不用固定循环次数,能处理任意数量的Open订单。
内容的提问来源于stack exchange,提问作者Martijn
相关产品推荐
相关产品推荐

