Selenium Python的driver.page_source返回内容缺失<!DOCTYPE html>问题咨询
这是Selenium的预期行为。
原因说明
driver.page_source返回的是浏览器完成DOM解析后重新序列化生成的字符串,并非服务器返回的原始HTML源码:
- DOCTYPE属于文档类型节点,火狐浏览器的Gecko驱动默认序列化DOM时不会将DOCTYPE节点包含到输出结果中
- 原始HTML中的换行、缩进属于无意义空白字符,不影响DOM渲染,序列化过程中会被浏览器优化合并或删除,因此出现格式丢失属于正常情况
正确处理方案
方案1:校验原始HTML合规性用原始响应(推荐)
如果你的校验目标是确认服务端输出的HTML符合规范,直接通过HTTP请求拿原始响应内容即可,和你现有单元测试的校验逻辑一致,拿到的内容完全贴合服务端模板输出:
import requests # 从测试服务拿原始HTML resp = requests.get(f"{self.live_server_url}/netlog/") raw_html = resp.text # 直接将raw_html传给html5lib校验即可
方案2:必须在Selenium流程中获取完整HTML
如果你的校验逻辑必须和Selenium的页面操作绑定,可以通过执行JS主动拼接DOCTYPE和DOM内容,避免手动硬编码DOCTYPE出错:
full_html = self.driver.execute_script(""" // 从DOM中读取DOCTYPE信息拼接 const dt = document.doctype; let dtStr = ''; if (dt) { dtStr = `<!DOCTYPE ${dt.name}`; if (dt.publicId) dtStr += ` PUBLIC "${dt.publicId}"`; if (dt.systemId) dtStr += ` "${dt.systemId}"`; dtStr += '>\n'; } // 拼接完整HTML内容 return dtStr + document.documentElement.outerHTML; """)
注:该方案拿到的HTML仍然是DOM序列化后的结果,不会恢复原始缩进换行,仅能解决DOCTYPE丢失的问题
内容的提问来源于stack exchange,提问作者Deepstop
相关产品推荐
相关产品推荐

