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

Фотография

Как пройтись по всем ссылкам?


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

#1 Sway

Sway

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

  • Members
  • Pip
  • 7 сообщений
  • ФИО:Перова Анна
  • Город:Харьков, Украина

Отправлено 03 октября 2007 - 11:45

Тестируем сайт с помощью Selenium rc. Есть страница сайта в HTML формате. На ней данные (в том числе и различные ссылки) расположены с помощью тегов таблицы. Каким образом, используя Xpath, можно кликнуть по всем ссылкам, расположенным на этой странице?

Варианты:
//a
//a[i]
//a[i]/descendant-or-self::*
не проходят.

То, что имеем на данные момент:

public static void main(String[] args) {	Selenium sel;	sel = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.easysite.dplus.ru");	sel.start();	sel.open("http://www.easysite.dplus.ru/index.php?menuidx=lmenu&itemidx=item1");	String dlinna []= sel.getAllLinks();	for (int i = 1; i <= dlinna.length; i++) {		sel.click("xpath=//a[" + i + "]/descendant-or-self::*");		sel.open("http://www.easysite.dplus.ru/index.php?menuidx=lmenu&itemidx=item1");	}}

  • 0
Мне не надо много, мне достаточно самого лучшего!

#2 dlg99

dlg99

    Специалист

  • Members
  • PipPipPipPipPip
  • 609 сообщений
  • ФИО:Andrey Yegorov
  • Город:Redmond, WA

Отправлено 03 октября 2007 - 15:45

Тестируем сайт с помощью Selenium rc. Есть страница сайта в HTML формате. На ней данные (в том числе и различные ссылки) расположены с помощью тегов таблицы. Каким образом, используя Xpath, можно кликнуть по всем ссылкам, расположенным на этой странице?

Варианты:
//a
//a[i]
//a[i]/descendant-or-self::*
не проходят.


вполне логично. (если я не ошибаюсь) в XPath позиция элемента ( [i] or its equivalent [position() = i]) не имеет отношения к его порядковому номеру в списке найденного. Это позиция элемента в списке найденных siblings, т.е.

//A[1] найдет 2 (выделенных) элемента в данном случае:
<A/>
</D>
<B>
<A/>
<A/>
</B>
_linenums:0'><D> <A/></D><B> <A/> <A/></B>

т.е. варианты, на мой взгляд такие:

1. написать custom locator (по образу и подобию PageBot.prototype._findElementUsingFullXPath и PageBot.prototype.locateElementByXPath) понимающий, что XPath может вернуть массив (сейчас там всегда берётся первый найденный элемент) и принимающий как параметр номер нужного элемента

2. для данного случая проще использовать dom locator, dom=document.getElementsByTagName( 'a' )[i] (i - с нуля, в XPath - с 1), типа:

public static void main(String[] args) {	Selenium sel;	sel = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.easysite.dplus.ru");	sel.start();	sel.open("http://www.easysite.dplus.ru/index.php?menuidx=lmenu&itemidx=item1");	int len = sel.getAllLinks().length;	for (int i = 0; i < len; i++) {		sel.click( "dom=document.getElementsByTagName( 'a' )[" + i + "]" );		sel.open("http://www.easysite.dplus.ru/index.php?menuidx=lmenu&itemidx=item1");	}}

  • 0
Andrey Yegorov. Изображение

#3 Sway

Sway

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

  • Members
  • Pip
  • 7 сообщений
  • ФИО:Перова Анна
  • Город:Харьков, Украина

Отправлено 08 октября 2007 - 15:27

Большое спасибо за совет. Вопрос правда решила с помощью регулярных выражений. Проблема заключалась в то, что в связи с организацией страницы ввиде таблицы, номерация <а> начиналась в каждом новом столбце заново. Сегодня попробуй решить проблему вашим способом. Еще раз спасибо.
  • 0
Мне не надо много, мне достаточно самого лучшего!

#4 dlg99

dlg99

    Специалист

  • Members
  • PipPipPipPipPip
  • 609 сообщений
  • ФИО:Andrey Yegorov
  • Город:Redmond, WA

Отправлено 17 ноября 2007 - 03:40

Вопрос правда решила с помощью регулярных выражений.


(не?)кстати, осознал насколько я протормозил с XPath-ом.
можно было и им воспользоваться:

sel.click( "xpath=(//a)[" + i + "]" );

тут скобочки критичны, xpath=//a[i] vs xpath=(//a)[i]

один только плюс - в случае IE дом быстрее работает.
  • 0
Andrey Yegorov. Изображение

#5 Gnomik

Gnomik

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Попов Федор Иванович

Отправлено 09 января 2008 - 20:37

А как поменять URL http://localhost:444...wBrowserSession на http://mysite.com/se...wBrowserSession ???
  • 0

#6 Vladislavovna

Vladislavovna

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

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

Отправлено 24 сентября 2010 - 07:06

Добрый день.
А у меня возник следующий вопрос - как с помощью селениума проверить правильность ссылок?
public void testNew() throws Exception {
selenium.open("/");
selenium.windowFocus();
int len = selenium.getAllLinks().length;
System.out.println("Text title: " +len);
for (int i = 1; i < len; i++) {
String nameLink1 = selenium.getAttribute( "xpath=(//a)[" +i+ "]/@href" );
selenium.click(nameLink1);
selenium.waitForPageToLoad("30000");
System.out.println("Text link: " + nameLink1);
selenium.open("/");
logger.log(Level.INFO, "Text link:" +nameLink1);
}
Здесь мы собрали все ссылки,получили их адреса, по идее мы должны проверить, что та страница,которая открывается при нажатии на данную ссылку, соответсвует.
Как это можно реализовать?
  • 0

#7 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 24 сентября 2010 - 11:59

Добрый день.
А у меня возник следующий вопрос - как с помощью селениума проверить правильность ссылок?
public void testNew() throws Exception {
selenium.open("/");
selenium.windowFocus();
int len = selenium.getAllLinks().length;
System.out.println("Text title: " +len);
for (int i = 1; i < len; i++) {
String nameLink1 = selenium.getAttribute( "xpath=(//a)[" +i+ "]/@href" );
selenium.click(nameLink1);
selenium.waitForPageToLoad("30000");
System.out.println("Text link: " + nameLink1);
selenium.open("/");
logger.log(Level.INFO, "Text link:" +nameLink1);
}
Здесь мы собрали все ссылки,получили их адреса, по идее мы должны проверить, что та страница,которая открывается при нажатии на данную ссылку, соответсвует.
Как это можно реализовать?

1) Зачем проверку ссылок делать с помощью селениума, когда полно других тулов для этого?
2) "...по идее мы должны проверить, что та страница,которая открывается при нажатии на данную ссылку, соответсвует." Соотвествует чему?
  • 0
Regards,
Alexey

#8 mcreature

mcreature

    Активный участник

  • Members
  • PipPip
  • 88 сообщений

Отправлено 24 сентября 2010 - 12:17

Ну заходите на страницу и проверяете, допустим, по title или по заголовку.

Или же можно проверять атрибут, не заходя на страницу, таким способом:
selenium.getAttribute("xpath=//tr[@class='default' and position()=7]/td[@class='procode' and position()=2]/div/a[1]/@href").
            equals("/procode/payment.xml")

1) Зачем проверку ссылок делать с помощью селениума, когда полно других тулов для этого?

Зачем юзать кучу разных тулов, если все можно делать с помощью одного инструмента?
  • 0

#9 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 24 сентября 2010 - 13:08

1) Зачем проверку ссылок делать с помощью селениума, когда полно других тулов для этого?

