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




