首页 > 解决方案 > selenium.common.exceptions.InvalidSelectorException:消息:给定的 xpath 表达式通过 Selenium 在 scrollIntoView 中使用 xpath 无效

问题描述

我使用 Python 来抓取一个带有需要滚动的过滤器窗格的网站。我找到了一个有助于滚动元素列表的代码,它实际上找到了一个列表并在循环中移动。

recentList = driver.find_elements_by_xpath("/html/body/div[3]/main/div/div/div/div[1]/div/form/div[2]/fieldset[3]/div/ul/li")
for list in recentList:
    driver.execute_script('arguments[0].scrollIntoView({behavior: "smooth", block: "end", inline: "nearest"})', list)

我的代码已经包含一个 for 循环,我只想添加一个需要滚动到的元素。使用上面我写的逻辑(一个循环被简化):

for p in range(1,15):
    list = driver.find_element_by_xpath(str('/html/body/div[3]/main/div/div/div/div[1]/div/form/div[2]/fieldset[3]/div/ul/li[[' + str(p) + ']'))
    driver.execute_script('arguments[0].scrollIntoView({behavior: "smooth", block: "end", inline: "nearest"})', list)

我不知道为什么它不起作用。这是我得到的错误:

selenium.common.exceptions.InvalidSelectorException: Message: Given xpath expression "/html/body/div[3]/main/div/div/div/div[1]/div/form/div[2]/fieldset[3]/div/ul/li[[1]" is invalid: SyntaxError: The expression is not a legal expression.

有谁知道需要修复什么?最后一个代码中的 XPath 是正确的,并且已经在使用中。

我试图用“recentList 中的列表”替换我当前的循环,但是当它需要滚动过滤器上的页面时代码会停止。

标签: javascriptseleniumxpathjs-scrollintoviewexecute-script

解决方案


此错误消息...

selenium.common.exceptions.InvalidSelectorException: Message: Given xpath expression "/html/body/div[3]/main/div/div/div/div[1]/div/form/div[2]/fieldset[3]/div/ul/li[[1]" is invalid: SyntaxError: The expression is not a legal expression.

...暗示XPath表达式不是有效/合法的表达式。

如果您在错误中观察到有效的,则表达式中还有一个额外的第三个括号开口:

/html/body/div[3]/main/div/div/div/div[1]/div/form/div[2]/fieldset[3]/div/ul/li[[1]

解决方案

要删除额外的第三个括号开口,您需要将xpath 表达式调整为:

list = driver.find_element_by_xpath(str('/html/body/div[3]/main/div/div/div/div[1]/div/form/div[2]/fieldset[3]/div/ul/li[' + str(p) + ']'))

参考

您可以在以下位置找到一些相关的讨论:


推荐阅读