【问题标题】:Combining XPath selectors to select descendant or self组合 XPath 选择器以选择后代或自身
【发布时间】:2017-07-30 10:31:34
【问题描述】:

我正在使用以下 XPath 选择器:

//*[text()="Surname"]//parent::*//following-sibling::*[self::select or self::input or self::textarea]
//*[text()="Surname"]//parent::*//following-sibling::*//*[self::select or self::input or self::textarea]

要选择输入,请从以下任一结构中的标签中选择或 textarea:

    <div>
      <div><label for="">Surname</label></div>
      <div class="help">Some help text in a tooltip</div>
      <div class="control">
        <div>
            <input type="text" value="" />
        </div>
      </div>
    </div>

或者这个:

    <div>
      <div><label for="">Surname</label></div>
      <div class="help">Some help text in a tooltip</div>
      <input type="text" value="" />
    </div>

这很好用,但是只关注选择器的末尾,我想知道是否可以只使用一个选择器?

我已经在上面的第二个选择器上尝试了 descendant-or-self 而不是 self,但它在选择第二个 dom 结构时不起作用。

【问题讨论】:

  • 你用的是哪个浏览器?
  • 我仍然不确定为什么你不能select an input &lt;input type="text" name="test2" value="" id="test2" /&gt; 显然有一个id="test2"。我错过了什么吗?谢谢
  • 是的,对不起,我的例子很糟糕。我现在将移除所有的钩子。
  • 使用 Chrome。其实第一个选择器同时满足

标签: selenium xpath selenium-webdriver


【解决方案1】:

你可以向上两层寻找任何后代

//*[text()="Surname"]//..//..//*[self::select or self::input or self::textarea]

【讨论】:

    【解决方案2】:

    以下 XPath 标识包含具有“姓氏”值的 label 元素的 div 元素,然后使用 following-sibling:: 轴匹配在匹配 @987654325 之后出现的同一级别的任何元素@(可能是第二个示例中的表单元素或包含第一个示例中的表单元素的 div),然后使用带有谓词的 descendant-or-self:: 轴来匹配任何所需的表单元素。

    //div[label = 'Surname']
      /following-sibling::*
        /descendant-or-self::*[self::select or self::input or self::textarea]
    

    【讨论】:

    • 出于兴趣,为什么是单斜杠而不是双斜杠。单一的意思是从根本上,不是吗?
    • 以单斜杠开头的 XPath 将“跳转”到根节点。但是,从 XPath 的中间开始,双斜杠是 descendant:: 轴的简写,它将在上下文节点的任何级别上查找匹配项。在我提供的 XPath 中,following-sibling 可能是我们想要匹配的项目。我想匹配后代或上下文节点,所以需要一个斜杠,然后使用descendant-or-self:: 轴。 homepage.cs.latrobe.edu.au/mjsutherland/WS/current/notes/…
    【解决方案3】:

    按照以下步骤操作:

    1. 尝试在浏览器中打开您的 HTML/页面。
    2. 按 F12 或右键单击并按“检查元素” 浏览器。
    3. 尝试搜索你需要的元素假设&lt;input&gt; 元素。
    4. 右键单击该元素,选择“复制”,然后选择 “复制选择器”。
    5. 验证选择器是否为您提供了正确的 您的情况下的元素&lt;input&gt; 元素。打开浏览器的控制台 并输入$("")
      现在,只需将您复制的元素粘贴在引号和 按回车。您应该会看到 &lt;input&gt; 元素的 html。
    6. 在您的 Selenium 代码使用成功验证后 ByCSSSelector 并粘贴您复制并粘贴的内容 第 5 步中的引号。

    成功运行程序。

    【讨论】:

    • 谢谢@Ashraf.Shk786 我知道如何验证它。更多的是关于在 1 个选择器中捕获我所追求的内容。
    【解决方案4】:

    我不确定为什么这在以前不起作用,但第一个选择器现在实际上涵盖了这两种情况。我刚刚意识到parent::* 也可以是..

    //*[text()="Surname"]//..//following-sibling::*[self::select or self::input or self::textarea]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 2019-10-11
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2020-03-05
      相关资源
      最近更新 更多