Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2 3 4

Работа с Web-платформой Olymp Trade


TraderProg ©   (14.02.18 20:56[20]

Похоже я обрадовался преждевременно. Захожу значит через полчаса и уже в плане цены не 11 элементов, а уже 13 (видать вебстраница слегка изменилась) и соответственно цена уже идет не по индексу 6, а  по индексу 8. А если бы это произошло во время торговли? Последствия могли бы быть печальными. Как же быть, чтобы искать не по конкретным цифрам по индексу, а как-то более надежно?


Redmond   (14.02.18 21:12[21]

Да, привязываться к индексу плохая идея. Да и обращаться к List.item(23) не проверив что их там есть столько - тоже. Может List вообще пустой. :3

А чего если?:
List:=Doc.querySelectorAll('#chart > div > svg > g > g.cutoffG > text');
ну или?:
List:=Doc.querySelectorAll('#chart > div');

JavaScript меняет текст. Мало ли как и откуда он его берёт и по каким внутренним событиям/таймерам срабатывает. Проще - тоже таймером.
А чего, запоминать где-то последнее значение и сравнивать с только что полученным. Изменилось - значит изменилось, тогда что-то делаем.


Redmond   (14.02.18 21:19[22]

А на случай если веб-страницу изменят авторы - параметры для querySelectorAll() можно вынести во внешний файл. Типа файл с настройками. Что-то вроде *.ini / *.json / *.xml.


TraderProg ©   (14.02.18 21:52[23]

Спасибо еще раз. Работает. Проверил вариант:
List:=Doc.querySelectorAll('#chart > div > svg > g > g.cutoffG > text');

Второй вариант не стал проверять.
А что если   #chart > div > svg > g > g.cutoffG > text   тоже сменится неожиданно, в процессе работы программы?

По поводу таймера: убедили :)


Redmond   (14.02.18 22:23[24]

Тогда видимо querySelectorAll() ничего не найдёт и вернёт пустой List.
If (List.length=0) Then
     {Error};


TraderProg ©   (15.02.18 05:09[25]

Да, отличная идея с проверкой длины. А вот если Doc, List, Node - вынести за рамки, то есть сделать их глобальными, чтобы определить их в самом начале при старте всего приложения, а потом лишь вызывать Node.innerHTML для чтения цены или Node.click для кнопок, будет ли в этом случае работать, то есть продолжит ли работу, в случае изменения вебстраницы?
Или:
Doc:=WebBrowser1.Document;
List:=Doc.querySelectorAll('#chart > div > svg > g > g.cutoffG > text');
надо повторять при каждом такте таймера?


Redmond   (15.02.18 13:27[26]

Зависит от того что именно там мутит JavaScript. Но в общем случае полагаю надёжность может понизится...
Если скрипт пересоздаст элементы - глазами можно не заметить, а элемент уже по факте новый другой. Как определить что "ссылка" на элемент уже не валидна?
гм... Хотя она же "интерфейсная"... Может оно вообще останется валидным и продолжит существовать как бы все DOM. Но нам такая тем более не подойдёт. Можно понатыкать Try/Except, но от неактуальности не спасёт.
Зависит от сайта короче. Не уверен как надёжно проверять актуальность содержимого переменной. На полную пустоту проверять примерно этим (нужен модуль System.Variants):Function CheckVariant(Variable: OleVariant): BooLean;
Begin
Result:=Not (VarIsNull(Variable) Or VarIsEmpty(Variable));
End;


Только не глобальными, а в поля формы:
Type
     TForm1 = Class(TForm)
           ...
     Private
           NodePrice, ButtonUp, ButtonDown, ... : OleVariant;
     Public
     End;

А переменные Doc, List, Node лучше оставить локальными и использовать только для поиска/навигации.


Redmond   (15.02.18 13:31[27]

Досадные опечатки...

> по факту

> как бы вне


Redmond   (15.02.18 15:35[28]

Ну вот «"потыкал" я "палочкой"» элементы/узлы документа - после удаления они остаются вполне действующими.
Придётся всё же как-то проверять перед работой (и если что - обновлять). Например:Procedure TForm1.UpdateNodePrice(Doc: OleVariant);
Begin
... // Алгоритм поиска для NodePrice (в переданном Doc)
NodePrice:= ... ;
End;

Procedure TForm1.UpdateButtonUp(Doc: OleVariant);
Begin
... // Алгоритм поиска для ButtonUp (в переданном Doc)
ButtonUp:= ... ;
End;

Procedure TForm1.UpdateButtonDown(Doc: OleVariant);
Begin
... // Алгоритм поиска для ButtonDown (в переданном Doc)
ButtonDown:= ... ;
End;

... // Остальные переменные по аналогии

Procedure TForm1.CheckAll(WB: TWebBrowser);
Var Doc: OleVariant;
Begin
Doc:=WB.Document;
If CheckNode(NodePrice) Then
     UpdateNodePrice(Doc);
If CheckNode(UpdateButtonUp) Then
     UpdateButtonUp(Doc);
If CheckNode(UpdateButtonDown) Then
     UpdateButtonDown(Doc);
... // Остальные переменные по аналогии
End;

Procedure TForm1.Timer1Timer(Sender: TObject);
Begin
// Найдём (или проверим актуальность) все элементы:
CheckAll(WebBrowser1);
... // Пользуемся ими - получаем innerHTML или click или ещё что там надо
End;
Осталось придумать как сделать функцию проверки CheckNode()...
Возможно получится проверять у целевого Node - а задан ли parentNode (или parentElement). Если нету, то возможно его удалили из DOM...


TraderProg ©   (15.02.18 15:55[29]

Спасибо большое, Redmond. Без этих подсказок я бы так и не решил проблему - где бы в инете не лазил - везде одна и та же скудная инфа. А как Вы (не знаю как лучше на Вы или на ты :) )  изучили эту тему с DOM? Посоветуете что почитать, с примерами, чтобы я сам начал разбираться в этом вопросе?

Решил поначалу сделать первый вариант, где будет каждый раз пр новом такте заново присваиваться Doc, List, Node и с проверкой на равенство List.length нулю, а уже потом буду параллельно делать второй вариант как в примере постом выше этого, если конечно придумаю как сделать CheckNode().

Тут еще мысля опосля пришла - нужно же как-то проверять периодически соединение с сайтом. Это можно сделать в самом WebBrowser или лучше пытаться парсить сайт (в нем есть мигающий зеленый кружок и надпись "online")?


TraderProg ©   (15.02.18 21:15[30]

Еще один вопрос появился. При загрузке страницы в WebBrowser она отображается излишне крупно. Можно как-то масштаб уменьшить программно, чтобы больше влазило в видимую область?


Redmond   (15.02.18 22:58[31]

В смысле есть ли интернет и доступен ли сайт? хм...Ну тут уже возможно удобнее на TIdHTTP свалить работу...

Чёткие корректные термины это совершенно не моё. С:
WB.Document это что-то типа "ссылка на интерфейс ActiveX компонента Internet Explorer'а, реализующий модель DOM" - https://www.w3schools.com/JSREF/dom_obj_document.asp
С терминами наверняка накосячил, поправьте кто-то... :3

гм... Масштабирование бывает у самого браузера (не задумывался даже как там может быть реализовано) - зажимаем Ctrl и колесом мышки. А бывает и у элементов (появилось в CSS3). Возможно первое и реализовано как-то через второе, тут я без понятия.
Сделать через CSS3 - просто и не потребует вытрясания Души из Гугла - надо просто добавить к стилям html стиль transform с масштабированием:Doc.documentElement.style.transform:='scale(0.6)';
Doc.documentElement.style.transformOrigin:='top';
Но при рассмотрении это чем-то всё же отличается от Ctrl+колесо... А вот как программно вызывать аналог Ctrl+колесо Гугл мне что-то и под пытками не сознался...


TraderProg ©   (18.02.18 18:10[32]

Привет. Думал уж что почти все проблемы решил. Перекинул значит я прогу на VPS (выделенный персональный сервер) для круглосуточной работы. А WebBrowser в ней не работает - пишет: "Проводятся технические работы.

Пожалуйста, подождите несколько минут и повторите попытку"

Причем браузер InternetExplorer выдает тоже самое, а в Яндекс-браузере загрузка страницы происходит нормально.

Скорее всего надо в настройках IE где-то покопаться, галочки куда надо проставить, только ума не приложу где именно


TraderProg ©   (18.02.18 20:23[33]

Главное другие сайты загружаются в TWebBrowser и ИЕ на ВПСе нормально, а страница торговой платформы Олимптрейда не хочет включаться там. Первоначальная старница Олимптрейда до авторизации тоже загружается нормально. Дома вообще все без проблем, а вот на ВПСе беда. Из дома запускать конечно можно - но после работы немного времени, а если круглосуточно то жалко железо, эл. энергию, да и вообще больший риск пожароопасности без присмотра. Специально взял ВПС, а на нем не работает (((


Дмитрий Белькевич ©   (18.02.18 23:45[34]

Можешь хромиум попробовать. Возможно будет стабильнее по разным компам.

гуглить:
delphi chromium click button
delphi chromium get html

ну и остальное что нужно.


TraderProg ©   (19.02.18 07:44[35]

На Хромиуме скорее всего запустится, но в этом случае опять приду к тому с чего начал, без подсказок опытных программистов не обойтись, так как в инете одна и та же скудная инфа, повторяющаяся на множестве сайтов.


TraderProg ©   (19.02.18 21:28[36]

Установил на Delphi компонент Хромиум, пока не разобрался как его использовать под свои задачи. Решил попробовать купить другой VPS - в нем уже открывается окно плаформы в Internet Explorer, НО НЕ ХОТЯТ выполняться сценарии, которые привязаны к кнопкам "ВЫШЕ" и "НИЖЕ". Облазил и перетыкал большинство настройки бразуера но так и не работает. Причем дома все ОК, а на ВПСах такая беда. не могу понять в чем дело? Может что установить дополнительно надо?


Redmond   (20.02.18 00:34[37]

> Причем браузер InternetExplorer выдает тоже самое

TWebBrowser это фактически и есть Internet Explorer. Они и должны одинаково работать. Как вариант обратиться в техподдержку сайта который не открывается. Мол - "Вот, не работает!" (с)

> НО НЕ ХОТЯТ выполняться сценарии, которые

Молча? Что показывают проверки? На каком этапе и что не находится? Сообщения об ошибках ловятся?

> Второй момент - надо бы на всякий случай поправить FEATURE_BROWSER_EMULATION, Гугл знает что это.

Это делаете? Это кстати если что надо делать ещё до "инициализации" TWebBrowser.


TraderProg ©   (20.02.18 06:19[38]

Нет, не молча. Я бы скрин показал, если бы тут можно было добавить, а если по тексту то особо ничего не написано, то что ошибка сценария, веб-адрес и все. а последующие попытки вообще без ругани - просто молча


TraderProg ©   (20.02.18 15:56[39]

Текст сообщения такой:
Ошибка сценария
! На этой странице произошла ошибка сценария
Строка: 0
Символ: 0
Ошибка: script error
Код: 0
URL: https://cdn1.olymptrade.com/p_920b9108d816/public/js/vendors.dll.js

Вы хотите продолжить выполнение сценариев на этой странице?
Да    Нет


Страницы: 1 2 3 4 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо