Перейти к содержимому

Фотография

Что делать если нет id


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 23

#1 Greed

Greed

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Чуканцев Алексей Алексеевич

Отправлено 19 января 2010 - 13:53

Коллективный разум помоги)
Если коротко, то суть в следующем - разрабатывается класс с методами которые возвращают массив данных о странице, т.е. своего рода слепок состояния страницы.
Пример для полей
public void GetFields()        {            string[] Field = Selenium.GetAllFields();            int j=Field.Count();            string[] Store = new string[j];            for (int i = 0; i<j; i++)            {                Store[i] ="//.[@id='" + Field[i] + "']/..";                string[] Inner = new string[j];                Inner[i] = Selenium.GetText(Store[i]);            }           }
Как получить XPath элементов если нет ID? Хочется просто сделать аналогичный метод, но GetButtons и GetLinks не спасают(
  • 0

#2 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 19 января 2010 - 17:41

Коллективный разум помоги)
Если коротко, то суть в следующем - разрабатывается класс с методами которые возвращают массив данных о странице, т.е. своего рода слепок состояния страницы.
Пример для полей

public void GetFields()        {            string[] Field = Selenium.GetAllFields();            int j=Field.Count();            string[] Store = new string[j];            for (int i = 0; i<j; i++)            {                Store[i] ="//.[@id='" + Field[i] + "']/..";                string[] Inner = new string[j];                Inner[i] = Selenium.GetText(Store[i]);            }           }
Как получить XPath элементов если нет ID? Хочется просто сделать аналогичный метод, но GetButtons и GetLinks не спасают(


Ясно что в методы типа GetAllFields возвращают список id объектов. Ну если их нет, то будет просто массив пустых строк, т.е. вы сможете из этого найти лишь общее количество необходимых элементов на странице. Дальше уже надо играть с XPATH или с другими типами локаторов, например dom: dom=document.links[0]
Короче говоря: "Безвыходных ситуаций не бывает", как говорил мой преподаватель в ВУЗЕ: "читайте методичку" :)

ЗЫ Немного не понял логику Вашего примера... Вы в цикле создаете массив Inner, и загоняете в него Selenium.GetText(Store[i]). Что это Вам даст? Ведь массив будет пересоздаваться при каждой итерации и данные не будут сохранены :)

ЗЫЫ Не обязательно XPATH получать, его можно самому написать, главное знать структуру вашего HTML документа и в путь...
  • 0
Алексей Булат
Про Тестинг

#3 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 19 января 2010 - 17:56

Коллективный разум помоги)
Если коротко, то суть в следующем - разрабатывается класс с методами которые возвращают массив данных о странице, т.е. своего рода слепок состояния страницы.
Пример для полей

....
Как получить XPath элементов если нет ID? Хочется просто сделать аналогичный метод, но GetButtons и GetLinks не спасают(

Используйте другие атрибуты. Ищите общие части нужной вам группы.

Например, нам надо получить тексты всех кнопок на странице. Мы знаем, что все кнопки в ХТМЛ реализованы так: <input type=button value='some_text' />

Тогда:
int count = getXPathCount( "//input[@type='button']" );
String names[] = new String[count];

for( int i = 0; i < count; i++ ){
	 names[i] = getAttribute( "xpath=(//input[@type='button'])[" + ( i + 1 ) + "]@value" ); 
	 // Yes, author knows about getValue, but it's general case and some other attribute may be in use
}

  • 0

#4 Greed

Greed

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Чуканцев Алексей Алексеевич

Отправлено 20 января 2010 - 07:36

ЗЫ Немного не понял логику Вашего примера... Вы в цикле создаете массив Inner, и загоняете в него Selenium.GetText(Store[i]). Что это Вам даст? Ведь массив будет пересоздаваться при каждой итерации и данные не будут сохранены :)

Просто потом этот масив записывается в xml, а если такой файл существует то происходит проверка текущей страницы с эталоном(вдруг появились новые элементы).

