#excel #vba #internet-explorer #web-scraping
#excel #vba #internet-explorer #очистка веб-страниц
Вопрос:
Я пытался в течение нескольких дней. Я могу обновить значение текстовых полей и нажать на кнопки опций, однако я не могу выбрать опцию из выпадающего списка
Чтобы выбрать выпадающий вариант, я попытался:
myHTMLFrame2.all.Item("QSGAA5V0GAFRWAOL34D8OK78W2ZUJO").Focus
myHTMLFrame2.all.Item("QSGAA5V0GAFRWAOL34D8OK78W2ZUJO").selectedIndex = 1
myHTMLFrame2.all.Item("QSGAA5V0GAFRWAOL34D8OK78W2ZUJO").FireEvent "onchange"
Ничего не происходит с вышеупомянутым
Dim myHTMLFrame2 As HTMLDocument
Set myHTMLFrame2 = HTMLDoc.frames(3).document
Dim elem As Object
Set elem = myHTMLFrame2.document.getElementById("QSGAA5V0GAFRWAOL34D8OK78W2ZUJO")
(results in "object not supported error")
elem.Focus
elem.selectedIndex = 2
Это HTML-код:
<div id="QSGAA5V0GAFRWAOL34D8OK78W2ZUJO-answer-body">
<div class="select_holder select_jquery">
<select id="QSGAA5V0GAFRWAOL34D8OK78W2ZUJO" overwrite="1" level="0"
val="$escapeTool.html($!{answerValue})" required="true" questionid="QSGAA5V0GAFRWAOL34D8OK78W2ZUJO" totalorder="0" questiondefid="QDGAA5V0GAFRWAOL34D8OK78W2ZUJP"
responsetype="STATIC_MENU" autocomplete="off"
aria-activedescendant="" aria-labelledby="QSGAA5V0GAFRWAOL34D8OK78W2ZUJO-label" tabindex="0">
<option value=""></option>
<option value="New User(s)" ps="0" aria-selected="false">New User(s)</option>
<option value="Modify User Details or Applications" ps="1" aria-selected="false">Modify User Details or Applications</option>
<option value="Add/Modify User By Attachment" ps="2" aria-selected="false">Add/Modify User By Attachment</option>
<option value="clear">(clear)</option>
</select>
</div>
</div>
Комментарии:
1. У меня была похожая проблема, и оказалось, что это часть javascript, обрабатывающая этот выпадающий список. Вызов javascript был решением для меня, может быть, это указывает вам правильное направление? Вот сокращенный код, который я использовал:
IE.Navigate "javascript:NewItem('....u002520Validationu002520Reportsu002fFormsu002fUpload.aspx?....u002520Validationu002520Reportsu0026Type=1')"
2. является ли URL общедоступным?
3. @ DarXyde: Спасибо за комментарии. Что-нибудь, что привело вас к javascript, было ли что-нибудь в информации тега или, может быть, в заголовке?
4. @QHarr: Спасибо, нет, URL-адрес не является общедоступным, он размещен в интрасети и является частью системы исправления
5. Я собираюсь опубликовать кое-что, чтобы попробовать через секунду
Ответ №1:
Вы могли бы попробовать прикрепить событие к элементу выбора. Я нацелился на использование тега и атрибута в случае, если идентификатор является динамическим. Если идентификатор статический, используйте это. Если это находится внутри iframe, добавьте соответствующий синтаксис перед access.
Dim dropDown As Object, onChange As Object
Set dropDown = ie.document.querySelector("select[overwrite='1']")
Set onChange = ie.document.createEvent("htmlevents")
onChange.initEvent "change", True, False
ie.document.querySelector("[value='New User(s)']").Selected = True
links.dispatchEvent onChange
Комментарии:
1. Спасибо, я надеялся, что это сработает, поскольку этот код представляет собой новый подход. к сожалению, он не затемнил myHTMLFrame2 как HTMLDocument Set myHTMLFrame2 = HTMLDoc.frames(3).раскрывающийся список document Dim Как Object, onChange Как Object Set dropdown = myHTMLFrame2. Выбор запроса («выбрать[перезаписать=’1′]») Установить onChange = myHTMLFrame2.CreateEvent(«htmlevents») onChange.InitEvent «изменить», True, False myHTMLFrame2.document. querySelector(«[значение=’Новый пользователь (ы)’]»). Выбрано = True Ссылки.dispatchEvent onChange (это привело к тому, что объект не поддерживается)
2. пожалуйста, опубликуйте точное сообщение об ошибке и строку, в которой оно встречается
3. Выпадающий список Dim как объект, onChange как набор объектов = myHTMLFrame2. querySelector («select[overwrite=’1′]») Set onChange = myHTMLFrame2.document.CreateEvent(«htmlevents») «документ выдает результат «объект не поддерживает это свойство или метод», затем документ удален без ошибки onChange.InitEvent «изменить», True, False myHTMLFrame2. querySelector(«[значение=’Новый пользователь (ы)’]»). Выбрано = True Ошибка Links.dispatchEvent onChange ‘ «требуется объект», поэтому я изменил на myHTMLFrame2.Links.dispatchEvent onChange ‘Ошибка в строке выше «объект не поддерживает это свойство или метод»
4. Эта строка myHTMLFrame2. querySelector(«[значение=’Новый пользователь (ы)’]»). Выбрано = True вызывает ошибку?
5. Set onChange = myHTMLFrame2.document.CreateEvent («htmlevents») ‘документ приводит к ошибке «объект не поддерживает это свойство или метод» удаленный документ, затем ошибка отсутствует Set onChange = myHTMLFrame2.CreateEvent («htmlevents») Ссылки.dispatchEvent onChange ‘ошибка «требуется объект», поэтому я изменил на myHTMLFrame2.Links.dispatchEvent onChange ‘Ошибка в строке выше «объект не поддерживает это свойство или метод»
Ответ №2:
Попробуйте выполнить тест с приведенным ниже кодом, возможно, это поможет решить проблему.
Код:
Sub demo()
Dim URL As String
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
URL = "C:UsersAdministratorDesktop107.html"
IE.Navigate URL
Do While IE.ReadyState = 4: DoEvents: Loop 'Do While
Do Until IE.ReadyState = 4: DoEvents: Loop 'Do Until
IE.Document.GetElementByID("QSGAA5V0GAFRWAOL34D8OK78W2ZUJO").Value = "Modify User Details or Applications"
Set IE = Nothing
End Sub
Вывод в IE 11:
Комментарии:
1. спасибо, но ничего не происходит myHTMLFrame2.getElementById(«QSGAA5V0GAFRWAOL34D8OK78W2ZUJO»). Значение = «Новый пользователь (ы)»
2. Я предлагаю вам сначала проверить, правильно ли назначен ваш объект для HTML-документа и ссылается ли он на правильную страницу. после этого вы можете попытаться найти элемент в документе.
Ответ №3:
@Qharr amp; @Deepak — Спасибо
Я проверил элемент, и оказалось, что код создает элемент «ввода» во время выполнения. Для выполнения события я использую ключи отправки. Не очень элегантно, но это работает.
myHTMLFrame2.all.Item("QSGAA5V0GAFRWAOL34D8OK78W2ZUJO_input").Focus
myHTMLFrame2.all.Item("QSGAA5V0GAFRWAOL34D8OK78W2ZUJO_input").Value = "New User(s)"
myHTMLFrame2.all.Item("QSGAA5V0GAFRWAOL34D8OK78W2ZUJO_input").Click
Application.SendKeys "{DOWN}"
Application.SendKeys "{DOWN}"
Application.SendKeys "~"