您好我使用的是selenium webdriver 2.25.0&面对一些严重的问题,
提前感谢您提供有价值的建议。
答案 0 :(得分:14)
接受的答案要求您使用代理,对每个图像进行额外调用,以确定图像是否损坏。
幸运的是,还有另一种方法可以只使用javascript(我使用的是Ruby,但你可以在WebDriver绑定的任何executeScript
方法中使用相同的代码):
images = @driver.find_elements(:tag_name => "img")
broken_images = images.reject do |image|
@driver.execute_script("return arguments[0].complete && typeof arguments[0].naturalWidth != \"undefined\" && arguments[0].naturalWidth > 0", image)
end
# broken_images now has an array of any images on the page with broken links
# and we want to ensure that it doesn't have any items
assert broken_images.empty?
对于您的另一个问题,我建议您只需截取该页面的屏幕截图,并让人工手动验证生成的屏幕截图是否具有正确的图像。计算机可以进行自动化工作,但人类必须不时检查和验证其结果:)
答案 1 :(得分:9)
下一行未经优化,但他们可以找到损坏的图像:
List<WebElement> imagesList = _driver.findElements(By.tagName("img"));
for (WebElement image : imagesList)
{
HttpResponse response = new DefaultHttpClient().execute(new HttpGet(image.getAttribute("src");));
if (response.getStatusLine().getStatusCode() != 200)
// Do whatever you want with broken images
}
关于你的第二个问题,我认为我没有正确理解。你能详细解释一下吗?
答案 2 :(得分:2)
基于其他答案,最终在angular / protractor / webdriverjs设置中为我工作的代码是:
it('should find all images', function () {
var allImgElts = element.all(by.tagName('img'));
browser.executeAsyncScript(function (callback) {
var imgs = document.getElementsByTagName('img'),
loaded = 0;
for (var i = 0; i < imgs.length; i++) {
if (imgs[i].naturalWidth > 0) {
loaded = loaded + 1;
};
};
callback(loaded);
}).then(function (loadedImagesCount) {
expect(loadedImagesCount).toBe(allImgElts.count());
});
});
webdriver代码计算img元素的数量,浏览器上下文中执行的函数计算成功加载的元素的数量。这些数字应该相同。