З.Ы, KaNoN и Boltick спасибо за оперативность)))
  • 0

#5 Greed

Greed

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Чуканцев Алексей Алексеевич

Отправлено 20 января 2010 - 07:45

KaNoN, а вы не знаете можно ли как-нибудь(не в ручную) получить путь до <input type=button value='some_text' />, не зная его атрибутов?
  • 0

#6 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 20 января 2010 - 09:31

int count = getXPathCount( "//input[@type='button']" );
String names[] = new String[count];

for( int i = 0; i < count; i++ ){
	 names[i] = getAttribute( "xpath=(//input[@type='button'])[" + ( i + 1 ) + "]@value" ); 
	 // Yes, author knows about getValue, but it's general case and some other attribute may be in use
}

Если не ошибаюсь, то в случае если искомого атрибута в объекте не будет, то вывалится exception. Так что придется быть осторожным и учитывать это в своем коде... Вот.

И еще, для получения текста внутри элемента есть метод:

getText("xpath=(//a)[10]") - возвращает текст ссылки с индексом 10.

  • 0
Алексей Булат
Про Тестинг

#7 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 20 января 2010 - 09:51

int count = getXPathCount( "//input[@type='button']" );
String names[] = new String[count];

for( int i = 0; i < count; i++ ){
	 names[i] = getAttribute( "xpath=(//input[@type='button'])[" + ( i + 1 ) + "]@value" ); 
	 // Yes, author knows about getValue, but it's general case and some other attribute may be in use
}

Если не ошибаюсь, то в случае если искомого атрибута в объекте не будет, то вывалится exception. Так что придется быть осторожным и учитывать это в своем коде... Вот.

И еще, для получения текста внутри элемента есть метод:

getText("xpath=(//a)[10]") - возвращает текст ссылки с индексом 10.

Кстати, для input type=button этот метод вернет в лучшем случае пустую строку, насколько я помню. getText возвращает текст между открывающимся и закрывающимся тегами указанного элемента.

KaNoN, а вы не знаете можно ли как-нибудь(не в ручную) получить путь до <input type=button value='some_text' />, не зная его атрибутов?

Некоторые атрибуты так или иначе присутствуют в любом случае. Например, практически для всех элементов input задан атрибут type. Если он не задан явно, то по умолчанию type=text. То есть, переборку по данным элементам можно делать "не глядя".

В случае <input type=button value='some_text' /> атрибуты могут даже определяться просто глядя на этот элемент на странице. Например, если элемент - кнопка, то текст, отображаемый в кнопке, задается атрибутом value. Тут нужно знать, как устроен ХТМЛ ( если с этим трудно, то я рекомендую уделить этому внимание, так как подобные знания очень полезны для задач автоматизации ).

Просто надо понимать, какие атрибуты у элементов, как правило, присутствуют в обязательном порядке. Тогда вручную смотреть не надо.

Более тонкая настройка с копанием атрибутов нужна, когда нужно перебрать не все элементы, а некоторое их подмножество.
  • 0

#8 Greed

Greed

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Чуканцев Алексей Алексеевич

Отправлено 20 января 2010 - 09:56

Спасибо Boltick за идею. Вот её реализация. Зная значение и тип можно и Xpath генить. Только проблема если у ссылки нет текста(он находиться не внутри <a></a>)


  • 0

#9 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 20 января 2010 - 10:11

Спасибо Boltick за идею. Вот её реализация. Зная значение и тип можно и Xpath генить. Только проблема если у ссылки нет текста(он находиться не внутри <a></a>)

Тогда фактически это будет не ссылка, а какой-то другой объект с хитро навороченным обработчиком нажатия. Другое дело, если внутри ссылки рисунок и нет текста. Тогда getText вернет пустую строку.
  • 0

#10 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 20 января 2010 - 15:07

