如何在Selenium Java中等待,直到正确加载了网页上的所有图像

时间:2019-02-17 14:48:07

标签: java selenium selenium-webdriver webdriverwait

当所有图像完全加载到网页时,我正在尝试截取该网页的屏幕截图。

尽管我认为该解决方案在堆栈溢出时已经可用,但是没有一个对我有用。我找到的最接近的解决方案是在这里:Wait for an image to be fully loaded Selenium WebDriver

但是在这段代码中,用javascript executer编写的arg不返回布尔输出,这就是为什么它给我一个错误。

以下代码正在使用,但在我的编译时错误中给出为“不兼容的操作数类型对象和  int”在这里对我也无效

 waitexternal.until(new Function<WebDriver, Boolean>(){
    @Override
    public Boolean apply(WebDriver ldriver) {
        ldriver = driver;
        JavascriptExecutor js = (JavascriptExecutor) driver;  

        return js.executeScript("return jQuery.active") == 0;

        //return (js.executeScript("return arguments[0]").equals("complete"));
        }
    }

   );

1 个答案:

答案 0 :(得分:3)

您可以使用document.images识别当前页面中的所有图像。您可以使用document.images.length检查当前页面中有多少张图片。

要检查这些图像是否正确加载,可以在每个图像上应用complete属性,例如document.images[0].complete,如果图像被加载,则该属性将返回true,否则将返回false。

Here the proof

下面的代码将首先检查是否加载DOM,然后如果加载了DOM,它将等待直到所有图像都加载到该页面中。

// Launching the browser
driver.get("http://www.google.com");

// Declaring and Casting driver to JavaScriptExecutor
JavascriptExecutor jse = (JavascriptExecutor) driver;
// Getting DOM status
Object result = jse.executeScript("return document.readyState;");
System.out.println("=> The status is : "+result.toString());
// Checking DOM loading is completed or not?
if(result.equals("complete")) {
    // Fetching images count
    result = jse.executeScript("return document.images.length");
    int imagesCount = Integer.parseInt(result.toString());
    boolean allLoaded = false;
    // Checking and waiting until all the images are getting loaded
    while(!allLoaded) {
        int count = 0;
        for(int i=0;i<imagesCount;i++) {
            result = jse.executeScript("return document.images["+i+"].complete;");
            boolean loaded = (Boolean) result;
            if(loaded) count++;
        }
        // Breaking the while loop if all the images loading completes
        if(count == imagesCount) {
            System.out.println("=> All the Images are loaded...");
            break;
        } else {
            System.out.println("=> Not yet loaded...");
        }
        Thread.sleep(1000);
    }
}

但是在使用上面的代码时要小心,因为如果根本没有加载元素,有时它可能会变成无穷大状态。

要检查是否已加载特定元素,可以执行以下操作:

// To check a particular element is loaded or not?
WebElement googleLogo = driver.findElement(By.id("hplogo"));
boolean loaded = (Boolean) jse.executeScript("return arguments[0].complete;", googleLogo);
System.out.println("The google logo is loaded ? "+loaded);

要等到特定图像加载完毕,您可以执行以下操作:

// To check a particular element is loaded or not?
WebElement googleLogo = driver.findElement(By.id("hplogo"));
while(!(Boolean) jse.executeScript("return arguments[0].complete;", googleLogo)) {
    System.out.println("=> The google logo is not yet loaded...");
    Thread.sleep(1000);
}
System.out.println("The google logo is loaded... ");

要了解有关JavaScript命令和JavaScriptExecutor的更多信息,请签出并订阅this channel

来源:HTML DOM images CollectionDocument.images

希望对您有帮助...