селен xpath лом смешанного содержания html span - PullRequest
7 голосов
/ 10 сентября 2011

Я пытаюсь очистить элемент span со смешанным содержимым

<span id="span-id">
  <!--starts with some whitespace-->
  <b>bold title</b>
  <br/>
  text here that I want to grab....
</span>

А вот фрагмент кода захвата, который идентифицирует промежуток. Он поднимает его без проблем, но текстовое поле webelement пустое.

IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://page-to-examine.com");
var query = driver.FindElement(By.XPath("//span[@id='span-id']"));

Я пытался добавить / text () к выражению, которое также ничего не возвращает. Если я добавлю / b, я получу текстовое содержание текста, выделенного жирным шрифтом - это название, которое меня не интересует.

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

Ответы [ 2 ]

4 голосов
/ 10 сентября 2011

Я попытался добавить /text() к выражению, которое также ничего не возвращает

Это выбирает все дочерние текстовые узлы узла контекста -- и их три.

То, что вы называете «ничем», наиболее вероятно, является первым из них, который является текстовым узлом только для пробелов (таким образом, вы видите «ничто» в нем).

Вам нужно: :

//span[@id='span-id']/text()[3] 

Конечно, возможны и другие варианты :

//span[@id='span-id']/text()[last()] 

Или:

//span[@id='span-id']/br/following-sibling::text()[1] 

Проверка на основе XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
     "<xsl:copy-of select="//span[@id='span-id']/text()[3]"/>"
 </xsl:template>

</xsl:stylesheet>

Это преобразование просто выводит то, что выбрано в выражении XPath.При применении к предоставленному документу XML (комментарий удален):

<span id="span-id">
    <b>bold title</b>
    <br/>
    text here that I want to grab....   
</span>

желаемый результат получается :

     "
    text here that I want to grab....   
"
3 голосов
/ 10 сентября 2011

Я считаю, что следующий запрос xpath должен работать для вашего случая. следующий брат и сестра полезны для того, что вы пытаетесь сделать.

//span[@id='span-id']/br/following-sibling::text()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...