Зачем юзать кучу разных тулов, если все можно делать с помощью одного инструмента?

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

#10 Vladislavovna

Vladislavovna

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

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

Отправлено 24 сентября 2010 - 13:30

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

#11 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 24 сентября 2010 - 13:47

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

Хозяин-барин.
Но вам надо или
- иметь карту (map) соотвествия ссылки на странице и того места куда она должна вести
- знать алгоритм редиректов в урлах и высчитывать их на лету

Если будете реализовывать рекурсивный механизм поиска ссылок, то не забудьте исключить внешние ссылки и сделать копилку уже проверенных ссылок, чтобы не впасть в вечный цикл.
  • 0
Regards,
Alexey

#12 Vladislavovna

Vladislavovna

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

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

Отправлено 24 сентября 2010 - 13:47

[quote name='mcreature' timestamp='1285330664' post='78294']
Ну заходите на страницу и проверяете, допустим, по title или по заголовку.

Или же можно проверять атрибут, не заходя на страницу, таким способом:
selenium.getAttribute("xpath=//tr[@class='default' and position()=7]/td[@class='procode' and position()=2]/div/a[1]/@href").
            equals("/procode/payment.xml")

Немного не поняла ваш совет.
tr[@class='default' and position()=7]/td[@class='procode' and position()=2 - можно здесь наглядно провести краткий курс обучения по селениуму, что ,откуда, почему 7 и 2 берется))так как новичок.
Просто на страничке нет таблиц, есть только div с class и <a> с href.
Заранее спасибо за ответ)
  • 0

#13 mcreature

mcreature

    Активный участник

  • Members
  • PipPip
  • 88 сообщений

Отправлено 24 сентября 2010 - 14:17


Ну заходите на страницу и проверяете, допустим, по title или по заголовку.

Или же можно проверять атрибут, не заходя на страницу, таким способом:

selenium.getAttribute("xpath=//tr[@class='default' and position()=7]/td[@class='procode' and position()=2]/div/a[1]/@href").
            equals("/procode/payment.xml")


