如何点击子元素

时间:2019-11-22 14:26:32

标签: javascript selenium selenium-webdriver

有很多项目,我得到了所需项目的对象。但是我不知道如何单击该对象中的子元素。 html:

  <div class="item">
     <div role="button" tabindex="-1">
        <strong>ItemName2</strong>
     </div>
     <div class="d">
        <div class="item-icon" role="button" tabindex="-1"  style="display: none">
          <i aria-label="icon: add" class="add"></i>    <!-- I need to click on this Item  -->
        </div>
        <div class="item-icon" role="button" tabindex="-1"  style="display: none">
          <i aria-label="icon: del" class="del"></i>
        </div>
      </div>
  </div>
  <div class="item"> ... </div>
  <div class="item"> ... </div>
  <div class="item"> ... </div>

js:

 let fBtns = await driver.findElements(By.tagName('strong')); // Find all objects
 let buttons = fBtns.map(elem => elem.getText());
 const allButtons = await Promise.all(buttons);
   console.log(allButtons);  // All object names
 let current = fBtns[fBtns.length - 1];
   console.log(current);    // This is desired object
 await current.click();   // This is click on the object and operates as expected
  // But I need to click on the  <i aria-label="icon: add" class="add"> element
  // How can I click on the desired element?

3 个答案:

答案 0 :(得分:1)

尝试通过触发方法调用click:

$('.item-icon .add').trigger("click");

答案 1 :(得分:1)

要单击元素<i aria-label="icon: del" class="del"></i>,只需使用XPath直接在元素上查询:

await driver.findElement(By.xpath("//div[div/strong[text()='ItemName2']]/div/div/i[@class='del']")).click()

您可以将其缩短为:

await driver.findElement(By.xpath("//div[div/strong[text()='ItemName2']]//i[@class='del']")).click()

答案 2 :(得分:1)

在下面的示例中,我扫描文档以查找动态xpath,该动态xpath使用字符串ItemName2找到强项,然后在向下移动到子元素之前回滚上一层(/../)。这将像waitForElement一样,您可以希望将其用于触发点击。

var MyDefaultTimeout = 1500; 
    var loaded = false;
    do { 
        var icon = document.getElementsByClassName('//*[contains(@strong,\'ItemName2\')]/../div/div/i');
        if(!icon.length == 0)
           {
            setTimeout(function() { loaded = false }, MyDefaultTimeout);
           }
        else
           { 
           if(!document.readyState === 'complete')
              {
               setTimeout(function() { loaded = false }, MyDefaultTimeout);
              }
           else
              {
               loaded = true;
               return document.readyState;
              }
           }
        }
        while(loaded === false);