Недавно я попытался использовать метод 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 показывают, что она отлично работает с элементами, но не работает с атрибутами. Я могу понять, что не имеет смысла выделять атрибут, поскольку атрибуты не являются видимыми элементами страницы, но почему бы не выделить элемент, содержащий атрибут, и сделать его другим цветом? Возможно, нетривиальная задача ...
Мои вопросы:
Я определила результаты вышеупомянутых экспериментов до этих вопросов; в этом вся цель моего размещения здесь! Каждый из них кажется мне ошибкой, но дайте мне знать, если вы считаете, что мое использование неверно или есть обходной путь:
- Почему GetAttribute с типом локатора XPath однозначно требует явного типа локатора, тогда как другие методы (например, GetText) этого не делают?
- Почему локатор DOM завершился с ошибкой «not found»? (В руководстве также четко указано, что локаторы DOM не требуют явного префикса типа локатора, но я, тем не менее, попытался добавить «dom =» в качестве префикса в тест DOM; он все еще не удался.)
- Почему 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 #)