【问题标题】:What is the difference between .// and //* in XPath?XPath 中的 .// 和 //* 有什么区别?
【发布时间】:2016-06-07 00:16:59
【问题描述】:

通过 Firebug 查找相对 XPath 时:它像

一样创建
  1. .//*[@id='Passwd']--------- 如果我们不在开头使用点,它的含义是什么?

  2. 只需在 Xpath 中添加 //* -- 它突出显示 --- 各种页面元素 ---------- 它意味着什么?

以下是 Gmail 密码字段的 XPath。 *有什么意义?

  • .//*[@id='Passwd']

  • //child::input[@type='password']

【问题讨论】:

标签: xml selenium xpath selenium-webdriver automated-tests


【解决方案1】:

这里有几个不同的关键 XPath 概念...

绝对与相对 XPath(/.

  • / 引入了一个绝对位置路径,从文档的根目录开始。
  • . 引入了相对位置路径,从上下文节点开始。

命名元素与任何元素(ename*

  • /ename 选择一个 ename 根元素
    • ./ename 选择当前节点的所有ename 子元素。
  • /* 选择根元素,而不考虑名称。
    • ./** 选择上下文节点的所有子元素,无论名称如何。

后代或自我轴 (//*)

  • //ename 选择文档中的所有 ename 元素。
    • .//ename 选择上下文节点处或下方的所有 ename 元素。
  • //* 选择文档中的所有元素,无论名称如何。
    • .//* 选择上下文节点处或下方的所有元素,无论名称如何。

考虑到这些概念,以下是您具体问题的答案...

  • .//*[@id='Passwd'] 表示选择位于或下方的所有元素 具有id 属性值的当前上下文节点等于 'Passwd'.
  • //child::input[@type='password'] 可以简化为 //input[@type='password'] 表示选择所有 input 元素 在具有等于'password'type 属性值的文档中。

【讨论】:

  • 这个答案应该被接受,因为在我看来它是最准确和最完整的。
  • 首先感谢您的回答,我将其作为参考并停止使用文档,因为它确实简洁且严格。您能否指出上下文节点和当前节点之间的区别?跨度>
【解决方案2】:

这些表达式都选择不同的节点集:

.//*[@id='Passwd']

'.' at the beginning 表示当前处理从当前节点开始。 '*' 选择从当前节点下降的所有元素节点,@id-attribute-value 等于 'Passwd'。

如果我们不在开头使用点,它的含义是什么?

然后,您将选择 whole 文档中 @id-attribute-value 等于“Passwd”的所有元素节点。

只需在 XPath 中添加 //* -- 它会突出显示 --- 各种页面元素

这将选择整个文档中的所有元素节点。

下面提到:XPatht 的 Gmail 密码字段是真的 * 有什么意义?

.//*[@id='Passwd']

这将选择从当前节点下降的所有元素节点@id-attribute-value 等于'Passwd'。

//child::input[@type='password']

这将选择所有名为 input@type-attribute-values 等于“密码”的子元素节点。 child:: 轴前缀可以省略,因为它是默认行为。

选择适当表达式的语法解释here at w3school.com

并且解释了轴(当前处理点)here at another w3school.com page

【讨论】:

  • 如果有疑问,请看下面@kjhughes 的好答案。
  • 现在好多了,感谢编辑。请注意,来自 w3schools.com 的信息通常不准确,例如,“节点”和“元素节点”之间的混淆可能源于此错误网页。
【解决方案3】:

XPath 中的点称为“上下文项表达式”。如果您在表达式的开头放置一个点,它将使其特定于上下文。换句话说,它将在您调用“通过 XPath 查找元素”方法的节点的上下文中搜索带有 id="Passwd" 的元素。

.//*[@id='Passwd'] 中的* 有助于将任何元素id='Passwd' 匹配。

【讨论】:

    【解决方案4】:
    1. 对于第一个问题:一切都与上下文有关。您可以查看Syntax 以了解“.”、“..”等的含义。另外,我敢打赌,你找不到比 This Link 更好的解释了。
    2. 第二个问题的简化答案:您通常会使用 td、a、li、div 等 html 标签找到节点。但“*”表示找到与您给定属性匹配的任何标签。当您确定给定属性但不确定该元素可能附带的标签时,通常使用它,例如假设我想要一个 ID 为“xyz”的所有元素的列表,无论它在任何标签中。

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多