Осложнения с помощью метода Selenium GetAttribute - PullRequest
5 голосов
/ 02 марта 2011

Недавно я попытался использовать метод GetAttribute для селена RC, но сразу столкнулся с проблемой. Я попытался выполнить очень простое selenium.GetAttribute("//a/@href"), но код выдал исключение SeleniumException с сообщением "ОШИБКА: не удалось найти атрибут элемента: // a / @ href" . Подставив selenium.GetText("//a[@href]") вместо вызова GetAttribute , я подтвердил, что элемент определенно присутствовал, так как это утверждение правильно вернуло текст ссылки.

Я тогда попробовал:

  • указывает на другую веб-страницу с другим протоколом (файл: /// vs http://) - та же проблема.
  • использование другого локатора xpath, указывающего на другой атрибут - та же проблема.
  • с использованием локатора DOM selenium.GetAttribute("document.getElementsByTagName('a')[0].getAttribute('href')") - та же проблема; немного другое сообщение об ошибке (и в сообщении об ошибке отсутствует последняя скобка): "ОШИБКА: Элемент document.getElementsByTagName ('a') [0] .getAttribute ('href' not found" * . Обратите внимание, что это точное выражение работает правильно в консоли Firebug.
  • с использованием абсолютной адресации вместо относительной xpath, с selenium.GetText("xpath=/html/body/a[@href]") для подтверждения существования и затем selenium.GetAttribute("xpath=/html/body/a/@href") для получения атрибута - и это сработало!

Хотя в руководстве четко указано, что относительно локаторов xpath не требуется явный тип локатора (то есть префикс "xpath ="), в нем ничего не говорится о absolute xpath locators; Из этого я понимаю, что префикс обязателен. Но из любопытства я вернулся к своему относительному выражению и добавил явный префикс - изменив selenium.GetAttribute("//a/@href") на selenium.GetAttribute("xpath=//a/@href") - и это тоже сработало!

Наконец, мои эксперименты с очень удобной кнопкой Найти в Selenium IDE показывают, что она отлично работает с элементами, но не работает с атрибутами. Я могу понять, что не имеет смысла выделять атрибут, поскольку атрибуты не являются видимыми элементами страницы, но почему бы не выделить элемент, содержащий атрибут, и сделать его другим цветом? Возможно, нетривиальная задача ...

Мои вопросы:

Я определила результаты вышеупомянутых экспериментов до этих вопросов; в этом вся цель моего размещения здесь! Каждый из них кажется мне ошибкой, но дайте мне знать, если вы считаете, что мое использование неверно или есть обходной путь:

  1. Почему GetAttribute с типом локатора XPath однозначно требует явного типа локатора, тогда как другие методы (например, GetText) этого не делают?
  2. Почему локатор DOM завершился с ошибкой «not found»? (В руководстве также четко указано, что локаторы DOM не требуют явного префикса типа локатора, но я, тем не менее, попытался добавить «dom =» в качестве префикса в тест DOM; он все еще не удался.)
  3. Почему Selenium IDE не выходит из строя более изящно при попытке выделить (найти) атрибут? При использовании того же локатора "xpath=//a/@href" нажатие кнопки «Поиск» приводит к появлению этого ужасного сообщения: «Локатор [error] не найден: xpath = // a / @ href, error = [Exception ...» Не удалось преобразовать аргумент JavaScript arg 0 [ inIFlasher.scrollElementIntoView] "nsresult:" 0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS) "location:" JS frame :: chrome: //selenium-ide/content/selenium-runner.js :: showElement :: line 386 "data: no] * *

Ваш запрос также запрашивается для следующего: Шаблон, который я хотел для каждого теста здесь, был (A) GetText ( локатор для элемента с атрибутом ) для подтверждения наличие элемента тогда (B) GetAttribute ( сам локатор для атрибута ). Из 6 слотов в таблице ниже я решил 3 из них успешно, как только подробно, а 4-й кажется ошибкой. Есть ли решения для оставшихся двух слотов?

Type    GetText       GetAttribute
XPath   //a[@href]    xpath=//a/@href
CSS     css=a[href]   ??
DOM     ??            document.getElementsByTagName('a')[0].getAttribute('href')

(Подробности: Selenium RC версия 1.0.3, Браузер: Firefox 3.6.13, Мой целевой код в C #)

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

Метод Selenium RC GetAttribute возвращает значение элемента \ атрибута locator. Общая форма для этих локаторов:

"[locator (id, xpath, css, etc)]@[attribute name]"

например

"SaveButton@href"

возвращает значение атрибута href для элемента с идентификатором SaveButton. Также можно использовать локаторы Xpath:

"xpath=//a[contains(@id, 'SaveButton')]@href"

возвращает значение атрибута href элемента, идентификатор которого содержит текст SaveButton.

Чтобы ответить на ваши вопросы,

  • 1: Я действительно не знаю, это вопрос к дизайнерам Selenium.

  • 2: Команды Selenium выполняют несколько разных «контекстов». В некоторых командах document относится к тестируемой веб-странице, в других командах document относится к странице, содержащей фрейм Selenium (полагаю, testRunner.html).

  • 3: в сообщении об ошибке говорится, что он не может найти запрошенный вами элемент. Информация после этого может быть полезной для команды Selenium, если на самом деле есть ошибка, но она не влияет на вас. Чем больше информации, тем лучше, верно?

0 голосов
/ 02 марта 2011

http://release.seleniumhq.org/selenium-remote-control/0.9.2/doc/java/com/thoughtworks/selenium/Selenium.html#getAttribute%28java.lang.String%29

getAttribute

java.lang.String getAttribute(java.lang.String attributeLocator)

    Gets the value of an element attribute.

    Parameters:
        attributeLocator - an element locator followed by an @ sign and then the name of the attribute, e.g. "foo@bar" 
    Returns:
        the value of the specified attribute

Итак, вы должны сказать selenium.GetAttribute("locator@href") Локатор - это идентификатор или имя.Если у вашего элемента нет идентификатора или имени, вы должны использовать xpath, selenium.GetAttribute("xpath=/html/body/a/@href"), как вы уже успешно пробовали.

...