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

Фотография

Нужна помощь с CSS-локатором


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

#1 grinder

grinder

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

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

Отправлено 12 ноября 2008 - 15:42

Всем привет,

разбираюсь с Selenium. Имею такой вот кусочек HTML:

...

<div class="x-layer x-menu" id="ext-gen461" style="position: absolute; z-index: 15010; visibility: visible; left: 472px; top: 76px;">
	<ul class="x-menu-list" id="ext-gen465"><li class="x-menu-list-item" id="ext-gen469">
		<a href="#" class="x-menu-item" id="ext-gen470">Remove</a></li></ul></div>

...

<div class="x-layer x-menu" id="ext-gen495" style="position: absolute; z-index: 15010; visibility: hidden; left: -10000px; top: -10000px;">
	<ul class="x-menu-list" id="ext-gen499"><li class="x-menu-list-item" id="ext-gen503">
		<a href="#" class="x-menu-item" id="ext-gen504">Remove</a></li></ul></div>

...

То есть имеем много невидимых линок "Remove" и одну видимую. Нужно кликнуть видимую на линку "Remove" (то есть на ту, над которой есть видимый div).

В Firefox отлично канает такой XPath:
//div[contains(@style, "visibility: visible")]//a[text()='Remove']

Но в IE такое не проходит, элемент не находится. Порылся в страничке с помощью MS IE Developer Toolbar и увидел для своего div-a следующее:
visibility (css) | visible

В общем атрибута style нету, похоже нужен css-локатор. А доков по ним очень мало (или я не нашел).
Подскажите, как сформировать правильный локатор.
  • 0

#2 grinder

grinder

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

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

Отправлено 12 ноября 2008 - 16:30

Ха, разобрался.
Все было проще.

Всеми любимый IE показал вместо того, что я вставил выше, такой код:

<DIV class="x-layer x-menu" id="ext-gen421" style="Z-INDEX: 15010; LEFT: -10000px; VISIBILITY: hidden; WIDTH: 120px; POSITION: absolute; TOP: -10000px">

Так что дело было лишь в регистре. Новый XPath работает:
//div[contains(@style, 'VISIBILITY: visible')]//a[text()='Remove']
  • 0

#3 vitorg

vitorg

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

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

Отправлено 12 ноября 2008 - 16:43

Да, с IE много таких приколов.
По поводу CSS-селекторов очень рекомендую вот этот плагин Firequark Firefox extention. Он умеет генерировать уникальные вполне пригодные к использованию CSS-селекторы, ну и вообще там много полезного про "XPath VS CSS-selectors" написано.

ВАЖНО: этот плагин - фактически немного переделанный Firebug, в который добавлены 2 менюшки для получения CSS-селекторов, а соответственно при установке этот плагин полностью заменяет установленный Firebug.
  • 0

#4 grinder

grinder

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

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

Отправлено 12 ноября 2008 - 16:53

ВАЖНО: этот плагин - фактически немного переделанный Firebug, в который добавлены 2 менюшки для получения CSS-селекторов, а соответственно при установке этот плагин полностью заменяет установленный Firebug.

Спасибо, обязательно погляжу.

Еще вот линочку полезную нарыл по этим селекторам:
http://www.w3.org/TR...ctors-20051215/
  • 0

#5 vitorg

vitorg

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

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

Отправлено 12 ноября 2008 - 17:07

Еще вот линочку полезную нарыл по этим селекторам:

Ну на W3C сам Бог велел зайти :)

Ещё на всякий случай напомню, что всё-таки желательно везде использовать именно CSS-селекторы, а не XPath. Они хоть и менее функциональны, зато на порядок быстрее работают в IE, в остальных браузерах разница не существенна.
  • 0

#6 popo_kid

popo_kid

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

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

Отправлено 24 февраля 2009 - 10:31

Ещё на всякий случай напомню, что всё-таки желательно везде использовать именно CSS-селекторы, а не XPath. Они хоть и менее функциональны, зато на порядок быстрее работают в IE, в остальных браузерах разница не существенна.

а посоветуете что-нить насчет js либы для работы с css селекторами? стоит ли оставлять cssQuery? или стоит прикрутить что-нить иное? впервую очередь интересует быстродействие в IE. Нашел несколько инследований по этой теме, согластно ним самая быстрая либа ExtJS, но cssQuery ни где не рассматривалась.
  • 0

#7 anon

anon

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

  • Members
  • PipPip
  • 95 сообщений
  • ФИО:Stas Seliverstov

Отправлено 24 февраля 2009 - 12:54

