我正在运行 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消息。
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>
有什么想法吗?
在 Selenium 4 中使用新的相对定位器(RelativeLocator)功能时遇到 TypeError: Object of type RelativeBy is not JSON serializable 错误,可能是由于 Selenium 4.0.0a6 的早期 alpha 版本中存在的 bug。建议更新到稳定版本的 Selenium 以获得更好的兼容性和错误修复。
RelativeLocator
Selenium 4.0.0a6
以下是解决问题的步骤和代码示例:
确保你使用的是最新的稳定版本的 Selenium:
pip install --upgrade selenium
目前的稳定版本是 Selenium 4.10.0(或更新版本)。如果你仍在使用 alpha 版本,可能会遇到不支持的功能。
alpha
在使用 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"))
locate_with
locate_with(By.TAG_NAME, "span").to_right_of(the_name)
the_name
替换 By.XPATH 为适合你的 HTML 的选择器类型。
By.XPATH
元素的正确定位:
如果参考元素 the_name 的定位不唯一,可能导致目标定位失败。
错误处理:
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)
not JSON serializable 通常是因为旧版本 Selenium 中的 RelativeLocator 未正确处理序列化。在更新到稳定版本后,这个问题应该可以解决。
调整 XPATH:
如果 By.XPATH 和 to_right_of 结合使用不符合需求,检查你的目标页面结构,确认 the_name 与 dotz 是否真的位于预期的相对位置。
to_right_of
dotz
调试相对定位:
find_elements
python all_spans = driver.find_elements(By.XPATH, ".//span") for span in all_spans: print(span.get_attribute("class"))
如果问题在更新 Selenium 后仍未解决,请确认你的 HTML 结构和环境配置。