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

Фотография

Как с помощью xpath создать массив ссылок страницы и ходить по ним


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

#1 anmarchenko20

anmarchenko20

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

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

Отправлено 17 мая 2011 - 11:27

Здравствуйте, автоматическим тестированием занимаюсь недавно.
На этом форуме тоже недавно, поэтому прошу прощения если подобная тема уже есть.
Тестирую с помощью selenium server + eclipse + Junit
Суть задачи такая. Перейти на нужную страницу, собрать все ссылки со страницы в массив и ходить по ним случайным образом.
Что получилось на данный момент это собрать все имена ссылок со страницы. Ходить по ним упорно отказывается.
Задачу решила решать с помощью xpath, вот собственно код

package com;
import com.thoughtworks.selenium.*;
import junit.framework.*;
//import org.openqa.selenium.server.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MyTest extends TestCase {
private DefaultSelenium selenium;
private String xpath;

// private SeleniumServer seleniumServer;

@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*firefox", "Здесь ссылка");
// seleniumServer = new SeleniumServer();
// seleniumServer.start();
selenium.start();
}

@Test
public void testTest01() throws Exception
{


selenium.open("здесь ссылка");
String array[]= selenium.getAllLinks();
int i;
for(i=0; i<=array.length; i++)

{

array[i] = selenium.getText("dom=document.getElementsByTagName('a')[" + i + "]");
System.out.println(array[i]);
selenium.open("Здесь ссылка");

int count = getXPathCount( "xpath=(//x:a)" );
for( int j = 1 ; j <= count ; j++ )
{
selenium.open("Здесь ссылка");
selenium.click("xpath=(//x:a)[" + j + "]");
//selenium.click("xpath=//a[contains( text(),'Spanish')]");


//check( "xpath=(//x:a)[" + j + "]" );

System.out.println(xpath);

}
}



//selenium.open("Здесь ссылка");
//String array[ ] = selenium.getAllLinks();
//for (int i = 0; i <= array.length; i++)
//{



// array[i] = selenium.getText("dom=document.getElementsByTagName('a')[" + i + "]");
//selenium.getEval("//x:a");
//System.out.println(array[i]);

//String xpath = "//x:a";
//selenium.getXpathCount(xpath);
}







private int getXPathCount(String string) {
// TODO Auto-generated method stub
return 0;
}

@After
public void tearDown() throws Exception {
selenium.stop();
}
}

Буду благодарна за любую помощь и советы в решении.
  • 0

#2 vitorg

vitorg

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

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

Отправлено 17 мая 2011 - 13:29

Что значит "ходить по ним упорно отказывается"? Какое исключение вылетает?
Я бы сделал что-нибудь типа: "xpath=(//a)[" + ++i + "]";
Но здесь надо учитывать, что ссылки бывают разные, некоторые открывают новое окно, некоторые вообще не приводят к перезагрузке страницы...
У вас вообще какая цель? Возможно, вам и не нужен Selenium, а хватит чего-нибудь типа HtmlUnit.
  • 0

#3 anmarchenko20

anmarchenko20

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

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

Отправлено 17 мая 2011 - 13:52

Может быть и хватит, но нужно именно селениум. С начальством спорить не принято ...))
Работать в идеале должен так: заходить на указанную страницу, собирать данные о ссылках на ней и открывать их случайным образом.
Команды selenium.open и selenium.click не прокатят так как ссылок более 200.
По идее первый цикл должен собирать данные о ссылках, второй по ним ходить.
Проблема во втором цикле. Тест собирает данные о ссылках в лог точнее их имена, но не открывает их..
Ломаю голову уже второй день, у меня установлены плагины xpath и xpathchecker. С помощью команды //x:a, в них выдаются все возможные ссылки ,но как перенести это в selenium понять не могу..(
  • 0

#4 vaha

vaha

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

  • Members
  • Pip
  • 22 сообщений
  • ФИО:Илья

Отправлено 17 мая 2011 - 17:12

Здесь ссылка - это имеется ввиду ссылка главной страницы?

Может быть и хватит, но нужно именно селениум. С начальством спорить не принято ...))
Работать в идеале должен так: заходить на указанную страницу, собирать данные о ссылках на ней и открывать их случайным образом.
Команды selenium.open и selenium.click не прокатят так как ссылок более 200.

Какая связь между количеством и методом открытия?

По идее первый цикл должен собирать данные о ссылках, второй по ним ходить.
Проблема во втором цикле. Тест собирает данные о ссылках в лог точнее их имена, но не открывает их..

