Я пытался найти ответ, но безрезультатно. Я каждый раз ударяюсь о стену. Может быть, кто-то может помочь?
Я пытаюсь щелкнуть элемент с помощью VBscript на веб-сайте. Это работает. Однако сначала я хочу проверить, существует ли элемент с циклом. Это сработало бы, если бы не ошибка «Недопустимое использование нуля», которую я получаю с кодом ниже.
Как создать объект, чтобы проверить, существует ли он из элемента IE?
Set IE = WScript.CreateObject("InternetExplorer.Application", "IE_")
IE.Navigate "url"
With IE.Document
Do
if not CreateObject(.getElementByID("formButton2343255")) is nothing then
.getElementByID("formButton2343255").Click()
Exit Do
End if
WScript.Sleep 500
Loop
SET objWshShell = Nothing
End With
End Function
Я ожидаю, что кнопка будет нажата. Но либо мой объект не существует, либо в этом случае я получаю недопустимое использование нуля.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я попробовал код, который вы разместили в моем пользовательском скрипте, и думаю, что нашел решение. Чтобы проверить, существует ли элемент, вы должны использовать функцию IsObject; однако, если вы попытаетесь использовать его до того, как DOM будет готов (т. е. IE.ReadyState равен 4), он выдаст неуказанную ошибку (типичную для вещей, связанных с IE, много-много причуд).
Итак, вместо того, чтобы использовать бесконечный цикл для ожидания существования элемента, я изменил его так, чтобы он ждал, пока DOM не будет готов; Таким образом, к тому времени, когда я вызываю IsObject, он больше не должен выдавать ошибку, давая правильный результат, что позволяет выполнить проверку, как и ожидалось.
Пример ниже открывает окно IE и переходит к https://stackoverflow.com; ждет, пока DOM будет готов, а затем щелкните меню «Теги» на левой боковой панели (#nav-tags); следовательно, переходит на страницу «Теги», как и ожидалось. Очень похоже на ваш пример, так что вы можете легко использовать его в качестве руководства для понимания вашего дела.
Set IE = WScript.CreateObject("InternetExplorer.Application", "IE_")
IE.Navigate "https://stackoverflow.com"
IE.Visible = True
'Wait til DOM is ready
Do Until IE.ReadyState = 4 : Loop
If IsObject(IE.Document.GetElementById("nav-tags")) Then
IE.Document.GetElementById("nav-tags").Click()
End If
Set IE = Nothing
@MushroomKing вы запускаете файл vbs или запускаете VBScript внутри html-страницы в теге сценария?
Я использую файл vbs.
@MushroomKing Я обновил свой ответ, думаю, на этот раз я его понял. Проверьте это.
Здорово! Это лучшее решение, чем то, что я придумал! Я буду использовать его. Большое спасибо. Я использовал "If IsNull(IE.Document.getElementByID("...") Then..." Который также работает в этом случае без ошибок.
@MushroomKing да, IsNull также должен работать после того, как DOM будет готов. В любом случае, не стесняйтесь принять ответ, если он был полезен, ура :{D
Это точно было :). Работает отлично. Спасибо. В настоящее время я действительно застрял на чем-то связанном. Не знаю создавать ли новую тему. Но когда я нажимаю кнопку загрузки, я получаю всплывающее окно от интернет-безопасности и должен нажать «Разрешить». Я попытался обратиться к всплывающему окну с помощью PID, но оно встроено в IE. :S не уверен, как сфокусироваться на нем и как "ждать" его загрузки....
Я не уверен, возможно ли это, но это был бы совершенно новый вопрос, который нужно задать на SO.
Спасибо за ответ lenilsondc! Ну, когда я это делаю, я получаю сообщение об ошибке «Требуется объект». Извините, позвольте мне отредактировать исходный пост, указав полную процедуру, включая WITH. Может я что-то там не так сделал?