Выберите опцию с использованием автоматизации Excel с помощью Internet Explorer

#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 "~"