我正在测试一个带有动态网页表的网上商店,可以包含0到100行(订单)。我被迫使用NodeJS和WebdriverIO,对我来说都是新的。
我想删除所有具有“打开”状态的订单。我习惯使用Java,我只是将所有适用的webelements添加到一个数组中,然后将delete命令放在一个循环中,该循环将运行多次,因为数组很长。
我设法创建了这样的所需循环(开放订单总是在顶部,循环一旦遇到非开放订单就允许中断:
for (var i = 1; i < 5; i++) {
var orderStatus = browser.getText("//*[@class='jum-order-list-table-b2c']//tr[1]//*[@class='jum-status']/div[2]/span")
console.log(orderStatus)
if (orderStatus != 'Open') { break; }
browser.pause(1000)
browser.click("//*[@class='jum-order-list-table-b2c']//tr[1]//*[@class='jum-list-actions']/div/a")
browser.pause(1000)
browser.click("//*[@value='Bestelling annuleren']")
browser.pause(1000)
browser.click("//*[@class='ui-dialog-buttonset']//button[2]")
browser.pause(1000)
但是我无法弄清楚如何制作一系列的元素。
我设法得到了这个:
var orderTable = browser.getText("//*[@class='jum-order-list-table-b2c']//*[@class='jum-order-number']/div[2]")
但是当只有1个元素时,这只会创建一个数组。当没有或只有1个元素时,我也希望它是一个数组
任何人都可以告诉我如何实现这一目标吗?
我正在使用的网站部分如下所示:
<tbody>
<tr class="jum-open-order-row">
<td class="jum-order-type jum-ga-b2b-bestellingen-orderdata">
<td class="jum-cell-bold">
<td class="jum-order-number">
<td class="jum-status">
<td class="jum-price">
<td class="jum-list-actions">
</tr>
<tr class="jum-open-order-row">
<tr class="jum-open-order-row">
<tr class="jum-open-order-row">
</tbody>
答案 0 :(得分:1)
我对CSS选择器的经验比XPath更多,但是,有browser.elements
方法。这将返回与特定选择器匹配的1个或多个元素。
http://webdriver.io/api/protocol/elements.html
如果您愿意,也可以将browser.elements
缩写为browser.$$
。
然后使用elementIdText
为“打开”订单提取元素的文本值
http://webdriver.io/api/protocol/elementIdText.html#Usage
返回的响应是与订单行对应的结果数组,状态为<td>
let openOrderRowStatuses = browser.elements('.jum-open-order-row .jum-status')
现在我们有一个“打开订单状态”数组,让我们获取这些状态的文本值。
//Let's forEach every returned JSON WebElement and get the Text of the Status...
openOrderRowStatuses.forEach((elem, index)) => {
//Get the Text Value with `elementIdText' elem.value.ELEMENT
let orderStatus = browser.elementIdText(elem.value.ELEMENT)
if(orderStatus === "Open"){
//Perform Delete Logic
}
}
我相信你可能不得不修改你的确切设置和选择器,但这是使用一系列元素的一种方式让我获得了成功。我使用的是ES6语法,因此您可能需要调整解决方案。但是“Index”值与forEach循环一起传递,因此您可以引用您正在使用的行。
希望这有帮助!