You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python Selenium中出现"Object of type bytes is not JSON serializable"错误的原因解析与解决

问题分析与解决方案

错误成因

这个JSON序列化错误的根源很明确:你在使用By.PARTIAL_LINK_TEXT定位元素时,传入了elt.text.encode('utf-8')——这会把原本的字符串转成bytes类型。而Selenium和浏览器之间的通信依赖JSON格式传递参数,JSON标准并不支持直接序列化bytes对象,所以就触发了TypeError: Object of type bytes is not JSON serializable错误。

而且额外提一句,PARTIAL_LINK_TEXT定位器本身就要求传入字符串类型的匹配文本,你完全不需要对elt.text做编码转换,elt.text本身已经是字符串了。

修复后的代码

我帮你调整了代码里的问题点,同时优化了小细节:

def getdriver(url):
    s = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=s)
    driver.minimize_window()
    driver.get(url)  # 改成使用传入的url参数,让函数更灵活
    return driver

driver = getdriver("https://address.com")
driver.switch_to.frame('idIframeEngagement')

# 先等待所有目标元素加载完成再获取列表,避免空列表问题
equipes = WebDriverWait(driver, 20).until(
    EC.presence_of_all_elements_located((By.CLASS_NAME, 'menu'))
)

for elt in equipes:
    # 清理文本并判断非空,避免无效定位
    link_text = elt.text.strip()
    if not link_text:
        continue
    # 修复定位器的双重括号问题,直接传入字符串文本
    WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, link_text))
    ).click()
    # 可选:点击后如果页面跳转,记得返回上一页并重新切回iframe,保证后续循环正常执行
    # driver.back()
    # driver.switch_to.frame('idIframeEngagement')

额外优化说明

  • 把固定的URL改成使用函数传入的参数,让getdriver函数更通用;
  • 先等待所有menu元素加载完成再获取,避免因为页面未加载完全导致的空列表;
  • 添加文本非空判断,防止因为元素无文本内容导致的定位失败;
  • 移除了多余的双重括号(你之前写的((By.PARTIAL_LINK_TEXT, ...))是双重元组,Selenium需要的是单层元组);
  • 建议在点击后根据业务逻辑添加返回上一页或重新切换iframe的操作,因为点击链接后页面可能跳转,后续循环的元素定位会失效。

内容的提问来源于stack exchange,提问作者user3612078

火山引擎 最新活动