SeleniumBase CDP模式下执行JavaScript脚本报"SyntaxError: Illegal return statement"错误的解决方法
SeleniumBase CDP模式下执行JavaScript脚本报"SyntaxError: Illegal return statement"错误的解决方法
这个问题我之前也碰到过,本质是JavaScript语法规则和SeleniumBase执行脚本的逻辑导致的,我来给你拆解清楚原因和解决办法:
问题根源
当你用sb.cdp.evaluate()或者sb.execute_script()执行代码时,这些JavaScript代码是在全局作用域中运行的。而JavaScript的语法规则里,return语句只能出现在函数体内,全局作用域下直接写return是非法的——你原来的脚本里,最后一行的return getSomeValue();就是暴露在全局作用域的,这才触发了SyntaxError: Illegal return statement错误。
两种可行的解决方法
方法1:用立即执行函数表达式(IIFE)包裹代码
把你的逻辑整个包在一个自执行的函数里,这样return语句就处于函数体内,符合语法要求:
script = """ (function() { function getSomeValue() { return '42'; } return getSomeValue(); })(); """
方法2:利用脚本最后一个表达式的返回值
cdp.evaluate()和execute_script()都会自动返回脚本中最后一个表达式的结果,所以你可以去掉全局的return,直接调用函数即可:
script = """ function getSomeValue() { return '42'; } getSomeValue(); """
如果逻辑更简单,还可以进一步简化成直接返回值:
script = "'42'; # evaluate会自动返回最后一个表达式的结果"
修改后的完整代码示例
from seleniumbase import SB with SB(uc=True, locale_code="en", headless=True) as sb: link = "https://news.ycombinator.com" print(f"\nOpening {link}") sb.wait_for_ready_state_complete(timeout=120) sb.activate_cdp_mode(link) # 任选一种方法的script即可 script = """ (function() { function getSomeValue() { return '42'; } return getSomeValue(); })(); """ data = sb.cdp.evaluate(script) # data = sb.execute_script(script) # 这行也可以正常运行 print(data) # 输出:42 print("Finished!")
这样修改后,不管用sb.cdp.evaluate()还是sb.execute_script(),都能正常执行脚本并返回预期的42了。
备注:内容来源于stack exchange,提问作者sudoExclamationExclamation
相关产品推荐
相关产品推荐

