Блог вебразработчика
  • ГЛАВНАЯ
  • ПОДПИСКА

Selenium WebDriver: что на самом деле возвращают getAttribute(), getCssValue() и getText()

Окт03
2012
Написал Tatyana

Почему методы getAttribute() и getCssValue() возвращают не те значения, которые записаны в атрибуте и css?
Это происходит потому что getAttribute(), вопреки своему названию, возвращает значение свойства синхронизированного с атрибутом, и только в случае, если такое свойство не найдено, возвращает значение самого атрибута.

Немного теории про атрибуты и свойства.
У DOM-элементов в javascript есть свойства и атрибуты. DOM-элемент можно рассматривать с двух сторон. С первой он представляет собой объект javascript и как любой объект ООП имеет свойства. С другой стороны он является HTML элементом и может иметь любое заданное количество атрибутов. Доступ к свойствам элемента осуществляется через стандартный синтаксис, используя «.» (element.name). Доступ к атрибутам происходит посредством специальных методов: setAttribute(name, value), getAttribute(name) и т.д. На первый взгляд кажется, что свойства и атрибуты никак не связаны, но на самом деле между ними существует искусственное соответствие. Браузер синхронизирует некоторые свойства с атрибутами элемента, это гарантируется для всех основных стандартных атрибутов. Чаще всего имя атрибута полностью совпадает с именем свойства, но не всегда. Такая синхронизация означает, что изменение значения атрибута влечет за собой изменение значения свойства, и наоборот. Но не всегда значение просто устанавливается в свойство в исходном виде. Атрибут может быть любой строкой, он лишь показывает, что написано в исходном коде документа. Свойства же отображают текущее состояние элемента, и не могут содержать недопустимых значений.

Посмотрим как все это работает на практике. В качестве примера возьмем ползунок слайдера, при его передвижении изменяется значение left внутри атрибута style:

<a href="#" class="ui-slider-handle" style="left: 75%;"></a>

Вот так выглядят интересующие нас атрибуты на закладке «Стиль» плагина Firebug: Свойства объекта можно посмотреть на закладке DOM. Так выглядят синхронизированные с атрибутами свойства: А теперь посмотрим что возвращает Selenium при попытке получить атрибуты и css значения.

System.out.println("getCssValue(\"left\"): " + slider.getCssValue("left"));

System.out.println("getAttribute(\"style\"): " + 
							slider.getAttribute("style"));
System.out.println("getAttribute(\"offsetLeft\"): " + 
							slider.getAttribute("offsetLeft"));

System.out.println("getAttribute(\"href\"): " + 
							slider.getAttribute("href"));

Вывод в консоль:

getCssValue("left"): 66px
getAttribute("style"): left: 75%;
getAttribute("offsetLeft"): 66
getAttribute("href"): http://127.0.0.1/ui_test#

Значение, которое возвращает метод getCssValue() в некоторых случаях отличается от представленного в верстке, потому что getCssValue() возвращает уже окончательные вычисленные СSS-свойства элемента (в нашем случае проценты были пересчитаны в px).

Selenium вернул нам значение для параметра offsetLeft, хотя такой атрибут у элемента не задан. Фактически получается, что в метод можно передавать не только имена атрибутов, но и свойств. Аналогичным образом можно получить верстку элемента и другие интересующие Вас свойства:

webElement.getAttribute("innerHTML");

Такой подход к получению данных с одной стороны не соответствует названию метода, с другой — позволяет всегда получать текущие параметры элемента. Например, получение текста из input-полей (getAttribute("value")): атрибут value определяет только начальное значение для текстового поля и больше не изменяется. Текущее же значение хранится в свойстве value и изменяется через него же. Так как Selenium возвращает именно значение свойства, мы всегда можем получить актуальный текст в поле.

Что касается значения href, то здесь можно быть всегда уверенным, что ссылка вернется полной (абсолютной), даже если в атрибуте ссылка указана относительная.
Небольшое исключение составляет браузер IE до 8-мой версии, он старается по возможности уравнять свойства и атрибуты и не выполняет нормализацию ссылки в свойстве. В этом случае Selenium самостоятельно нормализует и возвращает абсолютную ссылку, обеспечивая этим одинаковую работу метода getAttribute() во всех браузерах.

Теперь о получении текста элемента. Текст можно получить двумя способами — getAttribute("text")(для input-полей getAttribute("value")) и методом getText().
Метод getAttribute("text") всегда возвращает значение атрибута без каких-либо преобразований — текст вернется точной копией, записанной в верстке.
В отличии от него метод getText() возвращает текст, выполняя его нормализацию аналогично браузеру, т.е. текст вернется таким, как отображается в браузере, несмотря на верстку.
getText() помимо текста самого элемента, склеивает в возвращаемое значение также и текст вложенных в него элементов, если только они видимы.
Что происходит с пробелами при нормализации:

  • несколько пробелов (табов или переводов строки), идущих подряд, заменяются одним единственным пробелом (кроме неразрывных ( ));
  • обычные пробелы вначале и в конце текста удаляются;
  • текст из тега <pre> или элементов со стилем «white-space: pre» возвращается с сохранением всех пробелов.
  • Нравится
  • Tweet

Опубликовано в Selenium - Помечено Selenium WebDriver
Рассказать всем Twitter Facebook Delicious StumbleUpon E-Mail
← Запустить FirefoxDriver с плагинами Firebug и FirePath
Hibernate 4 ORM: подключение и настройка →

2 комментариев

  1. Игорь's Gravatar Игорь
    23.01.2013 at 19:14 | Permalink

    Татьяна, благодарю Вас за Ваши статьи. Много полезного в них нашел 🙂
    Успехов Вам!

  2. Denis's Gravatar Denis
    30.05.2013 at 15:05 | Permalink

    Да. Огромное спасибо за статьи. Много интересного и полезного

Свежие записи

  • WebDriver и SSL Untrusted certificate
  • Видеозапись выполнения тестов Selenium
  • Selenium WebDriver: basic авторизация
  • BrowserMob Proxy + Selenium: автоматизация сбора данных о производительности
  • Hibernate 4: UserType пользовательский тип данных (часть 2)

Поиск

Рубрики

  • Hibernate ORM
  • SEO
  • Разное
  • Тестирование
    • JUnit
    • Selenium
    • Thucydides

Метки

Actions AJAX Alert AutoIt ChromeDriver Exceptions ExpectedConditions FindElement FirefoxDriver Hibernate InternetExplorerDriver Java Javascript Jenkins JUnit4 Maven PageFactory Page Object RemoteWebDriver Select Selenium IDE Selenium Server Selenium WebDriver switchTo Thucydides WebDriverWait XPath Автоматизированное тестирование база данных заработок в сети сеть Интернет скорость продвижения сайта статейное продвижение услуги продвижения

Реклама


Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.

Блог вебразработчика
Функциональное тестирование и продвижение сайтов

Яндекс.Метрика