【发布时间】: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>
如您所见,两个<li> 项目都包含一个<div> 和文本Log Out,这是我的主要问题,因为我正在尝试编写一个适用于任何菜单项的通用Xpath 表达式。我目前正在尝试使用的是:
//div[contains(@class, 'p-Menu-itemLabel')][text() = '${item}']
其中 ${item} 可以是任何菜单项,因为所有 <li> 项都将具有类似的 div,其中包含文本。问题出现在 Log Out 项上,它是唯一重复两次的项。为了处理这种特殊情况,我虽然使用了
//div[contains(@class, 'p-Menu-itemLabel')][text() = 'Log Out']/..[not(contains(@class,'p-mod-hidden'))]
因为两个<li> 项目之一将不包含该特定类(即当前活动的注销元素)。
这个 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