【问题标题】:How to check one element is present inside another element in Selenium Webdriver with Java?如何使用 Java 检查 Selenium Webdriver 中的另一个元素中是否存在一个元素?
【发布时间】:2018-10-27 09:00:40
【问题描述】:
<td class="width-90px">
    <h5 class="width-90px text-ellipsis align-center margin-top-bottom-5">
            <i class="fa fa-check font-14 " aria-hidden="true"></i>
    </h5>
</td>

在上面的 html 中class="width-90px" 是一个元素,在这个元素下存在另一个元素class="fa fa-check font-14 ",我们如何提供条件来检查第二个元素是否存在于第一个元素中?

【问题讨论】:

    标签: selenium selenium-webdriver xpath css-selectors


    【解决方案1】:

    您可以将 XPath 与适当的谓词一起使用:

    //td[@class="width-90px" and .//i[@class="fa fa-check font-14 "]]
    

    【讨论】:

    • xpath 有其优点和缺点:优点较少需要驱动程序查找逻辑;缺点它在这两种情况下都会失败,你必须仔细检查发生了什么 1)第一个元素不存在 2)第二个元素也不存在
    • @VladimirEfimov ,1)如果祖先不存在,则无需检查后代,2)如果没有后代,则条件失败。无论如何,这个问题太宽泛了,它没有代码尝试,所以确切的目标和问题不是很清楚
    【解决方案2】:
    WebElement first = driver.findElement(By.xpath(".//*[@class='width-90px']"));
    
    first.findElement(By.xpath(".//*[@class='fa fa-check font-14 ']")).isDisplayed();
    

    工作正常,如果第二个元素不存在于第一个元素中,则其抛出错误。

    【讨论】:

    • @Ash ,另请注意,您的答案并不真正适合您的问题。根据文档isDisplayed() 应该检查 “这个元素是否显示?这种方法避免了必须解析元素的“样式”属性的问题。” 而你想要 ”...检查第二个元素是否存在于第一个元素“中。元素可以在另一个元素内,但被隐藏,所以你的方法会失败
    【解决方案3】:

    如果您的唯一目的是验证 attributeclass="fa fa-check font-14 " 的元素是否存在于 attributeclass="width-90px" 的元素下,您可以构造一个 @987654321 @ 基于简单的祖先后代关系,可以使用以下任一解决方案:

    • XPath:

      //td[@class="width-90px"]//i[@class='fa fa-check font-14']
        ^ -> Ancestor            ^ -> Descendant
      
    • CssSelector:

      td.width-90px i.fa.fa-check.font-14
      ^ ->Ancestor  ^ ->Descendant
      

    注意:使用try-catch{} 块根据祖先-后代关系验证元素的存在

    【讨论】:

      【解决方案4】:

      你必须首先找到类为“width-90px”的元素,在里面你可以检查类为“fa fa-check font-14”的元素,如下所示:

      WebElement first = driver.findElement(By.className("width-90px"));
      
      WebElement second  = first.findElement(By.className("fa fa-check font-14 "));
      

      如果代码中的第二条语句不存在于第一个元素中,它将引发异常。

      【讨论】:

      • second.isDisplayed();不会验证第二个元素是否存在于第一个元素中,它只会检查页面上是否存在元素。 @Mitul Lakhani
      • @Ash 是的,我提到在我回答的最后一个语句中,它将检查元素是否显示。如果元素不存在,则第二行代码抛出异常。所以这段代码很有用
      • @MitulLakhani ,注意你不能将复合类名传递给By.className,所以你的代码会导致异常
      • @Andersson 任何定位器(对测试人员来说都很好)可以用来代替类名,但同样的方法也可以
      • @MitulLakhani ,是的,任何一个都可以使用,但是你选择了一个不起作用的
      【解决方案5】:

      您可以使用 Xpath Axes 实现此目的:

      WebElement element = driver.findElement.(By.xpath("//td[@class='width- 
                           90px']/following-sibling::h5/i[@class='fa fa-check font-14']));
      if(element != null)
         //element is inside first 
      else
         //element is not the child of first
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-29
        • 2017-01-25
        • 2020-12-03
        • 2016-12-31
        • 2010-11-20
        • 2019-02-12
        相关资源
        最近更新 更多