Справочная информация. Я использую 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 второй. Поэтому я мог бы попытаться сделать такой подход. Любое другое понимание все еще приветствуется.
Скажем, ваш базовый 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)));
}
Подход:
Получив индекс:
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.
By.xpath("//*[@id='elementID']/*[contains(text(),'" + text + "')]")
выглядит совершенно корректно, почему бы это не сработало?