使用VBA+ADODB Stream下载验证码遇异常问题求助
问题分析与解决方案
1. 验证码下载内容不一致的原因及解决
验证码生成依赖会话Cookie,你用MSXML2.XMLHTTP单独请求图片URL时,没有携带Selenium浏览器中的会话Cookie,服务器会生成新的验证码,自然和页面显示的不一致。
直接改用Selenium的元素截图功能即可解决,无需额外HTTP请求:
Set oCaptcha = .FindElementByXPath("//*[@id='frmCaseNo']/div[2]/img") .Wait 1000 ' 延长等待时间确保元素加载完成 oCaptcha.Screenshot.SaveAs ThisWorkbook.Path & "\Number.png"
2. 其他电脑捕获元素返回空图片的排查方向
- 元素定位不稳定:原XPath可能因页面渲染差异失效,换用更稳定的CSS选择器:
Set oCaptcha = .FindElementByCss("#frmCaseNo div:nth-child(2) img") - 页面加载不充分:
.Wait 500的固定等待时间不适应不同电脑的加载速度,改用显式等待直到元素可见:Dim wait As New WebDriverWait Set wait = New WebDriverWait(waitTime:=10) ' 最长等待10秒 Set oCaptcha = wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='frmCaseNo']/div[2]/img"))) - 驱动与浏览器版本不匹配:其他电脑的浏览器版本和驱动版本不一致,导致元素识别失败,需确保各电脑上的浏览器驱动(如ChromeDriver)与对应浏览器版本完全匹配。
- 会话未正确建立:部分电脑可能因网络或缓存问题未加载会话,打开页面后先刷新一次:
.Get "https://eservices.moj.gov.kw/searchPages/searchCases.jsp" .Refresh
完整优化代码示例
Sub CaptureCaptcha() Dim driver As New ChromeDriver Dim oCaptcha As WebElement Dim wait As New WebDriverWait driver.Start "chrome" driver.Get "https://eservices.moj.gov.kw/searchPages/searchCases.jsp" ' 显式等待验证码元素加载完成 Set wait = New WebDriverWait(waitTime:=10) Set oCaptcha = wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='frmCaseNo']/div[2]/img"))) ' 截取验证码并保存到本地 oCaptcha.Screenshot.SaveAs ThisWorkbook.Path & "\Number.png" driver.Quit End Sub
内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

