如何选择div中没有​​特定类的元素

时间:2017-05-17 16:20:22

标签: selenium xpath selenium-webdriver css-selectors

我有如下的html。我希望那些webelments通过CSSselector或xpath不具备div<类="锁定" 谁能帮我。输出应该是两个元素 "我是免费的视频1" &安培;我是免费视频2。

锁定视频

x[m]

免费视频1

<div class="item video " data-reactid="165">
    <a href="/video/peppa/xyz" data-reactid="166">
        <div class="LazyLoad is-visible" style="height:168px;" data-reactid="167">
            <img class="visual-video" src="https://abc.jpg?w=300" alt="I am locked video">
        </div>
        <p class="text" data-reactid="168">Episodio completo</p>
        <img class="video" src="/images/icon-video.svg" data-reactid="169">
        <div class="locked" data-reactid="170">
            <div class="opaque" data-reactid="171"></div>
            <p data-reactid="172">Activa tu cuenta</p>
        </div>
    </a>
    <p class="name" data-reactid="173">I am locked video</p>
</div>

免费视频2

<div class="item video " data-reactid="185">
    <a href="/video/ghi" data-reactid="186">
        <div class="LazyLoad is-visible" style="height:168px;" data-reactid="187">
            <img class="visual-video" src="https://ghi.jpg?w=300" alt="I am free video1">
        </div>
        <p class="text" data-reactid="188">Episodio completo</p>
        <img class="video" src="/images/icon-video.svg" data-reactid="189">
    </a>
    <p class="name" data-reactid="190">I am free video1</p>
</div>

4 个答案:

答案 0 :(得分:1)

这对XPath来说相对简单:

//div[contains(@class, 'video') and not(div[@class='locked'])]

请注意,严格来说,为避免误报,您应该handling the class attribute values properly

//div[contains(concat(' ', @class, ' '), ' video ') and 
      not(div[contains(concat(' ', @class, ' '), ' locked ')])]

答案 1 :(得分:0)

如果您的CSS实现支持:not()“伪元素”选择器,那么您可以尝试

.item.video:not(div.locked) p.name

比照https://www.w3.org/wiki/CSS/Selectors/pseudo-classes/:not

这可能过于具体,因为我不理解加价的背景。

对于XPath,我认为它会是这样的:

//div[contains(@class, 'video') and not(.//div[contains(@class, 'locked')])]//p[contains(@class,'name')

答案 2 :(得分:0)

这些文本是否不变?如果是,那么您可以从文本中获取元素。

  

How do I find an element that contains specific text in Selenium Webdriver (Python)?

答案 3 :(得分:0)

这是一个有趣的问题,我提出了一个想法。

我的想法是首先捕获所有视频,然后从所有视频列表中删除锁定的视频。代码如下,

  //Gather all the videos
  List<WebElement> all = driver.findElements(By.xpath("//div[@class,'item video']/a"));

  //Gather the videos which has locked
  List<WebElement> locked = driver.findElements(By.xpath("//div[@class,'item video']//div[@class,'locked']"));

  //Remove the locked videos from all videos
  for(WebElement lock : locked)
  {
      all.remove(lock);
  }


  //Now "all" contains only the free videos.
  for(WebElement free : all)
  {
      //Do the stuff
  }

注意 - 未经测试。如果有效,请检查并告诉我