Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023

T(Cpp)WebBrowser - есть ли аналог Document.GetElementByClassName?

25.07.2015, 18:14. Показов 2164. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, вопрос в заголовке темы.
А данные, которые мне нужно найти, в исходном коде страницы описаны так:
Code
1
2
3
4
5
6
7
8
<div class="optionsDDLWrapper chartPlusOptionsWrapper">
  <span class="expiryDDLLabel">Актив</span>
  <select data-widget="digital_tradologic_optionDropDown" class="widgetPlaceholder optionDropDownWidget widgetOptionDropDown"></select>
</div>
<div class="expireDDLWrapper chartPlusExpireWrapper">
  <span class="expiryDDLLabel">Истекает</span>
  <select class="widgetPlaceholder expireDropDownWidget widgetExpireDropDown" data-widget="digital_tradologic_expireDropDown"></select>
</div>
Обычный поиск элемента типа select (и т. д. и т. п.) не помогает (часть кода):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        // актив
        static int i = -1;
        OleVariant vName4(++i);
//      vIndex = 0;
        IDispatch *pDisp4 = NULL;
        if(SUCCEEDED(pAll->item(vName4, vIndex, &pDisp4)) && pDisp4)
        {
          IHTMLSelectElement *pSelect = NULL;
          if(SUCCEEDED(pDisp4->QueryInterface(IID_IHTMLSelectElement, (LPVOID*)&pSelect)) && pSelect)
          {
            Caption = i;
            String active = "4975991";  // или "EUR/USD";  "4975991" - значение option value, этот параметр в исходном коде страницы отсутствует
            pSelect->put_value(active.c_str());
//          pSelect->put_selectedIndex(3);
            pSelect->Release();
          }
          pDisp4->Release();
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2015, 18:14
Ответы с готовыми решениями:

Использование document.getElementByClassName
начал изучать javascript и решил написать набиралку текста... суть в том что есть кнопки которые выполнены через штук 17 ссылок...

Какой есть аналог WebBrowser?
Ранее подобные темы создавались, но с того момента прошло много времени. Полазив по многим источникам, предоставленных google поиском,...

webbrowser.document.write
надо открыть вбраузере html строку сформированну в программе. нашел что надо написать webbrowser.document.write ,но у document нет свойство...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33412 / 21522 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
25.07.2015, 21:35
Лучший ответ Сообщение было отмечено gunslinger как решение

Решение

Проходи циклом по всем элементам, и каждому
C++
1
2
3
4
5
6
WideString clss;
it->get_className(&clss);
if(clss == "то, что ищешь")
{
    // ...
}
, будет поиск по имени класса.
1
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
26.07.2015, 01:48  [ТС]
Все получилось, спасибо.
Целью было выбрать элемент списка (это я тоже сделал).
Последовательность действий: нашел элемент (тип IHTMLElement) по имени класса и присвоил ему некоторое значение id
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        long p;
        pAll->get_length(&p);
        // актив
        for (int i = 0; i < p; i++)
        {
          OleVariant vName4(i);
          vIndex = 0;
          IDispatch *pDisp4 = NULL;
          if(SUCCEEDED(pAll->item(vName4, vIndex, &pDisp4)) && pDisp4)
          {
            IHTMLElement *pSelect = NULL;
            if(SUCCEEDED(pDisp4->QueryInterface(IID_IHTMLElement, (LPVOID*)&pSelect)) && pSelect)
            {
              WideString clss;
              pSelect->get_className(&clss);
              if(clss == "widgetPlaceholder optionDropDownWidget widgetOptionDropDown")
              {
                String active = "optionDropDown";
                pSelect->put_id(active.c_str());
//              pSelect->get_innerHTML(&clss);
//              ShowMessage(clss);
              }
              if(clss == "widgetPlaceholder expireDropDownWidget widgetExpireDropDown")
              {
                String expire = "expireDropDown";
                pSelect->put_id(expire.c_str());
              }
 
              pSelect->Release();
            }
            pDisp4->Release();
          }
        }
Далее нашел список (тип IHTMLSelectElement) по id и выбрал в нем некоторое значение (для IHTMLElement сделать выбор значения вроде нельзя, насколько я понял, поэтому такая последовательность действий)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        // присваивание значения
        OleVariant vName5 = "optionDropDown";
        IDispatch *pDisp5 = NULL;
        if(SUCCEEDED(pAll->item(vName5, vIndex, &pDisp5)) && pDisp5)
        {
          IHTMLSelectElement *pSelect = NULL;
          if(SUCCEEDED(pDisp5->QueryInterface(IID_IHTMLSelectElement, (LPVOID*)&pSelect)) && pSelect)
          {
//          String active = "4975985";
//          pSelect->put_value(active.c_str());
            pSelect->put_selectedIndex(5);
            pSelect->Release();
          }
          pDisp5->Release();
        }
И тут возникает проблема - значение вроде поменялось (которое выбрали из списка), но только лишь визуально.
В зависимости от выбранного значения должен меняться график на странице, но этого не происходит.
Если выбирать элемент списка мышью, то все нормально.
То есть получается, не хватает как бы того самого клика мышью для завершения выбора.
Как реализовать данный момент?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33412 / 21522 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
26.07.2015, 12:33
Лучший ответ Сообщение было отмечено gunslinger как решение

Решение

для IHTMLElement сделать выбор значения вроде нельзя, насколько я понял, поэтому такая последовательность действий
Последовательность может быть гораздо проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
                    TComInterface<IHTMLElement> it;
                    TComInterface<IHTMLSelectElement> sel;
                    if (GetChildElement(pCollection, i, i, &it)) // получаем очередной элемент коллекции
                    {
                        WideString id;
                        it->get_className(&id);
 
                        if (id == "widgetPlaceholder optionDropDownWidget widgetOptionDropDown")
                        {
                            it->QueryInterface(IID_IHTMLSelectElement, (LPVOID*)&sel); // получаем SelectElement
                            sel->put_selectedIndex(5);
                        }
                    }
То есть получается, не хватает как бы того самого клика мышью для завершения выбора
А вот это очень странно, должно работать и при put_selectedIndex, никакого доп. действия не нужно в общем случае. Надо смотреть страничку, на что там повешено изменение графика. Только ли на обновление select-а...
1
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
26.07.2015, 15:48  [ТС]
Что-то я сразу не догадался для TComInterface использовать utilcls.h.
В GetChildElement можно третий параметр заменить на 0, но не суть важно.
В итоге код действительно значительно сокращается.

На странице есть еще таблица, она дублирует данные из списка. Когда мы выбираем мышью элемент списка, выделяется соответствующая строка таблицы, и наоборот. Что влияет на график.
Описание таблицы в исходном коде страницы:
Code
1
2
3
4
5
6
7
8
9
<table class="widgetPlaceholder tableWidget custom-sort-table scrollTable" data-widget="digital_tradologic_table">
  <thead class="fixedHeader">
    <tr>
      <th class="name type-string sorting-asc" data-sort="string" data-column="name">Актив</th>
      <th class="type-int" data-sort="string" data-column="expire">Истекает</th>
      <th class="type-int" data-sort="string" data-column="payout">Прибыльность</th>
    </tr>
  </thead>
</table>
Замечу, что многие данные на странице "скрыты" - не отображаются в исходном коде, их можно посмотреть с помощью обычного браузера или изучая данные определенного элемента страницы.
Ссылка на страницу: https://binex.ru/ru/traderoom/... me=digital.
0
 Аватар для Mr_Axel
225 / 111 / 9
Регистрация: 23.12.2011
Сообщений: 751
04.01.2016, 22:49
Решал эту же задачу
Вот мой вариант решения на JS, а его уже передаем любым способом:
JavaScript
1
2
3
4
5
6
7
$('select.optionDropDownWidget[data-widget="digital_tradologic_optionDropDown"] option').each(function(){
      var text = $(this).text();
      if(text=='EUR/USD'){
            $(this).prop('selected','selected').change().click();
            return false;//break
      } 
});
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2016, 22:49
Помогаю со студенческими работами здесь

Использовать аналог var = document
В js я не понимаю, моя задача на делфи найти переменную h , автоматическое решение ругается на слово document , пишет мол неизвестная...

Аналог (document).ready для div
Добрый день. Есть ли возможность запустить скрипт после загрузки определённого div элемента на странице? Что нибудь в духе...

Document.GetElementById не работает в webBrowser WPF
document.GetElementById не работает в webBrowser Я что то не пойму гуглил гуглил обуглился уже , пальцы задымели O_o но примеры...

Аналог WebBrowser
Народ, подскажите новичку, есть ли какие-то библиотеки или компоненты аналогичные WebBrowser ? Только чтоб был браузер, который можно...

WebBrowser аналог
подскажите есть ли какой-то аналог стандартного WebBrowser. Нужно для работы на Ubuntu


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru