javascript - 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 中的列表”替换我当前的循环,但是当它需要滚动过滤器上的页面时代码会停止。
解决方案
此错误消息...
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表达式不是有效/合法的表达式。
如果您在错误中观察到有效的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) + ']'))
参考
您可以在以下位置找到一些相关的讨论:
推荐阅读
- c# - 在 android/iOS Keystore C# 上存储私钥和证书 (.pem)
- c++ - 为什么在使用转换构造函数赋值后调用 C++ 类的析构函数?
- java - Stream.map/filter 中的 Lambda 未被调用
- lua - Lua,将循环中的值插入新表
- java - 用于 Json Schema-04/07 生成的 Jackson 注释
- node.js - Sails.js - 欧盟域的 Mailgun API 基本 URL
- android - 资源包装密封类,数据绑定错误
- google-apps-script - 谷歌表格将行移动到另一个表格
- arrays - 在 Unix 中嵌套拆分后查找不同的元素
- c++ - muQueue.front() 给出了 const 实例,即使我没有将它标记为 const