Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays WebdriverIO中的表行计数_Arrays_Node.js_Webdriver Io - Fatal编程技术网

Arrays WebdriverIO中的表行计数

Arrays WebdriverIO中的表行计数,arrays,node.js,webdriver-io,Arrays,Node.js,Webdriver Io,我正在测试一个带有动态webtable的webshop,它可以包含0到100行(订单)。为此,我不得不使用NodeJS和webdrivero,这对我来说都是全新的 我想删除每个具有“打开”状态的订单。我习惯于使用Java,在Java中,我只需将所有适用的WebElement添加到一个数组中,然后将delete命令放入一个循环中,该循环的运行次数与数组的长度相同 我成功地创建了所需的循环,如下所示(未结订单始终位于顶部,循环在遇到非未结订单时允许中断: for (var i = 1; i <

我正在测试一个带有动态webtable的webshop,它可以包含0到100行(订单)。为此,我不得不使用NodeJS和webdrivero,这对我来说都是全新的

我想删除每个具有“打开”状态的订单。我习惯于使用Java,在Java中,我只需将所有适用的WebElement添加到一个数组中,然后将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)     
但这只会在元素超过1个时创建一个数组。我还希望在没有或只有1个webelements时创建一个数组

谁能告诉我怎样才能做到这一点

我正在使用的站点部分如下所示:

<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>

与XPath相比,我对CSS选择器有更多的经验,但是有
browser.elements
方法。该方法返回1个或多个与特定选择器匹配的元素

您可以将
browser.elements
简化为
browser.$$
,如果您愿意的话

然后使用
elementIdText
提取“未结”订单的元素文本值

返回的响应是一个结果数组,对应于订单行及其状态

现在我们有了一个“未结订单状态”数组,让我们获得这些状态的文本值

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


希望这有帮助!

我对CSS选择器的使用经验比XPath丰富,但是,有
browser.elements
方法。它返回1个或多个与特定选择器匹配的元素

您可以将
browser.elements
简化为
browser.$$
,如果您愿意的话

然后使用
elementIdText
提取“未结”订单的元素文本值

返回的响应是一个结果数组,对应于订单行及其状态

现在我们有了一个“未结订单状态”数组,让我们获得这些状态的文本值

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

希望这有帮助

//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
   }
}