Как получить все тд теги, которые содержат указанный текст внутри, используя xpath Java Selenium? - PullRequest
0 голосов
/ 22 февраля 2020

Фактическая проблема: не удается найти все td теги, в которых указан текст, только некоторые из них.

Я пытаюсь проверить, все ли теги td содержат указанный текст, используя xpath, например :

 WebElement tableId = driver.findElement(By.id("tablepress-6"));
 if (!driver.findElements(By.xpath("//td[contains(text(),'" + textInput + "')]")).isEmpty()) {

 List<WebElement> tdElements = tableId.findElements(By.xpath("//td[contains(text(),'"+ textInput + "')]"));
          //...
 }

Также я пробовал методы, использующие xpath, например:

List<WebElement> tdElements = tableId.findElements(By.xpath("//*[contains(text(),'" + textInput + "')]"));

И например:

List<WebElement> tdElements = tableId.findElements(By.xpath("//tr[*[text() = '"+ textInput + "']]/td[2]"));

Но если я проверю свой веб-сайт Я не получаю все совпадения для td элементов, возможно, из-за br элементов внутри некоторых совпадающих td.

enter image description here

Вместо того, чтобы получать все 17 совпадения (как на экране выше), я получаю меньшее количество совпадений (в моем конкретном случае c - 12): enter image description here

Может кто-нибудь подсказать, как получить все td теги, которые содержат указанный текст? Заранее спасибо.

1 Ответ

1 голос
/ 23 февраля 2020

Проблема чувствительна к регистру Physics and astronomy. В некоторых строках вы можете найти Физика и астрономия . Чтобы решить эту проблему, вы можете использовать функцию xpath translate .

В приведенном ниже примере я получаю второй столбец только с текстом физика и астрономия , поскольку он существует и в второй столбец.

//tr[@role='row']/td[2][contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'), 'physics and astronomy')]

В качестве альтернативы вы можете использовать Java для фильтрации по тексту:

List<WebElement> rows = new WebDriverWait(driver, 10)
        .until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".tablepress tbody tr[role=row]")));

// By whole phrase
List<WebElement> physicsAndAstronomy1 = rows.stream().filter(e ->
        e.findElement(By.cssSelector("td:nth-child(2)")).getText().toLowerCase()
                .contains("physics and astronomy"))
        .collect(Collectors.toList());

// By separately words
List<WebElement> physicsAndAstronomy2 = rows.stream().filter(e -> {
    String text = e.findElement(By.cssSelector("td:nth-child(2)")).getText().toLowerCase();
    return text.contains("physics") && text.contains("astronomy");
}).collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...