计算WebdriverIO中的表行

时间:2018-01-23 15:30:15

标签: arrays node.js webdriver-io

我正在测试一个带有动态网页表的网上商店,可以包含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>

1 个答案:

答案 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循环一起传递,因此您可以引用您正在使用的行。

希望这有帮助!