2017-02-16 8 views
0

Я использую selenium webdriver + TestNG. Помогите мне решить следующий вопрос, если это возможно:Есть ли способ использовать утверждение в цикле для поиска всех сломанных изображений на странице

Поиск всех сломанных изображений на странице и их отображение (с использованием утверждения) в консоли после завершения теста.

Следующий тест терпит неудачу после первого сломаны изображение найдено, мне нужно тест, чтобы проверить, все изображения и показать результат, когда он терпит неудачу:

public class BrokenImagesTest3_ { 

@Test 
public static void links() throws IOException, StaleElementReferenceException { 

    System.setProperty("webdriver.chrome.driver", "/C: ..."); 
    WebDriver driver = new ChromeDriver(); 
    driver.manage().window().maximize(); 
    driver.get("https://some url"); 

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

    //Find total Number of links on page and print In console. 
    List<WebElement> total_images = driver.findElements(By.tagName("img")); 
    System.out.println("Total Number of images found on page = " + total_images .size()); 

    //for loop to open all links one by one to check response code. 
    boolean isValid = false; 
    for (int i = 0; i < total_images .size(); i++) { 
     String image = total_images .get(i).getAttribute("src"); 


     if (image != null) { 

      //Call getResponseCode function for each URL to check response code. 
      isValid = getResponseCode(image); 

      //Print message based on value of isValid which Is returned by getResponseCode function. 
      if (isValid) { 
       System.out.println("Valid image:" + image); 
       System.out.println("----------XXXX-----------XXXX----------XXXX-----------XXXX----------"); 
       System.out.println(); 
      } else { 
       System.out.println("Broken image ------> " + image); 
       System.out.println("----------XXXX-----------XXXX----------XXXX-----------XXXX----------"); 
       System.out.println(); 
      } 
     } else { 
      //If <a> tag do not contain href attribute and value then print this message 
      System.out.println("String null"); 
      System.out.println("----------XXXX-----------XXXX----------XXXX-----------XXXX----------"); 
      System.out.println(); 
      continue; 
     } 

    } 
    driver.close(); 
} 

//Function to get response code of link URL. 
//Link URL Is valid If found response code = 200. 
//Link URL Is Invalid If found response code = 404 or 505. 
public static boolean getResponseCode(String chkurl) { 
    boolean validResponse = false; 
    try { 
     //Get response code of image 
     HttpClient client = HttpClientBuilder.create().build(); 
     HttpGet request = new HttpGet(chkurl); 
     HttpResponse response = client.execute(request); 
     int resp_Code = response.getStatusLine().getStatusCode(); 
     System.out.println(resp_Code); 
     Assert.assertEquals(resp_Code, 200); 
     if (resp_Code != 200) { 
      validResponse = false; 
     } else { 
      validResponse = true; 
     } 
    } catch (Exception e) { 

    } 
    return validResponse; 
    } 
} 

ответ

2

Причина, по которой ваш код останавливается при первом сбое, заключается в том, что вы используете Assert для resp_Code, чтобы равняться 200. TestNG прекратит выполнение при первом неудавшемся утверждении.

Я бы сделал это несколько иначе. Вы можете использовать селектор CSS, чтобы найти только изображения, которые содержат атрибут src, используя "img[src]", поэтому вам не придется иметь дело с этим делом. Когда я ищу разбитые изображения, я использую атрибут naturalWidth. Это будет 0, если изображение сломано. Используя эти две части, код будет выглядеть ...

List<WebElement> images = driver.findElements(By.cssSelector("img[src]")); 
System.out.println("Total Number of images found on page = " + images.size()); 
int brokenImagesCount = 0; 
for (WebElement image : images) 
{ 
    if (isImageBroken(image)) 
    { 
     brokenImagesCount++; 
     System.out.println(image.getAttribute("outerHTML")); 
    } 
} 
System.out.println("Count of broken images: " + brokenImagesCount); 
Assert.assertEquals(brokenImagesCount, 0, "Count of broken images is 0"); 

затем добавить эту функцию

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

Я только выписывая образы, которые разбиты. Я предпочитаю этот метод, так как он сохраняет очиститель журнала. Написание image собирается писать тарабарщину, которая не будет полезна, поэтому я изменил это, чтобы написать externalHTML, который является HTML-тегом IMG.

+0

В таких случаях я часто добавляю атрибуты src недопустимых изображений в построитель строк и утверждаю, что его длина равна нулю, используя содержимое компоновщика как часть сообщения. Таким образом, вы получаете что-то более конкретное в журнале. –

+0

Скорее всего, вы получите устаревший элемент, если вы перейдете через список '' WebElement''''''''''''''''''''''''''''''''''''1. –

+0

@PeteKirkham Эти недопустимые изображения не содержат пустой src. Селектор CSS отфильтровывает их. Это больше вокруг изображений, которые не существуют или плохих URL-адресов. Любой, у кого ошибка, будет иметь полный HTML-код тега IMG, зарегистрированного в любом случае. – JeffC

0

assertEquals() бросает AssertionError, не Exception. Если коды не равны в вашем случае, это бросит AssertionError, и ваш тест остановится и закончится как неудачный. Если вы поймаете Error вместо Exception в своем catch(), вероятно, он должен работать так, как вы ожидаете.

0

В качестве дополнения к JeffC х, я предпочитаю, чтобы собрать ошибочные атрибуты в исходные тексты и сообщать о них как провал, а не войдя в отдельный файл, что-то вроде:

List<WebElement> images = driver.findElements(By.cssSelector("img[src]")); 
System.out.println("Total Number of images found on page = " + images.size()); 
StringBuilder brokenImages = new StringBuilder(); 
for (WebElement image : images) 
    if (isImageBroken(image)) 
     brokenImages.append(image.getAttribute("src")).append(";"); 
Assert.assertEquals(brokenImages.getLength(), 0, 
    "the following images failed to load", brokenImages); 

(только ответ, как это проще объясните с кодом, чем в комментарии)