Вопрос по webdriver – Чтение текста с использованием селена webdriver (xpath)

6

Я использую селен, чтобы получить текст на своей веб-странице с помощью xpath.

Структура тега страницы выглядит следующим образом -

<span id="data" class="firefinder-match">
    Seat Height, Laden
  <sup>
     <a class="speckeyfootnote" rel="p7" href="#">7</a>
  </sup>
</span>

Если я использую следующий код -

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

Я получаю результат =Seat Height, Laden 7

Но я хочу избежать чтения текста в<sup> теги и получить результатSeat Height, Laden

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

я использую xpath только потому, что мне это удобно. Если есть какой-то другой способ решить мою проблему, я буду благодарен. Hari Reddy
Согласно сообщению ниже, вы не можете выбрать текстовые узлы с помощью css:stackoverflow.com/questions/5688712/…, Таким образом, выбор с помощью CSS не поможет user152468
1. Поскольку диапазон имеет идентификатор, лучше всего использовать идентификатор вместо xpath. 2. cssSelector работает быстрее, чем xpath, поэтому я предлагаю использовать cssSelector вместо xpath. Ripon Al Wasim
Есть причина, почему xpath - ваш единственный вариант? Webdriver занимает больше всего времени, чтобы найти элемент по xpath Amey
Um. В простом XPath (который может возвращать строки, а не только WebElements), вы можете сделать//span[@id='data']/text()[1], Одно возможное решение, которое я могу придумать, использует JS, второе получает весь текст, а затем удаляет все из дочерних элементов. Оба решения довольно уродливы, и я хотел бы видеть более приятное. В любом случае, если в течение некоторого разумного короткого промежутка времени ответа не будет, я опубликую его. Petr Janeček

Ваш Ответ

1   ответ
7

поэтому у меня есть решение JS. Идея состоит в том, чтобы получить все дочерние элементы (включая текстовые узлы), а затем выбрать только текстовые узлы. Возможно, вам придется добавить некоторые.trim() (или эквивалент JS) вызывает избавление от лишних пробелов.

Весь код:

WebElement elem = driver.findElement(By.id("data"));
String text;
if (driver instanceof JavascriptExecutor) {
    text = ((JavascriptExecutor)driver).executeScript(
            "var nodes = arguments[0].childNodes;" +
            "var text = '';" +
            "for (var i = 0; i < nodes.length; i++) {" +
            "    if (nodes[i].nodeType == Node.TEXT_NODE) {" +
            "        text += nodes[i].textContent;" +
            "    }" +
            "}" +
            "return text;"
            , elem);
}

И просто JS для лучшей читабельности.

var nodes = arguments[0].childNodes;
var text = '';
for (var i = 0; i < nodes.length; i++) {
    if (nodes[i].nodeType == Node.TEXT_NODE) {
        text += nodes[i].textContent;
    }
}
return text;
Да, есть. Однако в данном конкретном случае это не сработает, поскольку вы все еще выбираете внешний элемент, который по умолчанию содержит все дочерние элементы. Текстовый узел также является его дочерним элементом, и обычный парсер может его получить. WebDriver не является обычным парсером и не имеет этой функциональности. Еще. Если вы хотите узнать какой-либо конкретный XPath, не стесняйтесь спрашивать.
Привет хорошее решение, чтобы получить результат через JS. Но я хочу спросить, есть ли что-нибудь подобное! оператор в xpath, с помощью которого мы можем пренебречь определенными тегами. Hari Reddy

Похожие вопросы