在页面中查找损坏的图像&图像被另一个图像替换

时间:2013-05-28 05:33:04

标签: webdriver selenium-webdriver

您好我使用的是selenium webdriver 2.25.0&面对一些严重的问题,

  1. 如何使用Selenium Webdriver在页面中查找损坏的图像
  2. 如何使用webdriver替换另一个具有相同名称的图像(这也是错误)。
  3. 提前感谢您提供有价值的建议。

3 个答案:

答案 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元素的数量,浏览器上下文中执行的函数计算成功加载的元素的数量。这些数字应该相同。