【问题标题】:elementHandle.$x(expression) doesn't seem to be running relative to the elementHandle givenelementHandle.$x(expression) 似乎没有相对于给定的 elementHandle 运行
【发布时间】:2019-12-02 22:26:50
【问题描述】:

我有以下代码获取“总线”层的 elementHandle(在 32 个不同层的列表中)

const [layerFound] = await page.$x("//div[@class='layer']/label[.='Buses']/..");

然后我需要对这个“层”对象中的其他元素进行一些激活/验证。但是下一行不是从 Buses 层抓取“可见切换”对象,而是从 32 列表的第一层抓取一个。

const [layerVis] = await layerFound.$x("//div[contains(@class, 'layer-option visible-toggle')]");

我的理解是 elementHandle.$x(expression) 评估相对于 elementHandle 的 XPath 表达式。但它是相对于页面对象进行的。

其中有很多。第一个是“桥梁”。哪个是被发现/使用的。

<div class="layer">
  <label class="layer-label"><div>Buses</div></label>
  <div class="layer-option entity-count"><div>(629)</div></div>
  <div class="layer-option visible-toggle ">...</div>
  <div class="layer-option layer-preferences-toggle">...</div>
</div>

【问题讨论】:

  • 您需要使用相对 XPath:const [layerVis] = await layerFound.$x(".//div[contains(@class, 'layer-option visible-toggle')]");(XPath 表达式前的点)
  • 哦,对,这完全有道理,但在任何文档中都很难找到。谢谢!!

标签: javascript jestjs puppeteer


【解决方案1】:

您需要使用相对 XPath:

const [layerVis] = await layerFound.$x(".//div[contains(@class, 'layer-option visible-toggle')]");

(XPath 表达式前的点)

否则您的 XPath 将再次从文档根目录搜索。

【讨论】:

  • 文档不应该说它是相对于元素的,当它不是没有添加.时。如果未包含代码,则代码应以. 为前缀,这将使其准确。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
相关资源
最近更新 更多