我想找到整个网站的损坏图像。我只能对单个页面执行此操作,例如:主页。
我们如何为整个网站做到这一点?
要检查图像是否损坏,您只需检查元素的
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)它在 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);
}
希望这对您有帮助。
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);
如果对你有帮助请更新我。
在目标页面标题中,查找 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();
}
} }
这对你有用吗?因为我今天有同样的任务要交付..请分享