如何使用Java在Selenium WebDriver中找到整个网站的损坏图像?

时间:2017-04-13 10:06:29

标签: image selenium web driver

我想找到整个网站的破碎图像。我只能在一个页面上执行此操作,例如:主页。

我们怎样才能为整个网站做到这一点?

4 个答案:

答案 0 :(得分:4)

要检查图像是否损坏,您只需检查元素的naturalWidth是否为0.您将遍历页面上的图像并对每个图像进行检查。至于在整个网站上执行此操作,您必须构建一个爬虫或理想地找到一个现有的爬虫,并且这个问题超出了SO的问题范围。

演示代码

driver.get("http://the-internet.herokuapp.com/broken_images");
for (WebElement image : driver.findElements(By.cssSelector("img")))
{
    isImageBroken(image);
}

测试损坏图像的功能

public void isImageBroken(WebElement image)
{
    if (image.getAttribute("naturalWidth").equals("0"))
    {
        System.out.println(image.getAttribute("outerHTML") + " is broken.");
    }
}

运行时,输出

<img src="asdf.jpg"> is broken.
<img src="hjkl.jpg"> is broken.

注意:上述功能有点为这个问题而设计。如果它返回boolean并且在测试脚本中完成了验证,例如

,那会更好
public boolean imageExists(WebElement image)
{
    return !image.getAttribute("naturalWidth").equals("0");
}

答案 1 :(得分:0)

我为您代码;但这具有以下依赖性/限制:

1)它在chrome上运行(我可以修改为与其他浏览器一起使用)

2)运行此代码时应该打开浏览器(因为它使用了Java Robot类)所以在点击RUN后,让浏览器打开:

3)Thread.sleep(5000)不打算改变它。

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

        List <WebElement>  allImages = driver.findElements(By.tagName("img"));

        for(WebElement img :allImages){

            String imgSrc = img.getAttribute("src");

            String baseHandle = driver.getWindowHandle();

            Actions action = new Actions(driver);
            action.contextClick(img).build().perform();

            Thread.sleep(5000);

            Robot robot = new Robot();

            robot.keyPress(KeyEvent.VK_DOWN);
            robot.keyRelease(KeyEvent.VK_DOWN);

            robot.keyPress(KeyEvent.VK_ENTER);
            robot.keyRelease(KeyEvent.VK_ENTER);

            Thread.sleep(5000);

            Set<String> allHandles = driver.getWindowHandles();

            allHandles.remove(baseHandle);

            String newHandle = null;
            for(String str : allHandles){

                newHandle = str;
            }

            driver.switchTo().window(newHandle);    

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

            if(driver.findElement(By.tagName("body")).getText().contains("not found")){

                System.out.println(imgSrc  + "Image is broken!");


            }

            driver.close();

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




        }

答案 2 :(得分:0)

我希望这会对你有所帮助。

List<WebElement> links = driver.findElements(By.tagName("img"));
            int brokenImagesCount=0;
            for (int i = 0; i < links.size(); i++) {
                System.out.println(links.get(i));
                String linkURL=links.get(i).getAttribute("src");
                System.out.println(links.get(i).getText());
                URL url = new URL(linkURL);
                HttpURLConnection http = (HttpURLConnection) url.openConnection();
                http.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
                http.setConnectTimeout(10000);
                http.setReadTimeout(20000);
                int statusCode=http.getResponseCode();
                if(statusCode==404||statusCode==500){
                    brokenImagesCount=brokenImagesCount+1;
                    System.out.println(linkURL+"and its Status codes is:"+statusCode);
                }
            }
            System.out.println("total number of broken images are: "+brokenImagesCount);

如果有帮助,请更新我。

答案 3 :(得分:0)

  1. 获取xpath,然后使用标记名称;获取页面中的所有链接
  2. 点击页面中的每个链接
  3. 在目标网页标题中,查找404/500错误。

     public static void verifyimgActive(WebElement img)
       { 
         try
       { 
         HttpResponse response = new 
         DefaultHttpClient().execute(new HttpGet(img.getAttribute(“src”))); 
        if (response.getStatusLine().getStatusCode() != 200) 
       {  
           invalidimg++;  
        } 
      catch (Exception e)
        {
         e.printStackTrace();
          } 
         } }