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

问题描述 投票:0回答:5

我想找到整个网站的损坏图像。我只能对单个页面执行此操作,例如:主页。

我们如何为整个网站做到这一点?

image selenium web-scraping
5个回答
6
投票

要检查图像是否损坏,您只需检查元素的

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");
}

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);




        }

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);

如果对你有帮助请更新我。


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();
          } 
         } } 
    

0
投票

这对你有用吗?因为我今天有同样的任务要交付..请分享

© www.soinside.com 2019 - 2024. All rights reserved.