Сначала в массив array одной функцией добавляются все ссылки. Потом в первом цикле элементы перетираются текстом(?) ссылок - зачем? А в итоге переходим по ссылкам с помощью xpath...

Ломаю голову уже второй день, у меня установлены плагины xpath и xpathchecker. С помощью команды //x:a, в них выдаются все возможные ссылки ,но как перенести это в selenium понять не могу..(

По поводу конструкции //*[i] - сейчас точно не скажу, а может и обману, но вроде предикат i будет проверять что элемент является i-ым по счету не во всей выборке, а в пределах родительского тега...

Если на ссылку надо перейти, а не нажать, то используйте атрибут href у ссылок просто.
  • 0

#5 frei_by

frei_by

    Постоянный участник

  • Members
  • PipPipPip
  • 177 сообщений
  • ФИО:Дмитрий

Отправлено 18 мая 2011 - 14:28

Честно говоря, я бы ни за что так как вы делать бы не стал.

Во первых я-бы выяснил что такое ссылка на странице.

С точки зрения метода String array[]= selenium.getAllLinks(); будут выбраны если я не ошибаюсь, все ID на теги типа <a>. (http://ru.wikipedia.....B5.D0.B3.D0.B8)
Но с точки зрения js на странице есть ещё элементы реализующие поведение onclick="document.load"... - что с точки зрения пользователя также будут являтся ссылками.

Во вторых выбрать все ссылки на странице - это не тест, так как нет assert. Если на странице не нашлось ни одной ссылки - можно ли считать такой тест заваленным? Это скорее подготовка к тесту.

Выбрать все ссылки на странице можно с помощью xpath="//a" Почему вы пишите "xpath=(//x:a)" - для меня загадка, потому что с точки зрения xpath вы ищите все ноды a принадлежащие к namespace=x. У вас есть такой namespace в документе? - Плз поправте если я не прав.

Может быть я чего-то не понимаю, но почему вы сначала делаете
String array[]= selenium.getAllLinks();

а потом
for(i=0; i<=array.length; i++)
 {
 array[i] = selenium.getText("dom=document.getElementsByTagName('a')[" + i + "]");
- это для меня тоже не понятно.

Как бы сделал я:
1) Выбрать все //a[@href] со страницы и сохранить их куда нибудь, так как у вас - это сделано в переменную если вам нужны URL (Если вы хотите выбрать URL - то вам нужно выбрать не повторяющиеся URL - воспользуйтесь встроенными коллекциями в java. Попробуйте использовать Set.), или просто посчитать getXPathCount("//a[@href]").

2) То, что вам нужно для того, чтобы ходить по ссылкам - это URL ссылки если вы хотите воспользоватся методом open, или сам номер элемента ссылки, если вы хотите по нему кликнуть. click("//a["+i+"]) - как-то так.

3) Я подозреваю, что вам нужно перейти на страницу и найти там какой-то текст - т.е. случайно ходить по ссылкам и по каждой ссылке на которую вы перейдёте - хотя-бы проверить, что это не 404 страница.

