Как получить текст из текстового узла внутри элемента с помощью Xpath, C# и Selenium

Я инженер по автоматизации тестирования, который последние несколько лет работает с селеном. Это мой первый пост в Stackoverflow.

Я пытаюсь получить текст из элемента, но селен даже не идентифицирует элемент. Я использую настройку specflow в Visual Studio и С# в качестве языка.

Ниже приведен пример HTML-кода (это всего лишь образец структуры HTML-кода, а не оригинал):

<p class="day">
 <meta atts="somevalue">
 <span>Some text</span>
 <meta atts="somevalue">
 <meta atts="somevalue">
 "Active"
</p>

Я хочу получить текст Active из приведенного выше HTML.

Я написал для этого несколько xpaths, когда я проверяю это в chrome, xpaths верны, и он выделяет элемент

Испытания Xpaths:

1. //p[@class='day']/text()
2. //p[@class=''day]/meta[@atts='somevalue'][3]/following-sibling::text()
3. few more..

для всех xpaths text() находится между ними или в конце. все это правильно и уникально, когда я проверял это вручную.

на веб-странице, которую я автоматизирую, нет кадров. также нет проблем с загрузкой страниц. я пробовал с разными операторами ожидания. также пытался дать длинный thread.sleep().

расположение элемента всегда одинаково. изменится только значение в нем. т. е. xpath для этого элемента не является динамическим.

Я получаю ошибку в строке ниже. (драйвер инициализирован правильно, для всего остального работает)

String StatusVal = driver.FindElement(By.XPath("(//meta[@itemprop='closes'])[1]/following-sibling::text()")).Text;

что бы я ни пытался, я получаю сообщение об ошибке ниже, говорящее, что элемент не найден,

OpenQA.Selenium.NoSuchElementException: Could not find element by: By.XPath: (//meta[@itemprop='closes'])[1]/following-sibling::text()

Вышеуказанное является фактическим xpath, если я вручную проверяю xpath после того, как тест не пройден в том же браузере, он доступен там и уникален.

т. е. в моем анализе мой xpath правильный, нет задействованных кадров, на странице нет проблемы с ожиданием, поскольку я успешно выполняю действия с ближайшими элементами и даю более чем достаточно времени для загрузки страницы. все обычные настройки селена выполняются в моей системе, и все работает нормально, кроме этого.

Селен версия: 3.12.0


person AkhilMPCR7    schedule 23.05.2018    source источник
comment
В вашем HTML у вас есть @atts, но ваше сообщение об ошибке содержит @itemprop   -  person gangabass    schedule 23.05.2018
comment
Это всего лишь образец структуры html-кода. я не могу использовать оригинал здесь   -  person AkhilMPCR7    schedule 23.05.2018


Ответы (1)


В соответствии с HTML, который вы предоставили для получения текста Active, вы можете использовать ExecuteScript() из IJavaScriptExecutor Interface следующим образом:

IWebElement myElem = driver.FindElement(By.XPath("//p[@class='day']"));
string myText = (string)((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0].lastChild.textContent;", myElem);
Console.WriteLine(myText);
person DebanjanB    schedule 23.05.2018