【问题标题】:Selenium - copying and pasting XPATH from XPath Helper - "The expression is not a legal expression"Selenium - 从 XPath Helper 复制和粘贴 XPATH - “表达式不是合法表达式”
【发布时间】:2023-04-02 07:49:01
【问题描述】:

这对我来说是一个有点令人烦恼的错误。我正在尝试使用 selenium 来查找元素,但偶尔会出现 The expression is not a legal expression 错误 - 即使我直接从浏览器复制并粘贴 XPATH(并转义所有单引号) .

为什么会这样?我直接从网页复制 XPATH。

感谢您的帮助!

例如。根据 XPath Helper:这是 youtube 搜索中第一个结果标题的 XPATH:

/html[@class='guide-pinned show-guide no-focus-outline']/body[@id='body']/div[@id='body-container']/div[@id='page-container']/div[@id='page']/div[@id='content']/div[@class='branded-page-v2-container branded-page-base-bold-titles branded-page-v2-container-flex-width']/div[@class='branded-page-v2-col-container']/div[@class='branded-page-v2-col-container-inner']/div[@class='branded-page-v2-primary-col']/div[@class='   yt-card  clearfix']/div[@class='branded-page-v2-body branded-page-v2-primary-column-content']/div[@id='results']/ol[@id='section-list-961996']/li/ol[@id='item-section-948865']/li[1]/div[@class='yt-lockup yt-lockup-tile yt-lockup-video vve-check clearfix yt-uix-tile']/div[@class='yt-lockup-dismissable']/div[@class='yt-lockup-content']/h3[@class='yt-lockup-title']/a[@class='yt-uix-tile-link yt-ui-ellipsis yt-ui-ellipsis-2 yt-uix-sessionlink     spf-link ']

我知道这种方法不一定是通用的,但我希望它至少可以在完全匹配的情况下工作。

在python中,我的代码是:

first_result_xpath = #the XPATH above with single quotes escaped

try:
    first_result_element = driver.find_element(By.XPATH, first_result_xpath)
except:
    print "Exception: Could not locate element"

【问题讨论】:

  • 你能提供任何可重现的例子吗?谢谢。
  • 当然可以。一秒
  • 发布您正在处理的实际html 通常是个好主意。这使得调试更容易。另一方面,使用浏览器从网页复制 xpath 始终不是一个好主意,因为文档结构很容易更改并使您复制的 xpath 无效

标签: xml selenium xpath


【解决方案1】:

我不完全确定那个 xpath 选择器有什么问题。它看起来是有效的,虽然它不是一个好的选择器,因为有两个问题:
1. 页面结构可能发生变化,导致选择器失效。
2.这部分选择器/ol[@id='item-section-948865']很可能是在页面加载时生成的。

您可以使用的更好的选择器如下:

(//a[@class='yt-uix-tile-link yt-ui-ellipsis yt-ui-ellipsis-2 yt-uix-sessionlink     spf-link '])[1]

这将返回//a[@class=""] 选择器的第一个结果。使用()[n] 将返回() 中选择器的第n 个结果。

为简洁起见,此 xpath 选择器也可用于查找搜索结果的第一个链接:

(//a[contains(@class,'yt-uix-tile-link')])[1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多