向Selenium驱动注入CSS时Linux出现JavaScript错误 macOS无异常
问题根源
你出现报错的核心原因是手动拼接JavaScript字符串时,CSS里的单引号破坏了JS的语法结构:
你拼接的JS代码里用单引号包裹CSS内容:style.innerHTML = '{css}';,如果CSS文件中存在单引号(比如你遇到的format('woff2')、font-family: 'serif'),这个单引号会提前把JS的字符串边界闭合,后面的CSS内容就变成了非法的JS token,自然抛出Invalid or unexpected token错误。
为什么你觉得Python变量里的单引号允许?
这是误解:只要是未转义的单引号,不管是Python变量里直接写的,还是从文件读的,都会触发这个问题。你之前测试变量里的单引号没出问题,要么是你当时无意中做了转义,要么是测试用的字符串结构刚好没有触发语法断裂。
为什么仅Linux环境报错,macOS正常?
两个核心原因:
- 浏览器/驱动的容错差异:不同平台的浏览器及Selenium驱动的语法容错逻辑不同,macOS上的浏览器版本对这种轻微的语法错误做了自动修复,而Linux上的浏览器版本严格遵循ECMAScript规范直接抛出错误。
- 文件读取差异:
Path.read_text()在不同系统的默认编码、换行符处理逻辑有细微差异,虽然你替换了\n,但部分特殊控制字符可能在Linux环境下没有被正确处理,进一步放大了语法问题。
正确预处理方法
不要手动拼接JS字符串,直接把CSS作为参数传给execute_script,Selenium会自动完成所有特殊字符的转义,完全规避语法问题:
def injectCSS(driver, file): css = Path(file).read_text() # 不需要手动处理换行、引号等特殊字符,Selenium会自动转义 execute = ''' var style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = arguments[0]; document.head.appendChild(style); ''' try: driver.execute_script(execute, css) time.sleep(1) print('CSS injection done') except Exception as e: print(str(e))
如果你一定要手动拼接字符串,就把CSS里所有的单引号做转义处理:css = css.replace("'", "\\'"),但这种方法容易漏处理其他特殊字符,不如传参方案稳妥。
内容的提问来源于stack exchange,提问作者Madamadam
相关产品推荐
相关产品推荐

