XPath 查找子元素的父元素

sal*_*d11 4 html c# selenium xpath

我有这样的结构:

<div class="Container">
  <div class="HighlightContainer">
    <div class="NodeTextHighlightContainer">
      <span class="TreeItemSelected">Products</span>
    </div>
    <button class="ContainerSelectedMenu" type="button"></button>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

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

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

但是,我需要class="ContainerSelectedMenu"根据该跨度元素定位按钮,最好的方法是什么?类似于获取 Container 子元素的父 div 然后找到按钮元素。

mrf*_*ter 8

我已经找到了不同的方法来通过上下遍历来做到这一点,这很好用,但我现在更喜欢这种方法:

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

基本上,您将后代text() = 'Products'作为div您真正想要的标签(即父代)的要求的一部分。然后您可以使用//button, 或//button[@class='ContainerSelectedMenu']

您实际上不需要descendant此处的轴,因此可以通过以下方式对其进行简化:

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

用英语...

  • 找一个div那个
  • 1.有一个@class包含“容器”和
  • 2.有一个span带有文本`Products的后代元素
  • 找到一个传人div是一个button

  • 我认为您需要在 `//span` 之前使用 `.`(所以它会是 `.//span`),以便它从当前上下文开始。 (2认同)