Дождитесь полной загрузки изображения Selenium WebDriver

Я увидел, что есть вопрос: Selenium-Webdriver Ruby -› Как дождаться полной загрузки изображений после клика

Но похоже, что никто прямо на это не ответил: мне нужно дождаться полной загрузки изображения, а не только его представления в DOM, используя selenium WebDriver. Что мне делать? Сейчас я использую

  public static void waitUntilVisible(WebDriver webDriver, By locator) {
    WebDriverWait driverWait = new WebDriverWait(webDriver, TIMEOUT);
    driverWait.until(visibilityOfElementLocated(locator));
  }

который использует

  /**
   * An expectation for checking that an element is present on the DOM of a page and visible.
   * Visibility means that the element is not only displayed but also has a height and width that is
   * greater than 0.
   *
   * @param locator used to find the element
   * @return the WebElement once it is located and visible
   */
  public static ExpectedCondition<WebElement> visibilityOfElementLocated(
    final By locator) {
    return new ExpectedCondition<WebElement>() {
      @Override
      public WebElement apply(WebDriver driver) {
        try {
          return elementIfVisible(findElement(locator, driver));
        } catch (StaleElementReferenceException e) {
          return null;
        }
      }

      @Override
      public String toString() {
        return "visibility of element located by " + locator;
      }
    };
  }

но если изображение уже имеет высоту и ширину, оно, вероятно, считается видимым, даже если изображение не загружено


person Nicola Peluchetti    schedule 07.03.2017    source источник
comment
Вы когда-нибудь находили ответ?   -  person st0ve    schedule 10.12.2020


Ответы (1)


Вы можете выполнить какой-нибудь javascript для опроса DOM. В частности, свойство complete элемента HTMLImageElement.

public static void waitUntilVisible(WebDriver webDriver, By locator) {
    WebDriverWait driverWait = new WebDriverWait(webDriver, TIMEOUT);
    WebElement el = webDriver.findElement(locator);
    driverWait.until(
        new Predicate<WebDriver>() {
            public boolean apply(WebDriver driver) {
                return ((JavascriptExecutor)driver).executeScript("return arguments[0].complete", el);
            }
        }
    );
}

Но обратите внимание, что complete:

Возвращает логическое значение true, если браузер завершил получение изображения независимо от того, успешно он или нет. Он также показывает истину, если изображение не имеет значения src.

person Mark Lapierre    schedule 08.03.2017
comment
Я хочу указать, что в C # этот метод возвращает String со словом false или true в зависимости от статуса изображения, просто не забудьте проанализировать его на Boolean, прежде чем возвращать его, иначе это не сработает. - person ManoPajaro; 24.06.2020