Немного не поняла ваш совет.
tr[@class='default' and position()=7]/td[@class='procode' and position()=2 - можно здесь наглядно провести краткий курс обучения по селениуму, что ,откуда, почему 7 и 2 берется))так как новичок.
Просто на страничке нет таблиц, есть только div с class и <a> с href.
Заранее спасибо за ответ)


7 и 2 вам не нужно =) это я тупо скопировал из своего проекта, а вообще это номера элементов в DOM-структуре.
Так вот, с помощью команды getAttribute вы сможете получить href вашей ссылки, xpath подставьте свой до тега <a>.
После перейдите по этой ссылке и сравните полученный href с адресом, который вы можете получить с помощью команды getLocation.

Но это хорошо для отдельно взятых ссылок. Если вам надо проверять очень много ссылок, то наверное стоит попробовать другие инструменты.
  • 0

#14 mcreature

mcreature

    Активный участник

  • Members
  • PipPip
  • 88 сообщений

Отправлено 24 сентября 2010 - 14:27

1) Зачем проверку ссылок делать с помощью селениума, когда полно других тулов для этого?

Зачем юзать кучу разных тулов, если все можно делать с помощью одного инструмента?

Зачем столяру или плотнику куча инструментов? Можно гвозди топором забивать и шурупы пассатижами закручивать.


Ну только давайте в крайности не кидаться =)
Пасатижи не разрабатывались для закручивания шурупов, чего не скажешь о селениуме и ссылках. Или по вашему селениум предназначен фильмы смотреть и с графикой работать?
  • 0

#15 compasses

compasses

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

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

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

Не подскажите как перенести представленный здесь код в Selenium IDE? Если не сложно, то в формате для тупых - куда жать, куда вставять, что в конце нажимать.
Я делал просто - копипаста в Source, Options-Format-HTML, что, естественно, не работает.

Или, у кого-нибудь есть работающий вариант прохода по всем ссылкам в формате HTML, скиньте сюда пожалуйта?
  • 0

#16 compasses

compasses

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

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

Отправлено 31 мая 2011 - 07:57

Покопался. Получилось вот что:
<tr>
<td>store</td>
<td>0</td>
<td>x</td>
</tr>
<tr>
<td>storeAllLinks</td>
<td>links</td>
<td></td>
</tr>
<tr>
<td>store</td>
<td>javascript{storedVars['links'].length}</td>
<td>dlina</td>
</tr>
<tr>
<td>while</td>
<td>storedVars['x'] &lt;= storedVars['dlina']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>javascript{storedVars.links[${x}]}</td>
<td></td>
</tr>
<tr>
<td>getEval</td>
<td>storedVars['x'] = ${x} + 1 ;</td>
<td></td>
</tr>
<tr>
<td>endWhile</td>
<td></td>
<td></td>
</tr>


Ругается на команду
<tr>
<td>click</td>
<td>javascript{storedVars.links[${x}]}</td>
<td></td>
</tr>


javascript{} - не убрать иначе он переходить перестанет. А сам javascript пишет
[error] Unexpected Exception: message -> missing ] in index expression, fileName -> chrome://selenium-ide/content/selenium/scripts/selenium-api.js, lineNumber -> 2490, stack -> eval("storedVars.links[${x}]")@:0 ("javascript{storedVars.links[${x}]}")@chrome://selenium-ide/content/selenium/scripts/selenium-api.js:2490 ()@chrome://selenium-ide/content/selenium/scripts/selenium-executionloop.js:109 (0)@chrome://selenium-ide/content/selenium/scripts/selenium-executionloop.js:78 (0)@chrome://selenium-ide/content/selenium/scripts/htmlutils.js:60 , name -> SyntaxError
Что естественно.
Можно как-нибудь обойти эту штуку?


И еще вопрос - пытался через getAllLinks - возвращает пустой массив.
Так же пытался через getXpathCount - так же возвращает пустоту.
Например:

<tr>
<td>getXpathCount</td>
<td>//a</td>
<td>x</td>
</tr>


Что я не так делаю?
  • 0

#17 compasses

compasses

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

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

Отправлено 02 июня 2011 - 08:32

Здравствуйте!
Решил создать отдельную функцию, открывающую все вкладки на странице. И интегрировать ее в селениум.
Пишу:
Selenium.prototype.doAllLinks = function() {

    var li = document.links;
    if (undefined !== li) {
        for (var i = 0; i < li.length; i++) {
           li[i].onClick;
        }
    }
    else alert("undefined!");
}

В результате выполняется код из блока
else alert("undefined!");
Я так понял в js-скриптах, которые будут интегрированы в selenium, надо обращаться не через document, а как-то по-другому. Подскажите пожалуйста как? Менял document на this и на this.page(). Толку ноль.
  • 0


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

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