Закрыть всплывающее окно, если оно существует на веб-странице

#html #vba #selenium #web-scraping

#HTML #vba #selenium #очистка веб-страницы

Вопрос:

Я пытаюсь очистить данные с веб-сайта. На веб-странице может появиться диалоговое окно безопасности перед страницей входа.

Я попытался закрыть диалоговое окно с

 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> 

Ответ №1:

Вы должны проверить, существует ли элемент, прежде чем нажимать на него.

Строка, в которой появляется ошибка

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

Проблема в том, что использование IsObject не помогает избежать ошибки, если элемента нет на странице. IsObject проверяет только, является ли это объектом, и возвращает true, даже если объект ничем не является, и вы ранее объявили его как объект.
Вы можете решить эту проблему, проверив, присутствует ли объект с 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 as Dim By As New By в начале вашего кода.
Поэтому, если элемент присутствует, он нажмет на него или продолжит работу.

Комментарии:

1. Я объявил переменный веб-драйвер (Dim Dr как новый Selenium. EdgeDriver)

2. Это для Selenium Chrome, но оно должно работать: если Dr.isElementPresent(By.XPath(«(.//*[@class=»»pa.pa.times»»])[1])) Затем перед выполнением щелчка и удалите проверку Set Dia и isObject

3. MrHim, да, как вы сказали, это сработало нормально, но в некоторых случаях я не получаю это всплывающее диалоговое окно, тогда приведенный выше пример проверяет этот атрибут класса, следовательно, он выдает ошибку..

4. Потому что вам не нужно проверять его с помощью isObject, потому что он может возвращать true, даже если объект отсутствует. Пожалуйста, укажите, какая строка выдает ошибку, какого рода ошибка и если Dia ничего не означает при возникновении ошибки.

5. Ошибка времени выполнения ‘7’ NoSuchElementError, элемент не найден для Css= pa.pa-раз. Это код ошибки, который я вижу для строки «Dr.FindElementByCss(«.pa.pa-times»).Нажмите » когда диалоговое окно не найдено.