【问题标题】:Selenium xpath issueSelenium xpath 问题
【发布时间】:2020-02-18 16:33:24
【问题描述】:

我在使用 selenium 和 xpath 时遇到了一个非常奇怪的问题。我有一个页面可以呈现 25 个 <a> 并带有嵌套的 <img/> 标签。我需要使用findElements() 所有这些元素。如果我获得页面源并通过文本搜索以下子字符串:“alt="Expand List"" 我会出现 25 次。但是当我执行命令let items = await driver.findElements(By.xpath("//a[//img[contains(@alt,'Expand List')]]")) 时,我得到了 32 个项目。我在 google chrome 中记录了这些项目,并在列表中添加了 <a>,其中包含具有不同 alt 值的图像。有任何想法吗?这段代码:

    let text = await driver.getPageSource();
    var count = (text.match(/alt="Expand List"/g) || []).length;
    let items = await driver.findElements(By.xpath("//a[//img[contains(@alt,'Expand List')]]"))
    console.log(count, items.length); //outputs 25, 32

这张带有 alt Collapse List 的图片出现在 <a>

【问题讨论】:

  • 你能试试像//a//img[contains(@alt,'Expand List')]这样的XPATH吗?
  • 我认为您的 xpath 错误地定义了谓词。我认为(?)它正在找到任何 A ,然后为您的谓词 (//img[contains(@alt,'Expand List')]) 返回 true,因为它使用 //。试试上面评论中的例子,我认为它更接近你的意图。

标签: javascript selenium selenium-webdriver web-scraping selenium-chromedriver


【解决方案1】:

你的 xpath 应该更像:

//a/img[contains(@alt,'Expand List')]

一个斜线表示它是父级 //a 的子级。

我强烈建议使用浏览器插件来测试 xpath。我几乎每天都使用的一个是 ChroPath。您还可以在 devtools 控制台中使用类似

的东西来测试 xpath
$x('//a/img[contains(@alt,'Expand List')]')

会给出这样的输出:

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2022-11-18
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多