首页 文章

XPath查找子元素的父元素

提问于
浏览
0

我有这样的结构:

<div class="Container">
  <div class="HighlightContainer">
    <div class="NodeTextHighlightContainer">
      <span class="TreeItemSelected">Products</span>
    </div>
    <button class="ContainerSelectedMenu" type="button"></button>
  </div>
</div>

由于DOM的行为方式和尝试保持动态,我只能定位包含文本产品的范围 . 使用类似的东西:

Driver.FindElement(By.XPath("//div[contains(@class, 'Container')]/descendant::span[text() = 'Products']"));

但是,我需要根据该span元素确定 class="ContainerSelectedMenu" 的div,最好的方法是什么?有点像获取Container的子div的父div然后找到button元素 .

2 回答

  • 1

    我已经找到了不同的方法,通过上下往复运行来做到这一点很好,但我现在的偏好是这种方法:

    xpath = "//div[contains(@class, 'Container') and descendant::span[text() = 'Products']]//button";
    

    基本上,你把 text() = 'Products' 的后代作为你真正想要的 div 标签的要求的一部分,这是父 . 然后你可以使用 //button//button[@class='ContainerSelectedMenu'] 轻松搜索按钮

    你实际上这里不需要 descendant 轴,因此可以简化一下:

    xpath = "//div[contains(@class, 'Container') and .//span[text() = 'Products']]//button";
    

    用英语讲...

    • 找到 div 那个

    • 1.@class ,其中包含"Container"和

    • 2. 有一个带有文本Products的span` 元素

    • 找到 div 的后代 button

  • 1

    一种方法是定位 span ,然后转到祖先 div ,然后返回到匹配 class 的元素...

    //span[normalize-space()='Products']/ancestor::div[contains(@class,'Container')]//*[contains(@class,'ContainerSelectedMenu')]
    

    另一种方法是将 div ,然后是 span ,然后上升到两个级别,然后返回到匹配 class 的元素...

    //div[contains(@class,'Container')]//span[normalize-space()='Products']/../../*[contains(@class,'ContainerSelectedMenu')]
    

    另一种方式(类似于@mrfreester)是匹配 div ,测试 span ,并直接转到匹配 class 的元素...

    //div[contains(@class, 'Container') and .//span[normalize-space()='Products']]//*[contains(@class,'ContainerSelectedMenu')]
    

    所有这三个都匹配 button .

相关问题