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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:41:11