Установка значения в выпадающем списке на веб-странице

Функция предназначена для работы с объектной моделью web-документа (DOM) средствами VB (VBA)

Иногда, при программном заполнении (макросом) полей на веб-странице, требуется внести некоторое значение в выпадающий список, в который позволяется заносить только заранее определённые значения.
Поскольку в качестве исходных данных может выступать любой текст, - требуется отлавливать возникающие ошибки, и выводить пояснения (какая ошибка при заполнении какого списка произошла)

Function SetSelectElementValue(ByRef IEdoc As Object, _
                               ByVal SelectElementName$, ByVal NewValue$) As Boolean
    ' функция ищет в документе IEdoc (типа HTMLDocument) выпадающий список с именем SelectElementName$,
    ' и пытается установить его значение в NewValue$
    ' в случае ошибки выводит сообщение о невозможности установки нового значения
    ' Возвращает результат операции (TRUE, если всё прошло успешно)

On Error Resume Next: Err.Clear
    'Dim msComBox As HTMLSelectElement, msOption As HTMLOptionElement

    ' находим на веб-странице элемент с именем SelectElementName$
    Set msComBox = IEdoc.getElementsByName(SelectElementName$).Item(0)
 
    For Each msOption In msComBox    ' перебираем все опции в выпадающем списке
        ' формируем переменную txt, содержащую список опций (на случай ошибки функции)
        txt = txt & "Option" & msOption.Index & ": " & """" & msOption.Text & """" & vbNewLine
 
        If msOption.Text = NewValue$ Then    ' если текущая опция совпадает с нужной нам
            msComBox.selectedIndex = msOption.Index    ' активируем её
            msComBox.FireEvent ("onchange")    ' вызываем событие изменения значения
            SetSelectElementValue = True: Exit Function    ' выход из функции
        End If
    Next msOption
 
    ' если выполнение кода дошло до этого места - среди опций не оказалось варианта NewValue$
    ' получаем заголовок поля - текст вышестоящего элемента
    Label$ = msComBox.parentElement.innerText: Label$ = Split(Label$, ":")(0)
    ' формируем текст сообщения об ошибке
    msg = "Не удалось установить значение «" & NewValue$ & "»" & vbNewLine
    msg = msg & "в выпадающем списке «" & Label$ & "» (кодовое имя: «" & SelectElementName$ & "»)"
    msg = msg & vbNewLine & vbNewLine & "Список допустимых значений:" & vbNewLine & vbNewLine & txt
    MsgBox msg, vbExclamation, "Ошибка установки значения в выпадающем списке «" & Label$ & "»"
End Function

Пример использования:

Function SendToWebsite(ByRef IE As Object) As Boolean
    ' функция публикации объявления о продаже недвижимости на сайте риэлторского агенства

    Set IE = New InternetExplorer    ' создаём объект InternetExplorer
    On Error Resume Next: Err.Clear
    IE.Navigate URL_main    ' переходим на нужную страницу
    ' ждём, пока страница загрузиться
    While IE.Busy Or (IE.ReadyState <> 4): DoEvents: Wend
    Set IEdoc = IE.Document: DoEvents    ' получаем ссылку на документ (веб-страницу)

    ' заполняем поля документа
    SetSelectElementValue IEdoc, "act", "Продам"
    SetSelectElementValue IEdoc, "type", ТипНедвижимости
 
    SetSelectElementValue IEdoc, "region", Город
    SetSelectElementValue IEdoc, "district", Район
    SetSelectElementValue IEdoc, "num_rooms", КоличествоКомнат
 
    SetInputElementValue IEdoc, "et_num", Этаж
    SetInputElementValue IEdoc, "et_max", Этажность
 
    SetSelectElementValue IEdoc, "house_kind", ВидДома
    SetSelectElementValue IEdoc, "house_type", ТипДома
 
    SetInputElementValue IEdoc, "addr", Адрес
    SetInputElementValue IEdoc, "s_total", ПлощадьОбщая
    SetInputElementValue IEdoc, "s_live", ПлощадьЖилая
    SetInputElementValue IEdoc, "s_kit", ПлощадьКухня
 
    SetInputElementValue IEdoc, "price", Цена
 
    SetOptionElementValue IEdoc, "has_bal", Балкон
    SetOptionElementValue IEdoc, "has_log", Лоджия
    SetOptionElementValue IEdoc, "has_lift", Лифт
    SetOptionElementValue IEdoc, "has_phone", Телефон
 
    SetInputElementValue IEdoc, "body", Comment
 
    ' производим отправку данных формы
    IEdoc.getElementsByName("add_form").Item(0).submit
    ' ждём, пока страница отправится, и загрузится новая
    While IE.Busy Or (IE.ReadyState <> 4): DoEvents: Wend
    SendToWebsite = Err = 0
End Function

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Там при регистрации можно задать любой электронный адрес и пароль. И можете сразу входить на сайт.

Возможно, что на этом сайте можно подать объявление, не заполняя все выпадающие списки, а отправить все необходимые данные через POST запрос.
К тому же, если используется JavaScript, метод ввода значений в поля на сайте может потребоваться совершенно иной.
Чтобы ответить точно, надо изучать сайт (и предварительно на нем регистрироваться), а у меня на это нет времени.

Есть такой сайт "www.fn.ua". Так вот, на закладке "Подать объявление" есть несколько выпадающих списков, которые появляются один за другим только после вводе в предыдущий значения. В каждом из этих списков нет события "onchange". Я уже несколько недель бьюсь, что сделать появление последующих списков программно. Наткунулся на Ваш код, думал он поможет, однако не тут-то было. Может подскажите как это можно реализовать?

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
          _   _  __        __  _____   _     _  __
_ __ | | | | \ \ / / | ___| | |_ | |/ /
| '_ \ | |_| | \ \ /\ / / | |_ | __| | ' /
| | | | | _ | \ V V / | _| | |_ | . \
|_| |_| |_| |_| \_/\_/ |_| \__| |_|\_\
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.