2015-07-03 4 views
1

Я задал сегодня вопрос this, но по ошибке я не указал его объем, который предназначен для использования в Selenium Webdriver.Selenium WebDriver - Xpath для выбора диапазона и исключения дочернего узла

Так что у меня этот тд:

<td> 
<span id="PartComment"> 
REMAN WATER PUMP 
<i>w/2.05" DIAMETER THERMOSTAT OUTLET - SUPPLIED w/PULLEY 
</i> 
</span> 
</td> 

И Я хочу, чтобы найти XPath только текст REMAN Водяной насос позже преобразовать его в строку.

driver.findElement(By.xpath("//span[@id='lblPartComment']/text()")); 

Но проблема в том, что, так как я только местонахождение текста, а не объект DOM, WebDriver не сможет относиться к ней как таковой:

Exception in thread "main" org.openqa.selenium.InvalidSelectorException: The given selector //span[@id='lblPartComment']/text() is either invalid or does not result in a WebElement. The following error occurred: InvalidSelectorError: The result of the xpath expression "//span[@id='lblPartComment']/text()" is: [object Text]. It should be an element. 

Можете ли вы предоставить альтернатива этому xpath? Тот, который находит текст, упомянутый выше, и исключает текст внутри i?

Также related.

Благодаря

+0

Я могу предложить вам локатор, но вы можете мне сказать: это текст «REMAN Водяного насос» меняется? Я имею в виду, вы хотите проверить его для разных тестовых случаев? Поскольку синтаксис XPath предназначен для определения диапазона только этим частичным текстом. –

+0

Я хочу найти диапазон и извлечь текст внутри пролета и исключить любой текст в i или любых других дочерних узлах, которые могут возникнуть. Да, текст пересоединения водяного насоса может измениться, но это не имеет значения, потому что я размещаю пролет. Кроме того, чтение вокруг я обнаружил, что // span [@ id = 'PartComment]/[not (self :: i)] может работать, но это также добавляет текст в другие дочерние узлы, поэтому он не работает для меня. Так что в основном то, что мне нужно, это способ использовать функцию not в xpath для исключения узла i (по крайней мере пока) – zuri

ответ

1

Вы можете использовать следующий код:

var firstText = this.Driver.FindElement(By.XPath("//span[@id='lblPartComment']")).Text; 
var firstChildText = this.Driver.FindElement(By.XPath("//span[@id='lblPartComment']/i")).Text; 
firstText = firstText.Replace(firstChildText, string.Empty); 

Найдите оба родителя и дочерние элементы, получить их текст и заменить текст ребенка с пустой строкой. :)

+0

Является ли это java? :) – zuri

+0

это C#, но код для Java должен быть идентичным, идея имеет значение. :) –

+0

Я еще не свободен в переводе кода, не могли бы вы перевести это на java, пожалуйста? @Anton Angelov – zuri

0

Вы можете это сделать. перешедший из this

JavascriptExecutor js = (JavascriptExecutor) driver; 
    String text = (String) js.executeScript("var parent = arguments[0];" 
      + "var child = parent.firstChild;" 
      + "var ret = \"\";" 
      + "while(child) {" 
      + " if (child.nodeType === Node.TEXT_NODE)" 
      + "  ret += child.textContent;" 
      + " child = child.nextSibling;" 
      + "}" 
      + "return ret;", driver.findElement(By.id("PartComment"))); 
Смежные вопросы