Свойство text () xpath не работает для текстового узла в соответствии с приведенным ниже кодом в Selenium - PullRequest
0 голосов
/ 11 декабря 2018

Код:

<div class="content">
  <div id="tab">
    <div class="row">
      <div class="col-sm-12">
        <div>
          <div>
            <div>
            </div>
            <div>
              <p><span>01</span></p>
              <p class="className"><span id="">parent</span>
                Child 
              </p>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

«родитель» и «ребенок» находятся в одном теге p.Я могу легко найти «родителя» с помощью:

//*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p/span

, но не могу найти «ребенка» отдельно.

Я пробовал все возможности, упомянутые ниже, но безрезультатно,

//*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p/text()
//*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p/text()[contains(.,'child')]

Все вышеуказанные запросы работают нормально в онлайн-редакторе, но когда я запускаю его в java ide, он показывает «элемент отсутствует на странице»!

Любые предложения будут полезны!

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Для меня

"//p[contains(text(), 'uploaded')]"

работает с Selenium 3. Но, как уже упоминалось, Selenium может работать только с элементами.Таким образом, вы можете использовать

element.getText();
element.getAttribute("textContent");

, чтобы получить текст внутри абзаца.

0 голосов
/ 12 декабря 2018

Хотя оба элемента с текстом parent и child находятся в одном теге <p> с атрибутом class как className ,элемент с текстом как parent является узлом-потомком <span>, где элемент с текстом как child является decedent текстовым узлом .Таким образом, хотя Selenium , который использует XPath v1.0 , может найти элемент с текстом как parent , но не сможет найти текстовый узел с текстом child .Из грубой можно извлечь текст child .

Следовательно, мой встречный вопрос был ... Что вы хотите сделать с текстом?Просто извлеките текст? ... .

Чтобы извлечь текст child , вы можете использовать следующее решение:

WebElement myElement = driver.findElement(By.xpath("//div[@id="tab"]//p[@class='className']"));
String myText = (String)((JavaScriptExecutor)driver).executeScript("return arguments[0].lastChild.textContent;", myElement);
0 голосов
/ 11 декабря 2018

text() в вашем xpath .../p[2]/text() требует возврата TextNode.Но селен может возвращать только элементный узел.

Например: //*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p[2]/span ожидать возврата элементного узла с именем TAG span.

Galen Framework использует Selenium для открытия веб-браузера.и выберите проверенные элементы на странице.

Браузер поддерживает //*[@id="tab"]/div/div/div[1]/div[1]/div[2]/p[2]/text(), вы можете добиться успеха в DevTool браузера.Но это не эквивалентно поддержке Selenium.

Так что в вашем случае вам нужно сделать селен, чтобы найти и вернуть p Элемент элемента:

<p class="className"><span id="">parent</span>
    child
</p>

Java-пример использования HTML DOM API:

((JavaScriptExecutor) driver).executeScript(
      "return arguments[0].childNodes[2].nodeValue;",
      driver.findElement(By.xpath(
          "//*[@id='tab']/div/div/div[1]/div[1]/div[2]/p[2]"
      ))
)
// arguments[0] is the p ElementNode
// childNodes[2] is the 3rd child node of the p, it's the TextNode 'child'
// As I mentioned, Selenium's findElement(s) not support to return TextNode
// Even you can directly access the text node via HTML DOM api, but
// you can't return it for further using by Galen. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...