2017-04-13 1 views
0

Je veux trouver les images brisées pour l'ensemble du site. Je peux faire cela pour une seule page, ex: page d'accueil.Comment trouver des images brisées pour un site Web complet dans Selenium WebDriver en utilisant Java?

Comment pouvons-nous faire cela pour l'ensemble du site?

+0

-t-il besoin d'être Sélénium? J'aurais pensé qu'un robot d'indexation serait mieux pour ça. – halfer

+0

Oui, il doit être en sélénium. – MSL

+0

[Quelques idées ici] (https://duckduckgo.com/?q=selenium+site+crawler) - tout bon? – halfer

Répondre

0

J'ai le code suivant pour vous; mais cela a des dépendances/limitations suivantes:

1) Il fonctionne sur le chrome (peut me modifié pour fonctionner avec d'autres navigateurs)

2) Browser devrait être ouvert lors de l'exécution de ce code (car il utilise Java Robot class) donc après avoir appuyé sur RUN, laissez le navigateur être ouvert:

3) Thread.sleep (5000) est destiné à ne pas changer cela.

 driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); 

     List <WebElement> allImages = driver.findElements(By.tagName("img")); 

     for(WebElement img :allImages){ 

      String imgSrc = img.getAttribute("src"); 

      String baseHandle = driver.getWindowHandle(); 

      Actions action = new Actions(driver); 
      action.contextClick(img).build().perform(); 

      Thread.sleep(5000); 

      Robot robot = new Robot(); 

      robot.keyPress(KeyEvent.VK_DOWN); 
      robot.keyRelease(KeyEvent.VK_DOWN); 

      robot.keyPress(KeyEvent.VK_ENTER); 
      robot.keyRelease(KeyEvent.VK_ENTER); 

      Thread.sleep(5000); 

      Set<String> allHandles = driver.getWindowHandles(); 

      allHandles.remove(baseHandle); 

      String newHandle = null; 
      for(String str : allHandles){ 

       newHandle = str; 
      } 

      driver.switchTo().window(newHandle);  

      driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); 

      if(driver.findElement(By.tagName("body")).getText().contains("not found")){ 

       System.out.println(imgSrc + "Image is broken!"); 


      } 

      driver.close(); 

      driver.switchTo().window(baseHandle); 
      driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); 




     } 
+0

La plupart de ce code n'a rien à voir avec la question et ce n'est pas un bon moyen de détecter les images cassées. Ça va prendre une éternité pour naviguer vers chaque image sur la page. – JeffC

+0

yup .. votre réponse est meilleure. – kushal

2

Pour vérifier si une image est cassée, vous pouvez simplement vérifier si le naturalWidth de l'élément est 0. Vous feriez boucle à travers les images de la page et faire cette vérification pour chacun. Pour ce faire sur l'ensemble d'un site, vous devez construire un robot d'exploration ou idéalement en trouver un existant et c'est hors de portée pour une question sur SO.

Code de démonstration

driver.get("http://the-internet.herokuapp.com/broken_images"); 
for (WebElement image : driver.findElements(By.cssSelector("img"))) 
{ 
    isImageBroken(image); 
} 

La fonction pour tester des images brouillées

public void isImageBroken(WebElement image) 
{ 
    if (image.getAttribute("naturalWidth").equals("0")) 
    { 
     System.out.println(image.getAttribute("outerHTML") + " is broken."); 
    } 
} 

lors de son exécution, cette commande affiche

<img src="asdf.jpg"> is broken. 
<img src="hjkl.jpg"> is broken. 

Note: La fonction ci-dessus est un peu artificiel pour cette question . Il serait préférable de renvoyer un boolean et des validations ont été effectuées dans le script de test, par ex.

public boolean imageExists(WebElement image) 
{ 
    return !image.getAttribute("naturalWidth").equals("0"); 
} 
0

J'espère que cela va vous aider.

List<WebElement> links = driver.findElements(By.tagName("img")); 
      int brokenImagesCount=0; 
      for (int i = 0; i < links.size(); i++) { 
       System.out.println(links.get(i)); 
       String linkURL=links.get(i).getAttribute("src"); 
       System.out.println(links.get(i).getText()); 
       URL url = new URL(linkURL); 
       HttpURLConnection http = (HttpURLConnection) url.openConnection(); 
       http.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 
       http.setConnectTimeout(10000); 
       http.setReadTimeout(20000); 
       int statusCode=http.getResponseCode(); 
       if(statusCode==404||statusCode==500){ 
        brokenImagesCount=brokenImagesCount+1; 
        System.out.println(linkURL+"and its Status codes is:"+statusCode); 
       } 
      } 
      System.out.println("total number of broken images are: "+brokenImagesCount); 

Veuillez me mettre à jour si cela vous aide.

0
  1. Récupère xpath et utilise le nom de tag; obtenir tous les liens dans la page
  2. Cliquez sur chaque lien de la page
  3. Dans le titre de la page cible, recherchez l'erreur 404/500.

    public static void verifyimgActive(WebElement img) 
        { 
        try 
        { 
        HttpResponse response = new 
        DefaultHttpClient().execute(new HttpGet(img.getAttribute(“src”))); 
        if (response.getStatusLine().getStatusCode() != 200) 
        { 
         invalidimg++; 
        } 
        catch (Exception e) 
        { 
        e.printStackTrace(); 
         } 
        } }