Нашел несколько инследований по этой теме, согластно ним самая быстрая либа ExtJS, но cssQuery ни где не рассматривалась.


А поделитесь, plz, ссылками на исследования, оч. интересно.
Есть идеи как это все быстро прикручивать к селениуму?
  • 0

#8 popo_kid

popo_kid

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

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

Отправлено 24 февраля 2009 - 13:09

А поделитесь, plz, ссылками на исследования, оч. интересно.
Есть идеи как это все быстро прикручивать к селениуму?

например: css selectors speed данные конечно старые, но более актуальных не встречал.

cssQuery была вообще в 2005 написана, так что у меня большие сомнения, что она оптимальна по производительности

прикручивается, вроде как не сложно, прикрутил пока dojo фреймфорк. Пока вроде самый быстрый, как мне показалось.
Есть небольшая проблема в IE, как решу, выложу здесь описание прикручивания
  • 0

#9 popo_kid

popo_kid

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

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

Отправлено 27 февраля 2009 - 09:38

Итак, эксперимент можно считать удачным: удалось прикрутить js библиотеку ExtJS и использовать ее функционал для работы с CSS Selectors.
Проделал я это так (порядок действий для 2-ой бета версии):
1) Распаковываем jar файл сервера. Это может сделать любой zip архиватор
2) Скачиваем ExtJS и кладем ее в распакаванный сервер в папку /core/lib/
3) Правим файл /core/RemoteRunner.html. Добавляем в него загрузку новой библиотеки
<script language="JavaScript" type="text/javascript" src="lib/ext.js"></script>
4) Правим в файле /core/scripts/htmlutils.js функцию eval_css
строчку return cssQuery(locator, inDocument); меняем на return Ext.DomQuery.select(locator, inDocument);
5) Пакуем zip архиватором сервер, переименновываем в jar

Я сравнил скорость работы примерно на 10 различных css селекторах, на всех ExtJS был быстрее в среднем в 3-5 раз. Так что думаю пока оставить эту либу.
Самый выдающийся результат: в FF 3.0.3 ExtJS в 10 раз быстрее на разборе такого селектора:
#ReportTable > tbody > tr:nth-child(3)> td > table > tbody > tr:nth-child(2) > td:nth-child(2n) > div[class]

PS: Есть еще иной способ без изменения серверного jar файла, через AddScript и GetEval. Путь такой же, подключить новую либу, переопределить функцию.
PPS: помимо ExtJS посмотрел следующие фреймворки: dojo, yass, mootools, jquery часть из них оказалась медленнее, часть требовала переписывания css.
  • 0

#10 anon

anon

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

  • Members
  • PipPip
  • 95 сообщений
  • ФИО:Stas Seliverstov

Отправлено 27 февраля 2009 - 10:28

Итак, эксперимент можно считать удачным


Ну в принципе так и предполагал подключать .... и тогда сразу вопрос на засыпку, пока ExtJS подключена:
У меня в IE не проходят локаторы с двумя атрибутами (css=el[att1='val1'][att2='val2']), хотя в FF все в порядке
и в порядке в HTMLUnit (я к нему подключил cssQuery)

1) Проблема с таким css и cssQuery на IE(6.) только у меня?
2) Как с такими условиями в ExtJS?

Р.S. на самом деле локатор выглядит как то так: css=el[att1='val1'][att2*='val2'] т.е. во втором
атрибуте смотрю подстроку.
  • 0

#11 popo_kid

popo_kid

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

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

Отправлено 27 февраля 2009 - 10:52

как показал эксперимент:

using System;
using System.Collections.Generic;
using System.Text;
using Selenium;

namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
Selenium.DefaultSelenium sel = new DefaultSelenium("localhost", 4445,
//@"*firefox D:\Program Files\Mozilla Firefox 3.0\firefox.exe",
"*iehta",
"http://www.ya.ru");

sel.Start();

sel.Open("http://www.ya.ru");

sel.Highlight("css=input[size='50'][maxlength='300']");
}
}
}

sel.Highlight("css=input[size='50'][maxlength='300']"); - работает
sel.Highlight("css=input[size='50'][type='search']"); - не работает
sel.Highlight("css=input[type='search']"); - не работает

так что дело видимо в type =) как-то его IE6 особо любит =)
  • 0

#12 anon

anon

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

  • Members
  • PipPip
  • 95 сообщений
  • ФИО:Stas Seliverstov

Отправлено 27 февраля 2009 - 11:11

Это в ExtJS? =(
У меня не type а div, но суть не меняет.

Большое спасибо, сэкономили мне время
  • 0


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

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