2013-05-28 38 views
11

Hi Tôi đang sử dụng selen webdriver 2.25.0 & faceing một số vấn đề nghiêm trọng,Tìm hình ảnh bị hỏng trong trang & hình ảnh thay thế bởi hình ảnh khác

  1. làm thế nào để tìm thấy hình ảnh bị hỏng trong một trang sử dụng Selenium Webdriver
  2. Cách tìm hình ảnh được thay bằng một hình ảnh khác có cùng tên (Đây cũng là lỗi) bằng cách sử dụng trình quản lý web.

Cảm ơn trước vì các đề xuất có giá trị của bạn.

Trả lời

9

Các dòng tiếp theo không được tối ưu hóa, nhưng họ có thể tìm thấy hình ảnh bị hỏng:

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 
} 

Về vấn đề thứ hai của bạn, tôi nghĩ rằng tôi không hiểu nó một cách chính xác. Bạn có thể giải thích chi tiết hơn không?

+0

Hi Johnbo, một hình ảnh có tên là "MyImage.jpg", lần đầu tiên tôi đang thực hiện tập lệnh thử nghiệm MyImage được tìm thấy. ok sau khi một số nhà phát triển thay đổi thời gian trên trang web và "MyImage" này được thay thế bằng hình ảnh khác có cùng tên với "MyImage" (Trên thư mục hình ảnh). Bây giờ, chúng tôi thực thi tập lệnh thử nghiệm MyImage đã tìm thấy và đoạn mã thử nghiệm của chúng tôi đã qua. nhưng thực ra nó là lỗi bởi vì trong giao diện người dùng, một hình ảnh khác được hiển thị. Cảm ơn bạn đã trả lời nhanh chóng. – Chetan

+2

Như tôi thấy, bạn cần lưu trữ hình ảnh trong lần thực hiện đầu tiên để bạn có thể so sánh nó lần sau, vì từ điểm HTML của trang có thể giống hệt nhau và Selenium sẽ không thể tìm thấy hình ảnh khác biệt . Hoặc có thể bạn có thể sử dụng Selenium cùng với một công cụ nhận dạng hình ảnh như Sikuli Script. – Johnbo

+0

tôi đồng ý nhưng tất cả các hình ảnh từ trang web là lưu trữ và sau đó so sánh, nó không tốt theo hiệu suất. chúng tôi có thể phát với kích thước hình ảnh (nghĩa là chúng tôi có thể lưu trữ kích thước hình ảnh và so sánh kích thước hình ảnh trong lần tiếp theo). bất kỳ ý tưởng xin đề nghị. – Chetan

14

Câu trả lời được chấp nhận yêu cầu bạn sử dụng proxy có thêm cuộc gọi đến từng hình ảnh để xác định xem hình ảnh có bị hỏng hay không.

May mắn thay, có một cách khác bạn có thể làm điều này chỉ sử dụng javascript (Tôi đang sử dụng Ruby, nhưng bạn có thể sử dụng cùng mã trong bất kỳ phương pháp executeScript qua bindings WebDriver):

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? 

Đối với câu hỏi khác của bạn, tôi khuyên bạn chỉ nên chụp ảnh màn hình của trang và có một con người bằng tay xác minh ảnh chụp màn hình kết quả có hình ảnh chính xác. Máy tính có thể thực hiện công việc tự động hóa, nhưng con người phải kiểm tra và xác minh kết quả của nó theo thời gian :)

2

Dựa trên các câu trả lời khác, mã cuối cùng hoạt động cho tôi trong cài đặt góc/thước đo/webdriverjs là:

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

Mã trình quản trị web đếm số phần tử img và chức năng được thực thi trong ngữ cảnh trình duyệt đếm số thành phần được tải thành công. Những con số này phải giống nhau.

+0

'allImgElts' trong vùng đất thước đo góc là cơ bản giống với' imgs' bên trong trình duyệt đất, phải không? (Tôi không thực sự tự tin họ, vì vậy phần lớn tôi đang hỏi điều này.) Nhưng, nếu họ ... sự khác biệt duy nhất về độ dài sẽ là nếu có bất kỳ 'img [i] .naturalWidth <= 0', phải không?Vì vậy, nó sẽ đơn giản và hiệu quả hơn để bỏ qua 'allImgElts', và có kịch bản lệnh trình duyệt trên mặt đất đơn giản trả về số lượng ảnh có chiều rộng tự nhiên không hợp lệ, và có vùng đất thước đo dự kiến ​​là 0? (Bạn sẽ bỏ lỡ cái nested ưa thích 'then' mà là một mẹo nhỏ gọn để xem, mặc dù.) –

+0

Vâng, bạn nói đúng. Điều này có thể được đơn giản hóa bằng cách trả về số lượng ảnh bị hỏng là 'imgs.length - loaded', mà bạn có thể mong đợi là 0. Sau đó,' allImgEtls' không cần thiết nữa. – avandeursen

Các vấn đề liên quan