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

Фотография

Что использовать: xpath или css


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

#1 Diosat

Diosat

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

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Раймондо
  • Город:СПб


Отправлено 18 апреля 2012 - 12:01

Всем доброго времени!
Для начала кусок кода:

<div id="addTemplateMenu" class="ui-menu ui-menu-dynamic ui-widget ui-widget-content ui-corner-all ui-helper-clearfix mainToolbarMenu" style="top: 75px; left: 311px; z-index: 1001; display: block;">
<ul class="ui-menu-list ui-helper-reset">
<li class="ui-widget ui-menuitem ui-corner-all ui-menu-parent">
<a class="ui-menuitem-link ui-corner-all" href="javascript:void(0)">
<ul class="ui-widget-content ui-menu-list ui-corner-all ui-helper-clearfix ui-menu-child" style="left: 120px; top: 0px; z-index: 1003; display: none;">
<li class="ui-menuitem ui-widget ui-corner-all">
<a id="j_idt1227" class="ui-menuitem-link ui-corner-all" onclick="LayoutHandler.resetTabIndex();;PrimeFaces.ab({formId:'masterForm',source:'j_idt1227',process:'j_idt1227',update:'rightContent globalMessage masterTableInclude templateGeneratorDialogPanel masterToolbar',oncomplete:function(xhr, status, args){templateGeneratorDialog.show();}});" href="javascript:void(0)">
<span class="ui-menuitem-text">Evaluation template</span>
</a>
и так далее

Вот такие вот id у меня. К ним я обращаюсь по id напрямую, по xpath или css.

Проблема: каждый раз они генерируются заново, те я не могу использовать id = j234 например, так как в следующий раз id будет = j236 или еще что-то.
Соответственно xpath или css содержащие id использовать нельзя. Я более менее нашел решение использую xpath по position.

Вопрос1: может можно как-то обойти эту ситуацию по другому? так как xpath по position не всегда корректно работает.

Вопрос2: натыкался несколько раз на сообщения о том, что следует избегать использовать xpath, и вместо него использовать css.
Вот видео по этому поводу: http://saucelabs.com...to-go-vs-xpath/ .
Понимаю что такая проблема только на IE, но все-таки хотелось бы узнать насчет этого и другие мнения.

Спасибо.
  • 0

#2 nstreltsov

nstreltsov

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

  • Members
  • PipPip
  • 116 сообщений
  • ФИО:Стрельцов Николай Игоревич
  • Город:Москва


Отправлено 19 апреля 2012 - 06:48

А если так ?
.//*[contains(@id, 'j_idt')]
  • 0

#3 Diosat

Diosat

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

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Раймондо
  • Город:СПб


Отправлено 19 апреля 2012 - 10:16

А если так ?
.//*[contains(@id, 'j_idt')]

Спасибо, но я сделал немного по другому, просто слово contains заменил на starts-with.

Получилось так: //input[starts-with(@id, 'j_idt')].

Вопрос: а если id имеет продолжение после произвольно создаваемого номера например: //*[@id='j_idt56:inputPanel:inputText'] , то как используя пример выше корректно обыграть ситуацию?
  • 0

#4 soleksenko2702

soleksenko2702

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

  • Members
  • PipPipPip
  • 193 сообщений
  • ФИО:Олексенко Сергей

Отправлено 19 апреля 2012 - 11:06


А если так ?
.//*[contains(@id, 'j_idt')]

Спасибо, но я сделал немного по другому, просто слово contains заменил на starts-with.

Получилось так: //input[starts-with(@id, 'j_idt')].

Вопрос: а если id имеет продолжение после произвольно создаваемого номера например: //*[@id='j_idt56:inputPanel:inputText'] , то как используя пример выше корректно обыграть ситуацию?


Теоретически должно и так работать.
Но если очень нужно, то можно попробовать вместе с starts-with использовать substring
  • 0

#5 Diosat

Diosat

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

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Раймондо
  • Город:СПб


Отправлено 19 апреля 2012 - 11:36



А если так ?
.//*[contains(@id, 'j_idt')]

Спасибо, но я сделал немного по другому, просто слово contains заменил на starts-with.

Получилось так: //input[starts-with(@id, 'j_idt')].

Вопрос: а если id имеет продолжение после произвольно создаваемого номера например: //*[@id='j_idt56:inputPanel:inputText'] , то как используя пример выше корректно обыграть ситуацию?


Теоретически должно и так работать.
Но если очень нужно, то можно попробовать вместе с starts-with использовать substring


Да, работает, но дело в том что у меня 2 элемента, которые как раз и различаются по id по номерам и припискам после них. Поэтому я и думаю насчет того, чтобы можно было бы опускать часть id которая получается произвольным образом, и обращаться по стабильной части, которая не только до, но и после генерируемой части присутствует.
  • 0

#6 soleksenko2702

soleksenko2702

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

  • Members
  • PipPipPip
  • 193 сообщений
  • ФИО:Олексенко Сергей

Отправлено 19 апреля 2012 - 11:59




А если так ?
.//*[contains(@id, 'j_idt')]

Спасибо, но я сделал немного по другому, просто слово contains заменил на starts-with.

Получилось так: //input[starts-with(@id, 'j_idt')].

Вопрос: а если id имеет продолжение после произвольно создаваемого номера например: //*[@id='j_idt56:inputPanel:inputText'] , то как используя пример выше корректно обыграть ситуацию?


Теоретически должно и так работать.
Но если очень нужно, то можно попробовать вместе с starts-with использовать substring


Да, работает, но дело в том что у меня 2 элемента, которые как раз и различаются по id по номерам и припискам после них. Поэтому я и думаю насчет того, чтобы можно было бы опускать часть id которая получается произвольным образом, и обращаться по стабильной части, которая не только до, но и после генерируемой части присутствует.


Если у Вас часть которая после генерируемой для каждого элемента разная, то я бы использовал substring. В Вашем случае локатор будет выглядеть так:
//input[substring(@id,string-length(@id) - string-length('inputPanel:inputText') + 1) = 'inputPanel:inputText']

Либо можно использовать contains, но только по последней части id.

Либо как я писал использовать starts-with и substring вместе. Что то типа такого:
//input[starts-with(@id,'j_idt') AND (substring(@id,string-length(@id) - string-length('inputPanel:inputText') + 1) = 'inputPanel:inputText')]
  • 0

#7 Diosat

Diosat

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

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Раймондо
  • Город:СПб


Отправлено 19 апреля 2012 - 12:50

Круто, спасибо) Я как-то не подумал что можно contains использовать с любой частью id а не только с началом.
  • 0

#8 Diosat

Diosat

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

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Раймондо
  • Город:СПб


Отправлено 19 апреля 2012 - 13:16

Круто, спасибо) Я как-то не подумал что можно contains использовать с любой частью id а не только с началом.


Нашел 2 шпаргалки. Мб кому пригодятся.

Прикрепленные файлы


  • 0


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

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