[C#] Работа с коллекцией FindElementsByXPath и непонятный результат в итоге

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
Коллеги, подскажите, пожалуйста:

Не могу понять, почему при равных прочих результат разный.

Собираю в коллекцию с помощью tab.FindElementsByXPath, после перебираю с поиском детей/ребенка.
В innerHtml и test данные идут по порядку, как ожидается (изменяются в зависимости от итерации).
В testTwo и testThree данные всегда первого el из массива elementsByXPath.

C#:
HtmlElement[] elementsByXPath = _tab.FindElementsByXPath(XPathFullListCard).Elements; // 22 элемента
foreach (HtmlElement el in elementsByXPath)
{
    string innerHtml = el.InnerHtml;

    string test = ZennoPoster.Parser.ParseByXpath(innerHtml, _xPathId, "InnerText").ToList()[0]; // 13586498 отрабатывает верно
    string testTwo = el.FindChildrenByXPath(_xPathId).Elements[0].InnerText; // 13586479 постоянно показывает первый результат из массива
    string testThree = el.FindChildByXPath($"{_xPathId}", 0).InnerText; // 13586479 аналогично с testTwo
}
Вспомогательные данные:
BuildID: 12527.07.22.2022
Chromium c профиль папкой

Вопросы:
Это баг или мой недочет?
Как сделать правильно?
 
  • Спасибо
Реакции: Sho

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
точку забыл прописать в пути xpath перед // (вот так .//), которая в переменной _xPathId. Она прописывается в обязательном порядке, если используются методы FindChildren... , FindChild...

C#:
instance.ActiveTab.Navigate("https://html-templates.info/");
instance.ActiveTab.WaitDownloading();

string XPathFullListCard = "//table//div[@class = 'article light'][descendant::a]";
string _xPathId = ".//a"; //ВОТ ТУТ
Tab _tab = instance.ActiveTab;

HtmlElement[] elementsByXPath = _tab.FindElementsByXPath(XPathFullListCard).Elements; // 22 элемента

foreach (HtmlElement el in elementsByXPath)
{
    string testTwo = el.FindChildrenByXPath(_xPathId).Elements[0].InnerText; // 13586479 постоянно показывает первый результат из массива
    project.SendInfoToLog(testTwo);
}
 
  • Спасибо
Реакции: djaga и Yuriy Zymlex

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
Необходима точка. В ином случае, отсутствие родителей ограничивало бы и создавало бы проблемы.
 
  • Спасибо
Реакции: djaga

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
точку забыл прописать в пути xpath перед // (вот так .//), которая в переменной _xPathId. Она прописывается в обязательном порядке, если используются методы FindChildren... , FindChild...

C#:
instance.ActiveTab.Navigate("https://html-templates.info/");
instance.ActiveTab.WaitDownloading();

string XPathFullListCard = "//table//div[@class = 'article light'][descendant::a]";
string _xPathId = ".//a"; //ВОТ ТУТ
Tab _tab = instance.ActiveTab;

HtmlElement[] elementsByXPath = _tab.FindElementsByXPath(XPathFullListCard).Elements; // 22 элемента

foreach (HtmlElement el in elementsByXPath)
{
    string testTwo = el.FindChildrenByXPath(_xPathId).Elements[0].InnerText; // 13586479 постоянно показывает первый результат из массива
    project.SendInfoToLog(testTwo);
}
Необходима точка. В ином случае, отсутствие родителей ограничивало бы и создавало бы проблемы.
Ха, спасибо вам большое!))
Про относительный путь подумал, почему-то запомнилось, что// достаточно. :bq:

Для потомков:
ExpressionDescription
nodenameSelects all nodes with the name "nodename"
/Selects from the root node
//Selects nodes in the document from the current node that match the selection no matter where they are
.Selects the current node
..Selects the parent of the current node
@Selects attributes

Источник
 
  • Спасибо
Реакции: Sho и Demiz

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