Как с помощью xpath создать массив ссылок страницы и ходить по ним
#1
Отправлено 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();
}
}
Буду благодарна за любую помощь и советы в решении.
#2
Отправлено 17 мая 2011 - 13:29
Я бы сделал что-нибудь типа: "xpath=(//a)[" + ++i + "]";
Но здесь надо учитывать, что ссылки бывают разные, некоторые открывают новое окно, некоторые вообще не приводят к перезагрузке страницы...
У вас вообще какая цель? Возможно, вам и не нужен Selenium, а хватит чего-нибудь типа HtmlUnit.
#3
Отправлено 17 мая 2011 - 13:52
Работать в идеале должен так: заходить на указанную страницу, собирать данные о ссылках на ней и открывать их случайным образом.
Команды selenium.open и selenium.click не прокатят так как ссылок более 200.
По идее первый цикл должен собирать данные о ссылках, второй по ним ходить.
Проблема во втором цикле. Тест собирает данные о ссылках в лог точнее их имена, но не открывает их..
Ломаю голову уже второй день, у меня установлены плагины xpath и xpathchecker. С помощью команды //x:a, в них выдаются все возможные ссылки ,но как перенести это в selenium понять не могу..(
#4
Отправлено 17 мая 2011 - 17:12
Какая связь между количеством и методом открытия?Может быть и хватит, но нужно именно селениум. С начальством спорить не принято ...))
Работать в идеале должен так: заходить на указанную страницу, собирать данные о ссылках на ней и открывать их случайным образом.
Команды selenium.open и selenium.click не прокатят так как ссылок более 200.
Сначала в массив array одной функцией добавляются все ссылки. Потом в первом цикле элементы перетираются текстом(?) ссылок - зачем? А в итоге переходим по ссылкам с помощью xpath...По идее первый цикл должен собирать данные о ссылках, второй по ним ходить.
Проблема во втором цикле. Тест собирает данные о ссылках в лог точнее их имена, но не открывает их..
По поводу конструкции //*[i] - сейчас точно не скажу, а может и обману, но вроде предикат i будет проверять что элемент является i-ым по счету не во всей выборке, а в пределах родительского тега...Ломаю голову уже второй день, у меня установлены плагины xpath и xpathchecker. С помощью команды //x:a, в них выдаются все возможные ссылки ,но как перенести это в selenium понять не могу..(
Если на ссылку надо перейти, а не нажать, то используйте атрибут href у ссылок просто.
#5
Отправлено 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 драйвера. ))
#6
Отправлено 18 мая 2011 - 14:32
Цитирую :"Может быть я чего-то не понимаю, но почему вы сначала делаете
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
#7
Отправлено 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].
#8
Отправлено 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].
Спасибо большое. Ваши советы очень полезны. Завтра попробую переделать тест , использую ваши рекомендации
#9
Отправлено 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
Про Тестинг
#10
Отправлено 18 мая 2011 - 15:59
Да, прблема partial hrefs обсуждается перед выпуском каждого релиза, и пока всё ещё непонятно, как её решить -- браузеры по разному отдают значение атрибута href: IE канонизирует, делает абсолютный адрес, а, скажем, FF просто возвращает то, что там было написано. И непонятно, чью сторону должен принять селениум -- всё равно половина народа обидится :)При этом есть неразрешенная проблема в самом Селене: http://jira.openqa.org/browse/SEL-692
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных