Selenium - 按类名获得第一级孩子

时间:2017-03-25 15:27:23

标签: java selenium

我使用Java Selenium 2.0。这是我的HTML元素,它包含注释和回复注释:

<div class="comment-list">
    <div class="comment">
       <a class="content">Comment 1</a>
       <div class="reply-comment">
           <div class="comment">
               <a class="content">Comment 1.1</a>
           </div>
           <div class="comment">
               <a class="content">Comment 1.2</a>
           </div>
       </div>
    </div>
    <div class="comment">
        <a class="content">Comment 2</a>
    </div>
</div>

如何在评论中选择内容但没有回复评论? 这是预期的结果:

- Comment 1
- Comment 2

注意:我不想使用绝对的css选择器,例如:

 comment-list > comment > content

解决!这是我的解决方案:

// Mark reply comments with a class "is-reply-comment"
JavascriptExecutor js = (JavascriptExecutor) driver;
List<WebElement> replyCommentElements = driver.findElements(By.cssSelector(".reply-comment .comment"));
for (WebElement replyCommentElement : replyCommentElements) {
    js.executeScript("arguments[0].className += ' is-reply-comment'", replyCommentElement);
}
// Find comments except comments were marked "is-reply-comment"
List<WebElement> parentCommentElements = driver.findElements(By.cssSelector(".comment:not(.is-reply-comment)")

2 个答案:

答案 0 :(得分:2)

您可以使用XPath

//div[not(@class='reply-comment')]/div/a[@class='content']

但这与CSS选择器

的差别不大
div.comment-list > div.comment > a.content

但CSS选择器更快,浏览器支持更好,并且在浏览器之间比XPath更一致地实现。

答案 1 :(得分:0)

看起来这种选择的XPath会有点长。

但是,可以使用not()contains()

来实现
  

//一个[@class =&#39;内容&#39;而不是(包含(text(),&#39;。&#39;))] / text()

它准确地选择了你需要的东西:

enter image description here

BTW 您的<a>元素没有关闭标记</a>

<强>更新

我看到了你的评论,在这种情况下,我只能建议以下解决方案:

  

// DIV [@class =&#39;注释列表&#39;] / DIV /一个[@class =&#39;内容&#39;] /文本()

在这种情况下,选择仍然正确。