小能豆

TypeError:使用 Selenium 4 的相对定位器和 Python 3 时,RelativeBy 类型的对象不是可 JSON 序列化的错误

py

我正在运行 Python 3.7.1 和Selenium 4.0.0a6。我想在 Selenium 4 中使用新的相对定位器函数,但总是得到:

TypeError: Object of type RelativeBy is not JSON serializable

错误。

更具体地说,我首先调用:

the_name = driver.find_element(By.XPATH, "//h3[contains(text(),'New_6')]")

(不带双引号)。我知道我已成功获取该元素,因为当我执行以下代码时:

print(the_name.text)

我回来了New_6

然后我打电话:

dotz = driver.find_element(with_tag_name("XPATH").to_right_of(the_name))

(我正在寻找的元素位于 the_name 的右侧)。不幸的是,我收到了not JSON serializable消息。

我正在处理的页面如下所示:

<h3 class="renameable" contenteditable="false" style="" xpath="1">New_6</h3>
<span class="icon icon-threedots action dijitDownArrowButton" role="img" aria-label="more options" tabindex="-1" id="dijit__HasDropDown_7" widgetid="dijit__HasDropDown_7" popupactive="true" aria-expanded="false" aria-owns="dijit_TooltipDialog_12" xpath="1"></span>

有什么想法吗?


阅读 6

收藏
2025-01-13

共1个答案

小能豆

在 Selenium 4 中使用新的相对定位器(RelativeLocator)功能时遇到 TypeError: Object of type RelativeBy is not JSON serializable 错误,可能是由于 Selenium 4.0.0a6 的早期 alpha 版本中存在的 bug。建议更新到稳定版本的 Selenium 以获得更好的兼容性和错误修复。

以下是解决问题的步骤和代码示例:


步骤 1:更新 Selenium

确保你使用的是最新的稳定版本的 Selenium:

pip install --upgrade selenium

目前的稳定版本是 Selenium 4.10.0(或更新版本)。如果你仍在使用 alpha 版本,可能会遇到不支持的功能。


步骤 2:修复代码

在使用 RelativeLocator 时,代码应如下所示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.relative_locator import locate_with

# 设置 WebDriver
driver = webdriver.Chrome()  # 替换为你的浏览器驱动程序
driver.get("https://your-website-url.com")  # 替换为你的目标 URL

# 定位参考元素
the_name = driver.find_element(By.XPATH, "//h3[contains(text(),'New_6')]")
print(the_name.text)  # 验证是否正确找到参考元素

# 使用 RelativeLocator 定位目标元素
dotz = driver.find_element(
    locate_with(By.XPATH, ".//span").to_right_of(the_name)
)

# 验证目标元素
print(dotz.get_attribute("class"))

关键点

  1. 使用 locate_with
  2. locate_with(By.TAG_NAME, "span").to_right_of(the_name) 指定了目标元素位于参考元素 the_name 的右侧。
  3. 替换 By.XPATH 为适合你的 HTML 的选择器类型。

  4. 元素的正确定位:

  5. 确保 XPATH 是唯一的,以避免误选其他元素。
  6. 如果参考元素 the_name 的定位不唯一,可能导致目标定位失败。

  7. 错误处理:

  8. 如果目标元素可能不存在,请添加错误捕获逻辑:
    python try: dotz = driver.find_element( locate_with(By.XPATH, ".//span").to_right_of(the_name) ) print("Found element:", dotz.get_attribute("class")) except Exception as e: print("Error locating element:", e)

注意事项

  1. JSON 序列化问题:
  2. not JSON serializable 通常是因为旧版本 Selenium 中的 RelativeLocator 未正确处理序列化。在更新到稳定版本后,这个问题应该可以解决。

  3. 调整 XPATH:

  4. 如果 By.XPATHto_right_of 结合使用不符合需求,检查你的目标页面结构,确认 the_namedotz 是否真的位于预期的相对位置。

  5. 调试相对定位:

  6. 使用类似 find_elements 来调试:
    python all_spans = driver.find_elements(By.XPATH, ".//span") for span in all_spans: print(span.get_attribute("class"))

如果问题在更新 Selenium 后仍未解决,请确认你的 HTML 结构和环境配置。

2025-01-13