selenium.common.exceptions.InvalidSelectorException:消息:通过 Selenium 在 scrollIntoView 中使用 xpath 给定的 xpath 表达式无效

selenium.common.exceptions.InvalidSelectorException: Message: Given xpath expression is invalid using xpath within scrollIntoView through Selenium

我使用 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 中的列表”替换我的当前循环,但是代码在需要滚动过滤器上的页面时停止。

这个错误信息...

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 表达式不是 valid/legal 表达式。

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

/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) + ']'))

参考资料

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

  • Message “org.openqa.selenium.InvalidSelectorException: invalid selector: Unable to locate an element with the XPath expression” using sendKeys