【问题标题】:Close popup if existing on the web page如果网页上存在,则关闭弹出窗口
【发布时间】:2021-03-07 05:27:44
【问题描述】:

我正在尝试从网站上抓取数据。网页可能会在登录页面前弹出安全对话框。

我试图用

关闭对话框
Dr.FindElementByCss(".pa.pa-times").Click

在某些情况下它不显示弹出对话框,那么我上面的代码会抛出错误。

如果弹出对话框不存在,它应该继续下一行代码。

Sub abc()

    Dim Dr As New Selenium.EdgeDriver
    Dr.Get "url.com"

    Dim Dia As Object
    Set Dia = Dr.FindElementByCss(".pa.pa-times")
    If IsObject(Dia) Then
        Dr.FindElementByCss(".pa.pa-times").Click
    Else
    End If
    '------------------------
    other line of code continues
    '------------------------ 

End Sub

Html 代码供您参考。

<div class="row announcements-row">
            <div class="col-lg-8 right-col">
                <div class="modal-content">
                    <div class="modal-header">
                        <h2 class="modal-title">
                            Password Security Improvement
                            <span class="close-modal" onclick="loginAnnouncement()"><span><i class="pa pa-times"></i></span></span>
                        </h2>
                    </div>
                    <div class="modal-body">
                        ****abc****. <br>
                            <ul>
                            <li>Can't login? </li>
                            </ul>

                    </div>
                </div>
            </div>
        </div>

【问题讨论】:

    标签: html vba selenium web-scraping


    【解决方案1】:

    您必须在单击之前检查元素是否存在。

    得到错误的行是

    Dr.FindElementByCss(".pa.pa-times").Click
    

    问题是如果元素不在页面上,使用IsObject 并不能帮助您避免错误。 IsObject 仅检查它是否为 Object 并返回 true,即使该对象为 Nothing 并且您之前将其声明为对象。 您可以通过检查对象是否存在 IsElementPresent 及其 XPath 来解决它:

    If Dr.IsElementPresent(By.XPath("(.//*@class=""pa pa-times""])[1]")) Then
        Set Dia = Dr.FindElementByCss(".pa.pa-times")
        Dr.FindElementByCss(".pa.pa-times").Click
    End If
    

    记得在代码的开头将By 声明为Dim By As New By。 因此,如果元素存在,它将单击它或继续。

    【讨论】:

    • 我声明了可变网络驱动程序(Dim Dr As New Selenium.EdgeDriver)
    • 这适用于 Selenium Chrome,但它应该可以工作:如果 Dr.IsElementPresent(By.XPath("(.//*[@class=""pa.pa.times""])[1 ])) 然后在单击执行之前并删除 Set Dia 和 IsObject 检查
    • MrHim,是的,正如你所说的那样工作正常,但在某些情况下我没有得到那个弹出对话框,那么上面的就像是检查那个类属性,因此它会抛出错误..跨度>
    • 因为您不必使用 IsObject 检查它,因为即使对象不存在它也可以返回 true。请指定出现错误的那一行、错误类型以及发生错误时 Dia 是否为空。
    • 运行时错误'7' NoSuchElementError, Element not found for Css= pa.pa-times。这是我在找不到对话框时看到的“Dr.FindElementByCss(".pa.pa-times").Click”行的错误代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多