Не увидел ни одного assert у вас в тесте. ((
Не увидел у вас критерия случайности - как вы писали "и ходить по ним случайным образом."... ((

PS Сам в java драйвере очень плохо ориентируюсь, возможно написал что нибудь не так.
Могу вам написать как бы я это сделал с помощью PHP драйвера. ))
  • 0

#6 anmarchenko20

anmarchenko20

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

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

Отправлено 18 мая 2011 - 14:32

Уважаемый frei_by

Цитирую
:"Может быть я чего-то не понимаю, но почему вы сначала делаете

String array[]= selenium.getAllLinks();


а потом

for(i=0; i<=array.length; i++)
{
array[i] = selenium.getText("dom=document.getElementsByTagName('a')[" + i + "]");"


Я недавно работаю с селениумом, и с джава не больше недели.
Может код конечно и избыточный, но я подумала что таким образом в массив в качестве элементов
передадутся ссылки полученные с помощью selenium.getAllLinks
цикл я сделала для того чтобы ходить по элементам массива.
Вы абсолютно правы вместо ссылок я получила только ID элементов.


Цитирую
"3) Я подозреваю, что вам нужно перейти на страницу и найти там какой-то текст - т.е. случайно ходить по ссылкам и по каждой ссылке на которую вы перейдёте - хотя-бы проверить, что это не 404 страница.

Не увидел ни одного assert у вас в тесте. ((
Не увидел у вас критерия случайности - как вы писали "и ходить по ним случайным образом."..

Да, именно оно мне и надо, не писала здесь потому что это я могу и сама написать. Если что когда решу эту задачу, выложу сюда рабочий код со всеми этими проверками - может кому и пригодиться...

трудности возникли именно с передачей в массив элементов в ввиде ссылок полученных с помощью xpath.

Я не знала что выбрать все ссылки на странице можно также и с помощью xpath="//a". У меня это получилось с xpath="//x:a"
Проблема в том как передать данные полученные с xpath="//a" в массив и пройти по ним. Не могу понять каков правильный синтаксис
для того чтобы открывать эти ссылки. Открыть какую-то одну ссылку тоже не получается пишу так

selenium.click("id('content')/x:div[1]/x:div/x:p[1]") получаю с помощь плагина xpath checker, варианты написания пробовала разные. Ссылка не открывается. Скорее всего и пре передаче данных в массив неправильно пишу. А методом getXpathCount у меня получилось только подсчитать количество xpath-ов на странице

Сообщение отредактировал anmarchenko20: 18 мая 2011 - 14:59

  • 0

#7 frei_by

frei_by

    Постоянный участник

  • Members
  • PipPipPip
  • 177 сообщений
  • ФИО:Дмитрий

Отправлено 18 мая 2011 - 14:45

А как вообще правильно указывать xpath для того чтобы он переходил по ссылке.
Я делаю так selenium.click(xpath"id('content')/x:div[1]/x:div/x:p[1]/x:a[2]");
но ничего не происходит. Он по ссылке не переходит


С помощью xpath вы можете:
1) Найти элемент который релазиует событие onclick (простыми словами найти ссылку по которой кликнуть) - и использовать этот xpath в методе click("//a[3]") - кликнет по 3 найденной ссылке от корня в документе
2) Выбрать атрибуты href у всех ссылок в массив, и пройтись по массиву по значениям строковым URL подставляя их в метод open.
Я делаю так selenium.click(xpath"id('content')/x:div[1]/x:div/x:p[1]/x:a[2]");
- не правильный xpath.
по видимому -
selenium.click("//id[@name='content']/div/div/p/a[2]");
- если я не ошибаюсь по поводу ...xpath"id('content') - если элемент первый - то для него не нужно писать [1].
  • 0

#8 anmarchenko20

anmarchenko20

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

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

Отправлено 18 мая 2011 - 15:12


А как вообще правильно указывать xpath для того чтобы он переходил по ссылке.
Я делаю так selenium.click(xpath"id('content')/x:div[1]/x:div/x:p[1]/x:a[2]");
но ничего не происходит. Он по ссылке не переходит


С помощью xpath вы можете:
1) Найти элемент который релазиует событие onclick (простыми словами найти ссылку по которой кликнуть) - и использовать этот xpath в методе click("//a[3]") - кликнет по 3 найденной ссылке от корня в документе
2) Выбрать атрибуты href у всех ссылок в массив, и пройтись по массиву по значениям строковым URL подставляя их в метод open.
Я делаю так selenium.click(xpath"id('content')/x:div[1]/x:div/x:p[1]/x:a[2]");
- не правильный xpath.
по видимому -
selenium.click("//id[@name='content']/div/div/p/a[2]");
- если я не ошибаюсь по поводу ...xpath"id('content') - если элемент первый - то для него не нужно писать [1].




Спасибо большое. Ваши советы очень полезны. Завтра попробую переделать тест , использую ваши рекомендации
  • 0

#9 Boltick

Boltick

    Специалист

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

Отправлено 18 мая 2011 - 15:42

Спасибо большое. Ваши советы очень полезны. Завтра попробую переделать тест , использую ваши рекомендации


Клик по ссылке, зная только её текст:
selenium.click("//a[text()='текст ссылки']");

Клик по ссылке, зная один из её атрибутов, например href:
selenium.click("//a[@href='значение атрибута']");

Клик по ссылке, зная предположим один из её атрибутов и текст:
selenium.click("//a[@href='значение атрибута' and text()='текст ссылки']");

При этом есть неразрешенная проблема в самом Селене: http://jira.openqa.org/browse/SEL-692
  • 0
Алексей Булат
Про Тестинг

#10 barancev

barancev

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

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


Отправлено 18 мая 2011 - 15:59

При этом есть неразрешенная проблема в самом Селене: http://jira.openqa.org/browse/SEL-692

Да, прблема partial hrefs обсуждается перед выпуском каждого релиза, и пока всё ещё непонятно, как её решить -- браузеры по разному отдают значение атрибута href: IE канонизирует, делает абсолютный адрес, а, скажем, FF просто возвращает то, что там было написано. И непонятно, чью сторону должен принять селениум -- всё равно половина народа обидится :)
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium


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

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