четверг, 16 августа 2012 г.

Решение автоматизации проверки отображения изображений в обход браузера


Всем привет! Наверняка, каждый автоматизатор рано или поздно встречается с проблемой проверки изображений на странице. В частности, в моём случае, картинки отображались в одном браузере и не показывались в другом. Подробности под катом.


Проблема заключается в том, что браузер заменяет картинки прозрачным элементом, по размеру соответствующем изображению, поэтому обычное сравнение размеров в качестве решения не подходит. Рассмотрим, как можно справиться с этой задачей, используя С#, WebDriver и javascript. Ниже реализация проверки:  

     
       public bool IsIconPresented()
       {
           return IsElementIconPresented("return document.getElementsByClassName('TestСlass')[0].naturalWidth");
       }



В аргументе функции IsElementIconPresented кроется решение проблемы - свойство javascript naturalWidth для проверки ширины изображения. Оно возвращает действительный размер картинки, а не то, что из благих намерений подсовывает браузер. В таком случае, если картинка не подгрузилась на страницу, то скрипт вернет ноль. Рассмотрим эту функцию подробнее:


       private bool IsElementIconPresented(string script)
       {
           var isIconPresented = true;
           string imageWidthString = GetJavaScriptExecutingResult(script);
               var imageWidth = int.Parse(imageWidthString);
               if (imageWidth == 0)
               {
                   isIconPresented = false;
               }
           return isIconPresented;
       }



Функция GetJavaScriptExecutingResult() выполняет скрипт и возвращает результат в формате string (поэтому мне пришлось выполнить также преобразование в int для более удобного сравнения). Ну и само сравнение, так как isIconPresented у нас изначально истинно, остаётся добавить только случай, когда это не так. Аналогично naturalWidth есть также свойство naturalHeight для проверки высоты изображения, одного из них будет вполне достаточно. Для проверки однотипных выражений можно также создать цикл. Для этого достаточно составить XPath(вычислить id, либо любой другой подходящий вам метод), удовлетворяющий условиям всех картинок, вернув при этом их количество и затем по порядку пройтись по каждому из них.
Стоит сделать оговорку, что Internet Explorer как всегда отличился и в версиях 5-6 такой подход не принесет нужных результатов. Дело в том, что свойства naturalWidth и naturalHeight в нем просто отсутствуют.

Спасибо за внимание, пишите свои вопросы и замечания в комментарии, буду рад ответить!

2 комментария: