#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»).Нажмите » когда диалоговое окно не найдено.