Тогда фактически это будет не ссылка, а какой-то другой объект с хитро навороченным обработчиком нажатия. Другое дело, если внутри ссылки рисунок и нет текста. Тогда getText вернет пустую строку.

Именно поэтому и приходится лезть в код HTML и перепроверять там...
  • 0
Алексей Булат
Про Тестинг

#11 Greed

Greed

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Чуканцев Алексей Алексеевич

Отправлено 20 января 2010 - 15:41

Извините за назойливость. Но кто-нибудь знает как прописать обращение к атрибуту наследуемому от элемента с индексом
getAtribute("xpath=(//a)[10]"@text) - возвращает текст ссылки с индексом 10.
В верхнем примере всё красиво и удобно, но что делать если нужен атрибут наследуемый от элемента с индексом, т.е.
<a text=smt><img alt="hello"></a>
Как будет выглядеть переделанный верхний пример если нужно получить alt?
  • 0

#12 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 20 января 2010 - 15:51

Извините за назойливость. Но кто-нибудь знает как прописать обращение к атрибуту наследуемому от элемента с индексом
В верхнем примере всё красиво и удобно, но что делать если нужен атрибут наследуемый от элемента с индексом, т.е.
<a text=smt><img alt="hello"></a>
Как будет выглядеть переделанный верхний пример если нужно получить alt?

пробуем:
getAttribute("xpath=(//a)[10]/img@alt")
  • 0
Алексей Булат
Про Тестинг

#13 Greed

Greed

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Чуканцев Алексей Алексеевич

Отправлено 21 января 2010 - 11:44

пробуем:
getAttribute("xpath=(//a)[10]/img@alt")


getAttribute("xpath=(//a)[10]/img@alt") не срабатывает - возвращает
{"ERROR: Element xpath=(//a)[1]/img not found"}
Но элемент есть. Пришлось вот так выкручиваться:
В итоге имеем Inner[] который содержит все Xpath ссылок на странице.
  • 0

#14 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 21 января 2010 - 21:38

В итоге имеем Inner[] который содержит все Xpath ссылок на странице.

... если только среди них не окажется двух ссылок с одинаковым текстом.

Скажите, что удерживает Вас от использования какого-нибудь другого фреймворка и заставляет мужественно сражаться с недостатками XPath-локаторов?
Действительно ли эта борьба стоит затраченных усилий?

Вот так, например, выглядел бы сбор ссылок со страницы и получение их атрибутов при использовании WebDriver (код на Java):

List<WebElement> links = webDriver.findElements(By.tagName("a"));
		for (WebElement link : links) {
			String href = link.getAttribute("href");
			String alt = link.getAttribute("alt");
			// do something with these attributes
		}

  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#15 Greed

Greed

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Чуканцев Алексей Алексеевич

Отправлено 22 января 2010 - 13:59

Скажите, что удерживает Вас от использования какого-нибудь другого фреймворка и заставляет мужественно сражаться с недостатками XPath-локаторов?


Использование visual studio с С#, и постановка задачи руководства(
  • 0

#16 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 22 января 2010 - 22:04

Скажите, что удерживает Вас от использования какого-нибудь другого фреймворка и заставляет мужественно сражаться с недостатками XPath-локаторов?


Использование visual studio с С#, и постановка задачи руководства(

Ну тогда Вам дважды повезло :)

Вот аналогичный фрагмент кода с использованием WatiN:

LinkCollection links = ie.Links;
			foreach (Link link in links)
			{
				String href = link.GetAttributeValue("href");
				String alt = link.GetAttributeValue("alt");
				// do something with these attributes
			}

А вот оно же, но с использованием WebAii:

IList<Element> links = ie.Find.AllByTagName("a");
			foreach (Element link in links)
			{
				String href = link.GetAttributeValueOrEmpty("href");
				String alt = link.GetAttributeValueOrEmpty("alt");
				// do something with these attributes
			}


