使用VBA Excel+Selenium调用DeepL翻译无法获取结果的问题求助
问题描述
我正在编写一个Excel VBA函数,通过Selenium调用Chrome浏览器(DeepL不支持IE)抓取DeepL网页实现句子翻译,代码如下:
Public Function deepL(txt As String, inputLang As String, outputLang As String) Dim url As String Dim driver As New WebDriver url = "https://www.deepl.com/translator#" & inputLang & "/" & outputLang & "/" & txt driver.Start "Chrome" driver.Timeouts.ImplicitWait = 5000 driver.Get url deepL = driver.FindElementById("target-dummydiv").Text driver.Close End Function ---- Sub translating() 'test for word "probando" from "es" to "en" 'url: https://www.deepl.com/translator#es/en/probando 'it should return: "testing" MsgBox (deepL("probando", "es", "en")) End Sub
测试时发现,页面加载后存放翻译结果的div初始为空,使用Get方法获取到的文本为空,但1秒后页面刷新会显示正确结果:
<div id="target-dummydiv" aria-hidden="true" class="lmt__textarea lmt__textarea_dummydiv" lang="en-US">testing</div>
我尝试添加5秒隐式等待,但结果依旧。我还发现该翻译div的visibility属性为hidden,手动设置可见后能得到正确结果,但不知如何在代码中实现。请问我哪里操作有误?
解决方案
问题根源
- 隐式等待不适用:隐式等待仅保证元素被找到,无法等待元素内的动态文本加载完成。DeepL翻译结果是异步渲染的,DOM加载完毕后翻译请求仍在后台处理,此时元素存在但文本为空。
- 可见性并非核心问题:
aria-hidden="true"或visibility:hidden不会阻止获取元素文本,手动设置可见后能拿到结果只是因为等待时间足够让翻译完成,并非可见性本身的影响。
修正代码
改用显式等待,直接等待目标元素的文本非空,确保翻译结果渲染完成后再取值:
Public Function deepL(txt As String, inputLang As String, outputLang As String) Dim url As String Dim driver As New WebDriver Dim wait As New WebDriverWait url = "https://www.deepl.com/translator#" & inputLang & "/" & outputLang & "/" & txt driver.Start "Chrome" ' 设置最长等待10秒,可根据网络情况调整 Set wait = New WebDriverWait(driver, 10) driver.Get url ' 等待目标元素文本不为空 wait.Until(Function(d) d.FindElementById("target-dummydiv").Text <> "") deepL = driver.FindElementById("target-dummydiv").Text driver.Quit ' 关闭整个浏览器进程,避免残留 End Function Sub translating() ' test for word "probando" from "es" to "en" ' url: https://www.deepl.com/translator#es/en/probando ' it should return: "testing" MsgBox deepL("probando", "es", "en") End Sub
额外优化点
- 用
driver.Quit替代driver.Close,彻底关闭Chrome进程,防止内存占用; - 若遇反爬,可添加浏览器启动参数优化:
driver.AddArgument "--headless=new" ' 无头模式,不显示浏览器窗口 driver.AddArgument "--disable-images" ' 禁用图片加载,提升速度 driver.Start "Chrome" - 频繁调用时,可将浏览器实例设为模块级变量,复用连接减少启动开销。
内容的提问来源于stack exchange,提问作者Gustavo Rodriguez Coronas
相关产品推荐
相关产品推荐

