Selenium для обновления любой страницы, пока элемент не виден Java - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу, чтобы селен подождал 3 минуты, затем обновил страницу, пока не был найден элемент (кнопка "Загрузить"). Я пробовал использовать приведенный ниже код, но он не работает.

Примечание: Я загружаю zip-файл, и иногда загрузка занимает несколько секунд, а иногда - 3 минуты. Когда файл загружается в течение нескольких секунд, приведенный ниже код работает нормально.Это не работает, когда загрузка zip-файла занимает больше времени.

Может ли кто-нибудь помочь мне в этом вопросе.

boolean displayed = false;
do {
  try {
    displayed = driver1.findElement(By.xpath("//*[@id=\"app\"]/main/div[1]/div/div/div/div[2]/table/tbody/tr[1]/td[4]/a")).isDisplayed();
  } catch (NoSuchElementException e) {
    System.out.println(e);
    driver1.navigate().refresh();
  }
} while (!displayed);

driver1.findElement(By.xpath("//*[@id=\"app\"]/main/div[1]/div/div/div/div[2]/table/tbody/tr[1]/td[4]/a")).click();

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы упомянули, например, «Пока не найден элемент (кнопка« Загрузить »)» ... поэтому здесь необходимо выполнить условие ... следовательно, мы можем использовать одну из функций ожидания, предоставляемых selenium

У нас есть тритипы ожидания в селене, 1) неявное ожидание 2) явное ожидание и 3) свободное ожидание.

1) Используя неявное ожидание, код может быть:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Использование: Если мы хотим, чтобы WebDriver опрашивал DOM в течение определенного времени при попыткенайти элемент или элементы, если они не доступны сразу.Значение по умолчанию равно 0. После установки неявное ожидание устанавливается на весь срок службы экземпляра объекта WebDriver.

Хотя это не очень хорошая практика, я лично не рекомендую

и

2) Используя явное ожидание, код может быть:

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("download_button_id")));

Использование: Явное ожидание - это код, который вы определили для ожидания определенного условия, прежде чем продолжить работу в коде.,По умолчанию WebDriverWait вызывает ExpectedCondition каждые 500 миллисекунд, пока не завершится успешно.Если элемент занимает много времени для загрузки.Также используется для проверки свойства элемента (наличие, кликабельность и т. Д.).

3) Используя Fluent wait, код может быть:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    .withTimeout(30, SECONDS)
    .pollingEvery(5, SECONDS)
    .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() 
{
  public WebElement apply(WebDriver driver) {
  return driver.findElement(By.id("foo"));
}
});

Использование: Свободное ожидание - это еще один тип явного ожидания, и вы можете определить опрос и игнорировать исключение, чтобы продолжить выполнение скрипта, если элемент не найден.Когда вы пытаетесь проверить наличие элемента, который может появляться через каждые x секунд / минут (просто пример, это мое предположение о том, где можно использовать такую ​​вещь)

Выберите подходящий в вашемслучай, свободное ожидание может быть подходящим

0 голосов
/ 06 февраля 2019

Вместо использования метода .isDisplayed () вы можете указать размер списка элементов, а если размер больше 0, щелкните элемент.
Например:

    boolean displayed = false;
    List<WebElement> element = driver.findElements(By.xpath("//*[@id=\"app\"]/main/div[1]/div/div/div/div[2]/table/tbody/tr[1]/td[4]/a"));
    while (!displayed) {
        if (element.size() > 0) {
            // Element is found so set the boolean as true
            displayed = true;
            // Click on the element
            element.get(0).click();
        } else {
            // Adding a static sleep of 10 seconds, this else condition can be removed also
            Thread.sleep(10000);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...