2013-05-28 8 views

Odpowiedz

9

Kolejne linie nie są zoptymalizowane, ale nie mogli znaleźć złamane zdjęć:

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 
} 

Odnośnie drugiego problemu, myślę, że nie rozumieli go prawidłowo. Czy mógłbyś wyjaśnić to bardziej szczegółowo?

+0

Witam Johnbo, jedno zdjęcie o nazwie "MyImage.jpg", po raz pierwszy wykonuję skrypt testowy MyImage found. ok po pewnym czasie zmiany programisty na stronie i ten "MyImage" jest zastępowany przez inny obraz o tej samej nazwie co "MyImage" (w folderze obrazów). Teraz wykonujemy skrypt testowy MyImage found i nasz skrypt testowy przechodzi. ale w rzeczywistości jest to błąd, ponieważ w interfejsie użytkownika wyświetla się inny obraz. Dziękujemy za szybką odpowiedź. – Chetan

+2

Jak widzę, należy zapisać obraz w pierwszym wykonaniu, aby można było go porównać w następnym czasie, ponieważ z punktu widzenia HTML strona mogłaby być dokładnie taka sama, a Selenium nie byłby w stanie znaleźć różnicy obrazów . A może możesz użyć Selenium w połączeniu z narzędziem do rozpoznawania obrazów, takim jak Sikuli Script. – Johnbo

+0

Zgadzam się, ale wszystkie obrazy ze strony internetowej są przechowywane, a następnie porównywane, co nie jest dobre w zależności od wydajności. możemy grać z rozmiarem obrazu (tzn. możemy przechowywać rozmiar obrazu i porównywać rozmiar obrazu następnym razem). dowolny pomysł proszę zasugerować. – Chetan

14

Przyjęta odpowiedź wymaga użycia serwera proxy z dodatkowym wywołaniem każdego obrazu w celu ustalenia, czy obrazy są uszkodzone, czy nie.

szczęście istnieje inny sposób można to zrobić tylko przy użyciu javascript (używam Ruby, ale można użyć tego samego kodu w jakikolwiek sposób executeScript całej wiązaniami 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? 

Do twojego drugiego pytania, polecam po prostu zrobienie zrzutu strony i ręczne sprawdzenie, czy wynikowy zrzut ekranu ma prawidłowe obrazy. Komputery mogą wykonywać prace automatyzacji, ale ludzie muszą od czasu do czasu sprawdzać i weryfikować wyniki :)

2

Na podstawie innych odpowiedzi, kod, który ostatecznie pracował dla mnie w ustawieniu kątowym/kątowym/webdriverjs jest:

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

Kod webdriver zlicza liczbę elementów iMG, a funkcja wykonywana w ramach przeglądarki zlicza liczbę powodzeniem obciążonych elementów. Te liczby powinny być takie same.

+0

"AllImgElts" w kątomierzu robi w zasadzie to samo, co "imgs" w przeglądarce - ziemia, prawda? (Nie jestem do końca przekonany, że tak, więc najczęściej o to pytam.) Ale gdyby były ... jedyną różnicą w długościach byłoby, gdyby jakikolwiek "img [i] .naturalWidth <= 0", prawda?Tak więc łatwiej byłoby pominąć 'allImgElts' i skrypt skryptów przeglądarki po prostu zwrócił liczbę obrazów z nieprawidłową naturalną szerokością i miałby kątomierz, który liczyłby się jako 0? (Tęsknisz za fantazyjnym zagnieżdżonym 'wtedy', co jest fajną sztuczką do zobaczenia.) –

+0

Tak, masz rację. Można to uprościć, zwracając liczbę uszkodzonych obrazów jako 'imgs.length - loaded', które można następnie oczekiwać jako 0. Wtedy' allImgEtls' nie jest już potrzebny. – avandeursen

Powiązane problemy