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

  • Автор темы Автор темы Dmitriy Ka
  • Дата начала Дата начала

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
951
Реакции
736
Баллы
93
Подскажите в чем проблема, в 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
 
в зенке есть проблема работы с узлом text() ... хз почему, но я всегда стараюсь избегать указывать его.
вот так будет работать //h1/descendant-or-self::span
и так тоже //h1/descendant::span
 
  • Спасибо
Реакции: Dmitriy Ka
в зенке есть проблема работы с узлом text() ... хз почему, но я всегда стараюсь избегать указывать его.
вот так будет работать //h1/descendant-or-self::span
и так тоже //h1/descendant::span
Понятно, придется делать костыли)
к span не хотел подвязываться, потому что не на всех сайтах его используют, но придется костылить через него.
 
Подскажите в чем проблема, в 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
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 не может его нормально обработать и выдает пустое значение, хотя на скриншоте видно что элемент был найден.
 

Логика была в том чтобы из тега 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
Пробуйте еще например такие варианты.
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;
Такой вариант работает, спасибо!
 

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