2013-05-28 11 views
11

Ciao Sto usando il selenio WebDriver 2.25.0 & faceing i alcuni seri problemi,Trova immagini spezzate in pagina e immagine sostituire da un'altra immagine

  1. come trovare le immagini spezzate in una pagina utilizzando Selenio WebDriver
  2. Come trovare l'immagine è sostituita da un'altra immagine con lo stesso nome (Questo è anche un bug) utilizzando il webdriver.

Grazie in anticipo per i vostri suggerimenti di valore.

risposta

9

Le prossime linee non sono ottimizzati, ma potrebbero trovare immagini spezzate:

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 
} 

Per quanto riguarda il secondo problema, penso che non ho capito correttamente. Potresti spiegarlo con più dettagli?

+0

Hi Johnbo, Un'immagine che ha il nome è "MyImage.jpg", la prima volta che eseguo il mio script di prova MyImage trovato. ok, dopo un po 'di tempo gli sviluppatori cambiano sul sito e questa "MyImage" è sostituita da un'altra immagine con lo stesso nome di "MyImage" (sulla cartella delle immagini). Ora eseguiamo lo script di test MyImage trovato e il nostro script di test pass. ma in realtà è un bug perché in UI viene visualizzata un'altra immagine. Grazie per la tua risposta veloce. – Chetan

+2

Come ho visto, è necessario memorizzare l'immagine nella prima esecuzione in modo da poterla confrontare le volte successive, perché dal punto di vista HTML la pagina potrebbe essere esattamente la stessa e Selenium non sarebbe in grado di trovare la differenza di immagini . O forse potresti usare il selenio in combinazione con uno strumento di riconoscimento dell'immagine come Sikuli Script. – Johnbo

+0

sono d'accordo ma tutte le immagini dalla pagina web sono archiviate e quindi confrontate, non è buono in base alle prestazioni. possiamo giocare con le dimensioni dell'immagine (ad esempio, possiamo memorizzare le dimensioni dell'immagine e confrontare la dimensione dell'immagine la prossima volta). qualsiasi idea si prega di suggerire. – Chetan

14

La risposta accettata richiede l'utilizzo di un proxy con una chiamata aggiuntiva a ciascuna immagine per determinare se le immagini sono interrotte o meno.

Per fortuna, c'è un altro modo è possibile farlo utilizzando solo javascript (sto usando Ruby, ma è possibile utilizzare lo stesso codice in qualsiasi metodo executeScript attraverso le associazioni 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? 

Per la tua altra domanda, ti consiglio di prendere uno screenshot della pagina e di verificare manualmente che lo screenshot risultante abbia le immagini corrette. I computer possono fare il lavoro di automazione, ma gli umani devono controllare e verificare i suoi risultati di volta in volta :)

2

Sulla base delle altre risposte, il codice che alla fine ha funzionato per me in un'impostazione angolare/goniometro/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()); 
    }); 
}); 

il codice WebDriver conta il numero di elementi img, e la funzione eseguita all'interno del contesto del browser conta il numero di elementi caricati con successo. Questi numeri dovrebbero essere gli stessi.

+0

Il 'allImgElts' in goniometro sta facendo fondamentalmente la stessa cosa del' imgs' all'interno del browser-land, giusto? (Non sono davvero sicuro che lo siano, quindi per lo più lo sto chiedendo.) Ma, se fossero ... l'unica differenza di lunghezza sarebbe se qualche 'img [i] .naturalWidth <= 0', giusto?Quindi, sarebbe più semplice ed efficiente ignorare 'allImgElts', e lo script del browser-land restituirà semplicemente il numero di immagini con larghezza naturale non valida, e il terreno con goniometro si aspetta che il conteggio sia 0? (Ti mancherà la fantasia nidificata "allora", che è un trucco ben fatto per vedere, però.) –

+0

Sì, hai ragione. Questo può essere semplificato restituendo il numero di immagini spezzate come 'imgs.length-loaded', che puoi quindi aspettarti di essere 0. Quindi il' allImgEtls' non è più necessario in effetti. – avandeursen

Problemi correlati