xPath descendant не работает в FindElementByXPath

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
733
Благодарностей
485
Баллы
63
Подскажите в чем проблема, в DevTool xPath выдает ожидаемое, а метод FindElementByXPath получает пустое значение

Пример сайт: https://lenta.ru/news/2023/03/27/kurs/

Не работает xPath2, хотя в DevTool выдается нужный результат
C#:
var tab = instance.ActiveTab;
var xPath1 = tab.FindElementByXPath("//h1/span[text()]", 0).InnerText;
var xPath2 = tab.FindElementByXPath("//h1/descendant::text()", 0).InnerText;
return $"1: {xPath1} \r\n 2: {xPath2}";
105233
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
в зенке есть проблема работы с узлом text() ... хз почему, но я всегда стараюсь избегать указывать его.
вот так будет работать //h1/descendant-or-self::span
и так тоже //h1/descendant::span
 
  • Спасибо
Реакции: Dmitriy Ka

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
733
Благодарностей
485
Баллы
63
в зенке есть проблема работы с узлом text() ... хз почему, но я всегда стараюсь избегать указывать его.
вот так будет работать //h1/descendant-or-self::span
и так тоже //h1/descendant::span
Понятно, придется делать костыли)
к span не хотел подвязываться, потому что не на всех сайтах его используют, но придется костылить через него.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113

Phoenix78

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

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 523
Благодарностей
1 321
Баллы
113
Подскажите в чем проблема, в DevTool xPath выдает ожидаемое, а метод FindElementByXPath получает пустое значение

Пример сайт: https://lenta.ru/news/2023/03/27/kurs/

Не работает xPath2, хотя в DevTool выдается нужный результат
C#:
var tab = instance.ActiveTab;
var xPath1 = tab.FindElementByXPath("//h1/span[text()]", 0).InnerText;
var xPath2 = tab.FindElementByXPath("//h1/descendant::text()", 0).InnerText;
return $"1: {xPath1} \r\n 2: {xPath2}";
Посмотреть вложение 105233
C#:
var tab = instance.ActiveTab;

var xPath1 = tab.FindElementByXPath("//h1/span[text()]", 0).InnerText;

var xPath2 = tab.FindElementByXPath("//h1/descendant::span[text()]", 0).InnerText;

return $"1: {xPath1} \r\n 2: {xPath2}";
Логика в том, что вы указываете найти текст и достать из него текст...Что не логично. Соответственно нужно найти span и достать из него текст.
 
Последнее редактирование:
  • Спасибо
Реакции: Morti

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
733
Благодарностей
485
Баллы
63
C#:
var tab = instance.ActiveTab;

var xPath1 = tab.FindElementByXPath("//h1/span[text()]", 0).InnerText;

var xPath2 = tab.FindElementByXPath("//h1/descendant::span[text()]", 0).InnerText;

return $"1: {xPath1} \r\n 2: {xPath2}";
Логика в том, что вы указываете найти текст и достать из него текст...Что не логично. Соответственно нужно найти span и достать из него текст.
105308

Логика была в том чтобы из тега h1 получить текст, но проблема в том что иного есть тег h1 и в нем текст, а иногда h1 и вложенный тег в котором текст.
Эту задачу решает такой путь //h1/descendant::text(), но метод FindElementByXPath не может его нормально обработать и выдает пустое значение, хотя на скриншоте видно что элемент был найден.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 523
Благодарностей
1 321
Баллы
113

Логика была в том чтобы из тега h1 получить текст, но проблема в том что иного есть тег h1 и в нем текст, а иногда h1 и вложенный тег в котором текст.
Эту задачу решает такой путь //h1/descendant::text(), но метод FindElementByXPath не может его нормально обработать и выдает пустое значение, хотя на скриншоте видно что элемент был найден.
Еще раз внимательно прочитайте:
Логика в том, что вы указываете найти текст и достать из него текст...Что не логично. Соответственно нужно найти span и достать из него текст.
Когда вы пытаетесь найти через devtools - вы ищите целую строку где есть текст. А когда вы используете xpath - вы говорите боту - найти мне xpath Имя которого text, а в конце вы просите достать из текста - текст .InnerText

Пробуйте еще например такие варианты.
C#:
var xPath3 = tab.FindElementByXPath("//h1/descendant::*[text()]", 0).InnerText;
var xPath4 = tab.FindElementByXPath("//h1/descendant::*[name=text()]", 0).InnerText;
 
  • Спасибо
Реакции: Dmitriy Ka

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
733
Благодарностей
485
Баллы
63
Пробуйте еще например такие варианты.
C#:
var xPath3 = tab.FindElementByXPath("//h1/descendant::*[text()]", 0).InnerText;
var xPath4 = tab.FindElementByXPath("//h1/descendant::*[name=text()]", 0).InnerText;
var xPath3 = tab.FindElementByXPath("//h1/descendant::*[text()]", 0).InnerText;
Такой вариант работает, спасибо!
 

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