【问题标题】:XPath valid in Firefox but not in ChromeXPath 在 Firefox 中有效,但在 Chrome 中无效
【发布时间】:2022-01-23 21:38:37
【问题描述】:

我正在尝试通过 JupyterLab UI 中的 XPath 查找菜单元素;以下是我感兴趣的菜单中元素列表的摘录,应该是我问题的一个很好的最小示例:

<li tabindex="0" aria-disabled="true" role="menuitem" class="lm-Menu-item p-Menu-item lm-mod-disabled p-mod-disabled lm-mod-hidden p-mod-hidden" data-type="command" data-command="filemenu:logout">
    <div class="f1vya9e0 lm-Menu-itemIcon p-Menu-itemIcon jp-Icon"></div>
    <div class="lm-Menu-itemLabel p-Menu-itemLabel">Log Out</div>
    <div class="lm-Menu-itemShortcut p-Menu-itemShortcut"></div>
    <div class="lm-Menu-itemSubmenuIcon p-Menu-itemSubmenuIcon"></div>
</li>

<li tabindex="0" role="menuitem" class="lm-Menu-item p-Menu-item" data-type="command" data-command="hub:logout"><div class="f1vya9e0 lm-Menu-itemIcon p-Menu-itemIcon jp-Icon">
     <div class="f1vya9e0 lm-Menu-itemIcon p-Menu-itemIcon jp-Icon"></div>
     <div class="lm-Menu-itemLabel p-Menu-itemLabel">Log Out</div>
     <div class="lm-Menu-itemShortcut p-Menu-itemShortcut"></div>
     <div class="lm-Menu-itemSubmenuIcon p-Menu-itemSubmenuIcon"></div>
</li>

如您所见,两个&lt;li&gt; 项目都包含一个&lt;div&gt; 和文本Log Out,这是我的主要问题,因为我正在尝试编写一个适用于任何菜单项的通用Xpath 表达式。我目前正在尝试使用的是:

//div[contains(@class, 'p-Menu-itemLabel')][text() = '${item}']

其中 ${item} 可以是任何菜单项,因为所有 &lt;li&gt; 项都将具有类似的 div,其中包含文本。问题出现在 Log Out 项上,它是唯一重复两次的项。为了处理这种特殊情况,我虽然使用了

//div[contains(@class, 'p-Menu-itemLabel')][text() = 'Log Out']/..[not(contains(@class,'p-mod-hidden'))]

因为两个&lt;li&gt; 项目之一将不包含该特定类(即当前活动的注销元素)。

这个 XPath 在 Firefox 中运行良好,并且每次都能找到我正在寻找的元素,但是 Chrome 抱怨它不是一个有效的 XPath 表达式。不知何故,这个简化版:

//div[contains(@class, 'p-Menu-itemLabel')][text() = 'Log Out']/..

在 Chrome 中工作,但每当我尝试在父元素(即/..[something])上使用属性选择器时,它都无法将其识别为有效的 XPath。

有人知道为什么吗?我该怎么做才能让 Chrome 将其识别为有效的 XPath?

【问题讨论】:

  • 尝试用parent::* 代替..
  • ../self::* 代表..

标签: xpath google-chrome-devtools robotframework firefox-developer-tools


【解决方案1】:

Chrome 似乎不喜欢直接从 .. 父轴应用谓词。

但您可以修改为使用长格式:parent::*

//div[contains(@class, 'p-Menu-itemLabel')][text() = 'Log Out']/parent::*[not(contains(@class,'p-mod-hidden'))]

或者应用self::*轴然后应用谓词:

//div[contains(@class, 'p-Menu-itemLabel')][text() = 'Log Out']/../self::*[not(contains(@class,'p-mod-hidden'))]

【讨论】:

  • 谢谢,任何一个选项都可以完美运行!
猜你喜欢
  • 2018-09-05
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2011-03-16
  • 2015-06-11
  • 2018-07-05
  • 2014-08-18
相关资源
最近更新 更多