Selenium VBA Edge自动化:If-Else块display属性判断失效问题
问题描述
我用VBA结合Selenium进行Edge浏览器自动化,脚本其他部分运行正常,但If-Else判断逻辑出错。完整代码如下:
Dim Obj As New WebDriver ' search for company - SF 1cr and above Sub EdgeAutoSF1CRA0() Set Obj = New Selenium.EdgeDriver Dim ele As WebElement Dim By As New Selenium.By Obj.SetCapability "ms:edgeOptions", "{""excludeSwitches"":[""enable-automation""]}" Obj.Start "edge", "" Obj.Get "https://*********************" Obj.Window.Maximize Obj.FindElementByName("croreAccount").SendKeys ("Search") Obj.FindElementByXPath("//*[@id='loadSuitFiledDataSearchAction']/div[1]/div[3]/div[4]/img").Click Obj.FindElementById("borrowerName").SendKeys (ThisWorkbook.Sheets("Sheet1").Range("C5").Value) Obj.FindElementByXPath("//*[@id='search-button']/ul/li[1]/div/input").Click Obj.Wait 30000 If Obj.FindElementByCss("#downloadReport").Attribute("Style" = "display") = "none" Then Obj.FindElementByXPath("//*[@id='three-icons']/ul/li[3]/a/div").Click Else Obj.FindElementByXPath("//*[@id='downloadReport']/div").Click End If End Sub
需求是检查id为downloadReport的元素的style属性是否包含display: none,页面对应元素代码为:
<a href="downloadStatusReport" id="downloadReport" style="display: none;"><div class="download-icon">Download</div></a>
但当前代码始终判断为False,执行Else分支的点击操作,导致Runtime Error 11 ElementNotVisible Error(元素不可交互)。
问题分析与修复
你的判断逻辑存在语法错误,Attribute方法的参数应该是属性名称,而非表达式。正确的做法是先获取完整的属性值再做判断,或者直接利用Selenium内置的可见性检查方法。
修复方案1:检查style属性内容
修改If判断语句,先获取元素的style属性,再判断是否包含display: none:
Dim downloadEle As WebElement Set downloadEle = Obj.FindElementByCss("#downloadReport") ' 检查style属性是否包含display: none If InStr(downloadEle.Attribute("style"), "display: none") > 0 Then Obj.FindElementByXPath("//*[@id='three-icons']/ul/li[3]/a/div").Click Else downloadEle.FindElementByTag("div").Click ' 复用已定位元素,避免重复查找 End If
修复方案2:直接使用IsDisplayed方法
Selenium的WebElement对象提供了IsDisplayed方法,可直接判断元素是否可见,比解析style属性更可靠:
Dim downloadEle As WebElement Set downloadEle = Obj.FindElementByCss("#downloadReport") If Not downloadEle.IsDisplayed Then Obj.FindElementByXPath("//*[@id='three-icons']/ul/li[3]/a/div").Click Else downloadEle.Click ' 直接点击父元素a标签,无需定位子div End If
额外优化建议
- 替换固定等待
Obj.Wait 30000为显式等待,提升脚本稳定性:
' 等待downloadReport元素加载完成,超时30秒 Obj.WaitUntil ElementIsPresent, By.Css("#downloadReport"), 30
- 尽量复用已定位的元素,减少重复查找DOM的开销,同时降低定位失败概率。
内容的提问来源于stack exchange,提问作者mps
相关产品推荐
相关产品推荐

