Конференция "Основная" » Работа с Web-платформой Olymp Trade
 
  • 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: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: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: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 13:31) [27]
    Досадные опечатки...

    > по факту

    > как бы вне
  • Redmond (15.02.18 13:31) [27]
    Досадные опечатки...

    > по факту

    > как бы вне
  • Redmond (15.02.18 13:31) [27]
    Досадные опечатки...

    > по факту

    > как бы вне
  • Redmond (15.02.18 13:31) [27]
    Досадные опечатки...

    > по факту

    > как бы вне
  • 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...
  • 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...
  • 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...
  • 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...
  • 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...
  • 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 15:55) [29]
    Спасибо большое, Redmond. Без этих подсказок я бы так и не решил проблему - где бы в инете не лазил - везде одна и та же скудная инфа. А как Вы (не знаю как лучше на Вы или на ты :) )  изучили эту тему с DOM? Посоветуете что почитать, с примерами, чтобы я сам начал разбираться в этом вопросе?

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

    Тут еще мысля опосля пришла - нужно же как-то проверять периодически соединение с сайтом. Это можно сделать в самом WebBrowser или лучше пытаться парсить сайт (в нем есть мигающий зеленый кружок и надпись "online")?
  • TraderProg © (15.02.18 15:55) [29]
    Спасибо большое, Redmond. Без этих подсказок я бы так и не решил проблему - где бы в инете не лазил - везде одна и та же скудная инфа. А как Вы (не знаю как лучше на Вы или на ты :) )  изучили эту тему с DOM? Посоветуете что почитать, с примерами, чтобы я сам начал разбираться в этом вопросе?

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

    Тут еще мысля опосля пришла - нужно же как-то проверять периодически соединение с сайтом. Это можно сделать в самом WebBrowser или лучше пытаться парсить сайт (в нем есть мигающий зеленый кружок и надпись "online")?
  • TraderProg © (15.02.18 15:55) [29]
    Спасибо большое, Redmond. Без этих подсказок я бы так и не решил проблему - где бы в инете не лазил - везде одна и та же скудная инфа. А как Вы (не знаю как лучше на Вы или на ты :) )  изучили эту тему с DOM? Посоветуете что почитать, с примерами, чтобы я сам начал разбираться в этом вопросе?

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

    Тут еще мысля опосля пришла - нужно же как-то проверять периодически соединение с сайтом. Это можно сделать в самом WebBrowser или лучше пытаться парсить сайт (в нем есть мигающий зеленый кружок и надпись "online")?
 
Конференция "Основная" » Работа с Web-платформой Olymp Trade
Есть новые Нет новых   [118692   +25][b:0.001][p:0.001]