[C#] InnerHtml/OuterHtml при присваивании переменной зависают на 30 секунд и возвращают пустую строку.

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
С помощью instance.ActiveTab.FindElementsbyXpath() нахожу коллекцию элементов. В данной коллекции находится один элемент. Потом присваиваю свойство InnerHtml или OuterHtml (не важно какое свойство) этого элемента переменной. И вот как раз на моменте присваивания код останавливается на 30 секунд, по прошествии этого времени код продолжает работу, но в переменной пусто (проверяю через свойство Length и там ноль). Такое чувство словно внутри этих свойств срабатывает какой-то таймаут.
Показать конкретный пример не могу, т.к. ошибка плавающая - 3-5 выполнений всё идёт хорошо, потом зависает. Пробовал в PM отловить, но ошибка не проявляется.
Работа идёт с Telegram, получение последнего поста в чате.

Может кто-то сталкивался с подобной проблемой и нашёл её решение?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
а если не FindElementsbyXpath использовать, а парсером через DOM по xpath ?
В смысле какой-нибудь HtmlAgilityPack использовать? Думаю над этим, но всё же надеюсь, что кто-то мне подскажет решение этой проблемы в духе "Поставь там-то и там-то чекбоксы и всё будет ОК":-)

P.S. До этого работал в Firefox52. Подумал что в Firefox52x64 этой проблемы не будет. И даже какое-то время шаблон нормально отрабатывал, но всё-равно споткнулся.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
да не. вот так
var attributes = ZennoPoster.Parser.ParseByXpath(tab, ZennoLab.InterfacesLibrary.Enums.Parser.SourceType.Dom, xpath, attribute, true).ToList();
attributes.Range("all");
if (attributes.Count>0) return attributes[0];
else return "";
 
  • Спасибо
Реакции: nicanil

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
да не. вот так
var attributes = ZennoPoster.Parser.ParseByXpath(tab, ZennoLab.InterfacesLibrary.Enums.Parser.SourceType.Dom, xpath, attribute, true).ToList();
attributes.Range("all");
if (attributes.Count>0) return attributes[0];
else return "";
Спасибо за подсказку. Но, к сожалению, данное решение мне не подойдёт (как и HtmlAgilityPack), т.к. проблемный кусок кода находится в методе, который используется во многих местах шаблона и возвращает данный метод объект HtmlElement, с которым в последствии идёт работа (клики, отправка JS событий и т.п.).

Вот что интересно: работа идёт с двумя чатами, это два разных класса в OwnCode (на каждый чат свой класс). Оба класса используют один и тот же метод, но в одном классе этот метод отрабатывает без сбоев, а в другом - зависает:be: При чём зависает в разных местах (другой же класс нормально отрабатывает во всех этих местах). Стоит отметить то, что сейчас у меня работает две копии шаблона (разделил, чтоб проблемная копия не мешала стабильной). Но код-то в середине один и тот же.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
а как вообще про 30 секунд стало известно ?
у меня в логах бывает отлавливает ситуацию когда элемент есть , на скрине ошибки есть, а проверка координат выдает что у него отрицательные координаты. и да иногда бывает что при работе с элементом срабатывает таймаут и шаблон аварийно завершается. для себя я сделал вывод, что это падает инстанс и тут ничего не сделаешь пока разработчики не улучшат стабильность.
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
а как вообще про 30 секунд стало известно ?
Всё просто. Я когда заметил, что мой шаблон завис начал разбираться в чём же дело. Сделал самым простым способом - по всему коду вставлял вывод сообщений в лог. Постепенно круг подозреваемых сужался, пока я не нашёл виновника торжества. Я поставил вывод в лог до присваивания и сразу после.
C#:
project.SendInfoToLog("До присваивания.");
string html = element.OuterHtml;
project.SendInfoToLog("После присваивания.");
Так вот в логе между сообщениями "До присваивания." и "После присваивания." проходит ровно 30 секунд. Потом немного изменил код:
C#:
project.SendInfoToLog("До присваивания.");
string html = element.OuterHtml;
project.SendInfoToLog(html.Length.ToString() + " " + element.OuterHtml.Length.ToString())
project.SendInfoToLog("После присваивания.");
Теперь между сообщениями в логе проходит 60 секунд (иногда 58, 59) т.к. происходит два обращения к свойству OuterHtml

У меня инстанс не зависает, не падает - я когда включаю отображение работы браузера, то могу взаимодействовать с сайтом.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)