Как получить содержимое элемента, используя явное ожидание вместо сна (), используя Selenium и Java

Я пытаюсь получить содержимое элемента. Я реализовал явное ожидание 20 секунд перед заявлением о получении контента. Но я не могу получить содержимое. Я могу получить содержимое элемента, если использую sleep() в течение 2 секунд. Код, который я пробовал:

WebDriverWait wait1 = new WebDriverWait(driver,20);
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("XPath")));
String value = driver.findElement(By.xpath("xpath")).getAttribute("text-content");
System.out.println("Value is : " + value);

Output - Value is : 

Код со сном():

WebDriverWait wait1 = new WebDriverWait(driver,20);
Thread.sleep(2000);
String value = driver.findElement(By.xpath("xpath")).getAttribute("text-content");
System.out.println("Value is : " + value);

Output - Value is : $0.00

Я не получаю значение, если я также использую неявное ожидание. Рекомендуется не использовать sleep(). Использование явного ожидания всегда является лучшей практикой. Почему я не получаю содержимое элемента, используя явное ожидание?

Попробуйте использовать присутсвиеэлементлокатед вместо видимостиофлементлокатед.

SRM21 28.05.2019 08:53

Можете поделиться HTML-кодом?

cruisepandey 28.05.2019 08:59

не работает с присутствияOfElementLocation.

learningQA 28.05.2019 09:01
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
2
3
138
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Какую ошибку вы получаете? Кажется, что элемент не загружается должным образом. Могут быть некоторые анимации, такие как закрытие всплывающего окна, загрузка таблицы и т. д. Обычно можно поставить сон, если вы знаете, сколько времени занимают такие виды анимации.

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

Свободное ожидание:

Wait<WebDriver> fluentWait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(timeout))
    .pollingEvery(Duration.ofMillis(500))
    .ignoring(NoSuchElementException.class)
    .ignoring(StaleElementReferenceException.class);

Можете ли вы попробовать:

Wait<WebDriver> wait = new FluentWait<WebDriver>((WebDriver) driver).withTimeout(20, TimeUnit.SECONDS).pollingEvery(1, TimeUnit.SECONDS);
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("XPath"))));
String value = driver.findElement(By.xpath("xpath")).getAttribute("text-content");
System.out.println("Value is : " + value);
Ответ принят как подходящий

Соответствующий HTML помог бы нам лучше отладить проблему. Однако, поскольку желаемый текст содержит символ $, лучшим подходом будет создание WebDriverWait для ожидание проверки наличия данного текста в элементе, и вы можете использовать одно из следующих решений:

  • textToBePresentInElementLocated:

    System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.textToBePresentInElementLocated(By.xpath("xpath"), "$")).getAttribute("text-content"));
    
  • textToBePresentInElementValue:

    System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.textToBePresentInElementValue(By.xpath("xpath"), "$")).getAttribute("text-content"));
    

«textToBePresentInElementLocation» сработало. "textToBePresentInElementValue" - нет.

learningQA 28.05.2019 13:11

Другие вопросы по теме