А вообще -- не всё ли равно менеджеру, на каком языке будут разработаны автотесты и какие инструменты для этого будут использоваться?
Может быть Ваше руководство лучше тестировщиков знает, на чём удобнее всего разрабатывать автотесты?
Если это так -- значит оно специально ставит задачу так, чтобы её решать было посложнее, чтобы вы не сидели сложа руки, а добывали свой хлеб тяжёлым трудом. Да ещё и программистов подначивает -- не делайте, мол, идентификаторы у элементов, пусть тестировщики помучаются.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#17 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 23 января 2010 - 13:57

А вообще -- не всё ли равно менеджеру, на каком языке будут разработаны автотесты и какие инструменты для этого будут использоваться?

По-хорошему, не все равно, какой язык использовать, особенно учитывая, что есть такая штука как Continuous Integration, а также если эти тесты используют разработчики. С инструментами тут попроще, но опять же, собрать полную солянку разных тулов - это тоже чревато дополнительными проблемами. Поэтому, слишком много средств и библиотек одновременно лучше не использовать.

Может быть Ваше руководство лучше тестировщиков знает, на чём удобнее всего разрабатывать автотесты?

Если под руководством подразумевать тех-лида, то 100% да.
  • 0

#18 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 24 января 2010 - 20:21

А вообще -- не всё ли равно менеджеру, на каком языке будут разработаны автотесты и какие инструменты для этого будут использоваться?

По-хорошему, не все равно, какой язык использовать, особенно учитывая, что есть такая штука как Continuous Integration, а также если эти тесты используют разработчики. С инструментами тут попроще, но опять же, собрать полную солянку разных тулов - это тоже чревато дополнительными проблемами. Поэтому, слишком много средств и библиотек одновременно лучше не использовать.

Ничего не имею против, когда кто-нибудь говорит -- мы используем этот инструмент потому, что наш CI-сервер поддерживает только его (хотя возникает вопрос, что это за CI-сервер такой привередливый), или говорит -- наши разработчики хотят, чтобы тесты были написаны на нём, потому что они хотят их сами запускать (хотя тоже возникает вопрос -- чего это вдруг дотнет-разработчики могут запустить Selenium и не могут WatiN, второй запускать из MSVS проще).

Но меня всегда напрягает, если на вопрос "почему используете этот инструмент" я получаю ответ "мне так сказали".
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#19 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 25 января 2010 - 08:02

Но меня всегда напрягает, если на вопрос "почему используете этот инструмент" я получаю ответ "мне так сказали".

Просто в этой деятельности может быть задействована целая команда, а отдельно ызятый человек - просто один из исполнителей. Вот тут кто-то действует, потому что "он так решил", а другие - "потому что так сказали". Иначе будет разброд и шатание.
  • 0

#20 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 25 января 2010 - 10:22

Но меня всегда напрягает, если на вопрос "почему используете этот инструмент" я получаю ответ "мне так сказали".

Просто в этой деятельности может быть задействована целая команда, а отдельно ызятый человек - просто один из исполнителей. Вот тут кто-то действует, потому что "он так решил", а другие - "потому что так сказали". Иначе будет разброд и шатание.

Согласен! В команде нужно придерживаться правил командной игры иначе будут "штрафные, оффсайды и пенальти"...
Когда я работал в Москве мы писали тесты на ДЖАВА, так чтобы найти новых автотестеров в команду требовались месяцы... т.к. никто не знал джаву :) знали всякие бейсики и т.д. или умели тока рекордить тесты... УЖОС... Со временем компания переехала на другой континент, а там людей, с аналогичным нашему, опытом не было, так что наши тесты погрузились в пучину SVN и больше не запускаются, ибо саппорить их было некому...
Вот...

Это к вопросу о выборе инструмента, языка и командной игре :) может не в тему, но я так не думаю :)
  • 0
Алексей Булат
Про Тестинг


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных