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

Фотография

Selenium + Thucydides + Java: Собрать, прокликать и проверить все ссыл


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

#1 Lace

Lace

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

  • Members
  • Pip
  • 48 сообщений

Отправлено 02 августа 2013 - 07:56

Заголовок должен быть: Selenium + Thucydides + Java: Собрать, прокликать и проверить все ссылки внутри элемента

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

Есть элемент с id = "names". Внутри этого элемента лежат ссылки. Каждая ссылка - это имя.
Код такой:
<ul id="names">
<li>
<strong>IVANOV</strong>
<ul>
<li>
<a href="#">IVANOV</a>
</li>
</ul>
</li>
</ul>
Мне надо: Собрать в List все имена, сохранить каждое значение href как String (для последующего сравнения).
После нажать на каждую ссылку внутри элемента, сравнить что открывшаяся страница содержит имя (String, сохраненный на предыдущем шаге).
Вернуться на предыдущую страницу.
Нажать следующую ссылку с именем, сравнить имена и т.д. по всему списку.

Сейчас я собираю имена в список, но вот что дальше с этим списком делать я не могу сообразить. nameList - это элемент, в котором находятся ссылки и который задан аннотациtq @FindBy в начале класса.
List<WebElement> Names = nameList.findElements(By.xpath("href"));

  • 0

#2 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 02 августа 2013 - 08:10

Не совсем понятно зачем так делать. Получается, что actual result и expected result задается в AUT и не зависит от теста - в 99% это неправильно составленный и бесполезный тест.
  • 0

#3 Lace

Lace

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

  • Members
  • Pip
  • 48 сообщений

Отправлено 02 августа 2013 - 08:53

Не совсем понятно зачем так делать. Получается, что actual result и expected result задается в AUT и не зависит от теста - в 99% это неправильно составленный и бесполезный тест.

Возможно я неправильно выразилась. Мне необходимо сохранить имя пользователя, чтобы убедится, что в оно будет совпадать с именем пользователя в тексте открытого затем окна
  • 0

#4 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 02 августа 2013 - 08:58

Вы меня не поняли. Приведу пример.
Зашли на страницу, а там *внезапно* вместо "Иванов" - "бНОПНЯ", ну сохранили, ну перешли, ну проверили. А что это дало?
  • 0

#5 lukashow

lukashow

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

  • Members
  • Pip
  • 3 сообщений
  • ФИО:Игорь Лукашов

Отправлено 02 августа 2013 - 09:31

Сейчас я собираю имена в список, но вот что дальше с этим списком делать я не могу сообразить. nameList - это элемент, в котором находятся ссылки и который задан аннотациtq @FindBy в начале класса.

List<WebElement> Names = nameList.findElements(By.xpath("href"));


Дальше, если я правильно вас понял, нужно конвертнуть коллекцию вебэлементов в коллекцию строк. Ну а потом просто сравнивать ожидаемое имя с тем что у нас хранится в коллекции строк.

Метод для конвертации:
private Converter<WebElement, String> toStrings() {
        return new Converter<WebElement, String>() {
            public String convert(WebElement from) {
                return from.getText();
            }
        };
    }

Я его юзаю вот так:
public List<String> blablabla() {
        List<WebElement> Names = nameList.findElements(By.xpath("href"));
        return convert(results, toStrings());
    }

Ну и далее сравнение, например так:
assertThat(page.blablabla(), hasItem(containsString("Ivanov")));

  • 1

#6 Lace

Lace

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

  • Members
  • Pip
  • 48 сообщений

Отправлено 02 августа 2013 - 11:00

Вы меня не поняли. Приведу пример.
Зашли на страницу, а там *внезапно* вместо "Иванов" - "бНОПНЯ", ну сохранили, ну перешли, ну проверили. А что это дало?

Мне это позволит проверить, что функционал отработал корректно и передал имя ссылки (не важно какое) в текст открытого по этой ссылке окна...
А вот если нажав на "бНОПНЯ" откроется окно, адресованное Иванову - это уже баг.
Правильность заполнения поля с фамилией - это уже сторона клиента, т.е. мы как разработчики никак на правильность его заполнения повлиять не можем.
  • 0

#7 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 02 августа 2013 - 11:29

Так поле с фамилией было заполнено правильно - это баг в функционале из-за кривой кодировки :)
Еще раз повторю "эталонные" (expected) данные должны быть в тесте, а не браться из приложения.
Попробуйте написать тест-кейс на эту фичу - только помните, в степах нельзя произносить такие слова как all, any, some, something, random, if, else etc.
Или это вообще не тест - а что то типа экспресс-чека?
  • 0

#8 Lace

Lace

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

  • Members
  • Pip
  • 48 сообщений

Отправлено 02 августа 2013 - 12:52

Так поле с фамилией было заполнено правильно - это баг в функционале из-за кривой кодировки :)
Еще раз повторю "эталонные" (expected) данные должны быть в тесте, а не браться из приложения.
Попробуйте написать тест-кейс на эту фичу - только помните, в степах нельзя произносить такие слова как all, any, some, something, random, if, else etc.
Или это вообще не тест - а что то типа экспресс-чека?


Не могу с этим согласится. Если у меня приложение, где много полей, которые заполняются со стороны клиента, то я просто не могу ввести в тест эталонные значения.
Просто потому, что в таком случае мой тест будет мало чем отличаться от теста, записанного рекодером.
Клиент в любой момент может поменять значение того или иного поля, и если я не буду его каждый раз тестом перехватывать и запоминать для дальнейших проверок, то и тест работать не будет.
В данном конкретном случае меня не волнует что именно, в какой кодировке и на каком языке введено в поле - мне важно, чтобы этот набор символов был передан на другую страницу абсолютно идентично. Вот :)
  • 0

#9 Lace

Lace

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

  • Members
  • Pip
  • 48 сообщений

Отправлено 02 августа 2013 - 12:54

Дальше, если я правильно вас понял, нужно конвертнуть коллекцию вебэлементов в коллекцию строк. Ну а потом просто сравнивать ожидаемое имя с тем что у нас хранится в коллекции строк.


Спасибо! пойду пробовать
  • 0

#10 Nwd

Nwd

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

  • Members
  • Pip
  • 28 сообщений

Отправлено 02 августа 2013 - 14:27

Сейчас я собираю имена в список, но вот что дальше с этим списком делать я не могу сообразить. nameList - это элемент, в котором находятся ссылки и который задан аннотациtq @FindBy в начале класса.

List<WebElement> Names = nameList.findElements(By.xpath("href"));

С кодом было бы проще, могу предложить что-то вроде:
List<WebElement> Names = nameList.findElements(By.xpath("href"));
for (WebElement Name_in_list : Names ) {
String text = Name_in_list.getAttribute("text");
String url = Name_in_list.getAttribute("href");
driver.get (url);
и тут проверку на наличие text

}
Как-то так
  • 1

#11 Lace

Lace

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

  • Members
  • Pip
  • 48 сообщений

Отправлено 07 августа 2013 - 07:58

С кодом было бы проще, могу предложить что-то вроде:
List<WebElement> Names = nameList.findElements(By.xpath("href"));
for (WebElement Name_in_list : Names ) {
String text = Name_in_list.getAttribute("text");
String url = Name_in_list.getAttribute("href");
driver.get (url);
и тут проверку на наличие text

}
Как-то так


Спасибо! Этот вариант отлично заработал
  • 1

#12 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 07 августа 2013 - 08:08

о_О, как так?
после driver.get() все элементы в листе застейлятся и вы поймаете StaleElementReferenceException на следующей итерации цикла.
По всей видимости у вас список состоит из одного элемента.

Да и локатор не совсем верный
nameList.findElements(By.xpath("href"));
Нету в html тэга href :)
  • 0

#13 Nwd

Nwd

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

  • Members
  • Pip
  • 28 сообщений

Отправлено 07 августа 2013 - 09:06

Ну там же написано "примерно"). По-моему лучше предложить идею, чем все сделать за автора. Могу еще предложить открывать ссылки в новом окне, примерно ))) вот так:
driver.get("");
List<WebElement> menu = driver.findElements(By.xpath(""));
for (WebElement option : menu) {
System.out.println (option.getAttribute("href"));
System.out.println (option.getAttribute("text"));
String url = option.getAttribute("href");
String text = option.getAttribute("text");
driver = new FirefoxDriver();
driver.get(url);
String title = driver.findElement(By.xpath("")).getText();
assertTrue(title.contains(text));
driver.quit();}
вот это точно работает
  • 0


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

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