Как проверить наличие текста в определенном теге <DIV> с помощью Selenium WebDriver (java) и Chrome?

0

Справочная информация. Я использую Selenium WebDriver на Java и использую Google Chrome в качестве моего браузера.

Поэтому я не слишком уверен в этом. Я знаю, как определить, присутствует ли конкретный текст на странице, однако что, если бы было несколько экземпляров текста, который я хочу найти? Например, если слово "Hello" находится в верхней части страницы, а также появляется слово "Hello" при расширении элемента, как бы проверить, что второй "Hello" существует без полного указания его xpath?

Например:

WebDriverWait wait = new WebDriverWait(driver, WAIT_TIME);
foundElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[contains(text(),'" + expectedText + "')]")));

... это получит первый экземпляр текста, который я ищу... но что, если я ищу другой конкретный экземпляр (3-й, 4-й)?

Пытаясь ИЗБЕЖАТЬ использовать что-то вроде этого:

WebDriverWait wait = new WebDriverWait(driver, WAIT_TIME);
foundElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("(//*[contains(text(),'" + expectedText + "')])[2]")));

Предпочтительно, я хотел бы попытаться указать элемент под ним. Любые идеи?

Я не очень хорошо знаком с xpath... но предположим, что я хотел сделать что-то LIKE (я уже знаю, что это неверно/не работает):

WebElement foundElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"elementID\"]/[contains(text(),'" + text + "')]")));

Надеюсь это имеет смысл! Пожалуйста, дайте мне знать, если требуется какое-либо разъяснение.

Небольшое обновление:

Я пробовал это безрезультатно:

WebElement foundElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"elementID\"]/*/[contains(text(),'" + text + "')]")));

Вот путь, который содержит текст, который я пытаюсь найти:

//*[@id="Highchart_chart_property_hot_alerts"]/div[1]/div[1]

Это ВТОРОЕ появление текста на странице. Возможно, приемлемый способ поиска, если он проверяет, что ОБА текстов присутствуют, а не JUST второй. Поэтому я мог бы попытаться сделать такой подход. Любое другое понимание все еще приветствуется.

  • 0
    By.xpath("//*[@id='elementID']/*[contains(text(),'" + text + "')]") выглядит совершенно корректно, почему бы это не сработало?
  • 0
    Я думаю, возможно, потому что текст, который я ищу, немного глубже. Я получил TimeoutException. Моя проблема в том, что я стараюсь сделать его настолько общим, насколько это возможно, чтобы можно было подойти ко многим ситуациям. Вот полный xpath текста, который я пытаюсь найти: // * [@ id = "elementID"] / div [1] / div [1] В идеале я хочу избегать использования чего-либо большего, чем elementID.
Показать ещё 4 комментария
Теги:
xpath
selenium
selenium-webdriver

2 ответа

1
Лучший ответ

Скажем, ваш базовый HTML:

<table id='bar'>
  <tr>
    <td>
      <div>
        <div class="foo">hello</div>
        <div>world</div>
      </div>
    </td>
  </tr>
</table>

Вы должны всегда указывать тип тега для поиска в xpath. Поэтому использование //table/tr/td/div/[@class='foo'] не будет работать. Кроме того, /*/ не очень полезно, так как // означает "пропускать любое количество детей и их детей и т.д.". Таким образом, вам нужно: //table[@id='bar']//div[@class='foo']

Итак, в отношении вашего вопроса решение выглядит следующим образом:

By locator = By.xpath("//*[@id='Highchart_chart_property_hot_alerts']//div[contains(text(),'" + text + "')]");
WebElement foundElement = waitAndFindElement(locator);

private WebElement waitAndFindElement(By locator) {
  WebDriverWait wait = new WebDriverWait(driver, WAIT_TIME);
  return wait.until(ExpectedConditions.presenceOfElementLocated(locator)));
}
  • 0
    ИДЕАЛЬНЫЙ! Четкое и краткое объяснение. Спасибо вам большое!
  • 0
    На самом деле, я думаю .//div[text()[contains('text ')]] также может работать в некоторых случаях, когда ответ выше не будет.
Показать ещё 1 комментарий
0

Подход:

Получив индекс:

CSS-селектор div, содержащий текст "Hello": css = div: contains ("Hello")

List<WebElement> texts = driver.findElements(By.cssSelector("div:contains('Hello')"));

if(texts.get(2).getText().equals("hello")

    // Then Second Element that contains the Text Hello is present.

else 

    // Not Present.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню