Изчакайте изображението да се зареди напълно 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