You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用execute_script向iframe富文本框传入长文本失败求助

解决Selenium向TinyMCE iframe传入长文本的execute_script报错问题

我之前也踩过类似的坑,直接把长文本拼进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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:08:08