使用execute_script向iframe富文本框传入长文本失败求助
我之前也踩过类似的坑,直接把长文本拼进JS代码里简直是灾难——特殊字符分分钟就把语法搞崩了!你的问题根源其实很清晰:
为什么原来的代码会报错?
当你用'document.body.innerHTML = "%s"' % body_text这种字符串拼接方式时,只要body_text里包含双引号、单引号、换行符或者其他JS语法敏感字符,就会直接破坏整个JS语句的结构,触发SyntaxError。比如文本里的一个双引号会提前闭合你的JS字符串,剩下的内容瞬间就变成了无效代码。
靠谱的解决方案
方案1:通过Selenium参数传递避免字符串拼接
Selenium的execute_script支持直接把Python变量作为参数传入JS,完全不用手动处理字符转义,步骤如下:
# 先切换到目标iframe browserdriver.switch_to.frame("mce_0_ifr") # 定位到tinymce的body元素,将文本作为参数传入JS target_body = browserdriver.find_element_by_id('tinymce') browserdriver.execute_script('arguments[0].innerHTML = arguments[1];', target_body, body_text) # 操作完成后切回主文档(如果后续还要操作其他元素) browserdriver.switch_to.default_content()
这里arguments[0]对应Python传入的第一个参数(target_body元素),arguments[1]对应你的长文本body_text,JS会把它当作完整的字符串对象处理,完全不会有语法问题。
方案2:使用TinyMCE官方API(更推荐)
既然你操作的是TinyMCE富文本编辑器,直接用它提供的setContent方法才是最稳妥的——不仅不会有语法问题,还能兼容编辑器的格式处理逻辑:
# 无需切换iframe,直接调用TinyMCE的实例方法 browserdriver.execute_script('tinymce.get("mce_0").setContent(arguments[0]);', body_text)
tinymce.get("mce_0")会根据你body的data-id="mce_0"找到对应的编辑器实例,setContent方法可以直接接收带多段落的长文本,完美适配你的产品描述需求。
关于你遇到的另一个错误
你提到的Expected an <input> or <textarea>错误,应该是误用了针对普通输入框的方法(比如试图给非输入元素用send_keys),上面的两种方案都是针对TinyMCE的正确操作,不会出现这个问题。
内容的提问来源于stack exchange,提问作者Huynh

