XPath 在 Firefox 中有效但在 Chrome 中无效

XPath valid in Firefox but not in Chrome

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

<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>

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

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

其中 ${item} 可以是任何菜单项,因为所有 <li> 项都将具有类似的 div,其中包含文本。问题出现在注销项上,这是唯一重复两次的项。为了处理这种特殊情况,我不得不使用

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

因为两个 <li> 项目中的任何一个都不包含该特定 class(即当前活动的注销元素)。

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

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

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

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

似乎 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'))]