Что использовать: xpath или css
#1
Отправлено 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, но все-таки хотелось бы узнать насчет этого и другие мнения.
Спасибо.
#2
Отправлено 19 апреля 2012 - 06:48
.//*[contains(@id, 'j_idt')]
#3
Отправлено 19 апреля 2012 - 10:16
Спасибо, но я сделал немного по другому, просто слово contains заменил на starts-with.А если так ?
.//*[contains(@id, 'j_idt')]
Получилось так: //input[starts-with(@id, 'j_idt')].
Вопрос: а если id имеет продолжение после произвольно создаваемого номера например: //*[@id='j_idt56:inputPanel:inputText'] , то как используя пример выше корректно обыграть ситуацию?
#4
Отправлено 19 апреля 2012 - 11:06
Спасибо, но я сделал немного по другому, просто слово contains заменил на starts-with.
А если так ?
.//*[contains(@id, 'j_idt')]
Получилось так: //input[starts-with(@id, 'j_idt')].
Вопрос: а если id имеет продолжение после произвольно создаваемого номера например: //*[@id='j_idt56:inputPanel:inputText'] , то как используя пример выше корректно обыграть ситуацию?
Теоретически должно и так работать.
Но если очень нужно, то можно попробовать вместе с starts-with использовать substring
#5
Отправлено 19 апреля 2012 - 11:36
Спасибо, но я сделал немного по другому, просто слово contains заменил на starts-with.
А если так ?
.//*[contains(@id, 'j_idt')]
Получилось так: //input[starts-with(@id, 'j_idt')].
Вопрос: а если id имеет продолжение после произвольно создаваемого номера например: //*[@id='j_idt56:inputPanel:inputText'] , то как используя пример выше корректно обыграть ситуацию?
Теоретически должно и так работать.
Но если очень нужно, то можно попробовать вместе с starts-with использовать substring
Да, работает, но дело в том что у меня 2 элемента, которые как раз и различаются по id по номерам и припискам после них. Поэтому я и думаю насчет того, чтобы можно было бы опускать часть id которая получается произвольным образом, и обращаться по стабильной части, которая не только до, но и после генерируемой части присутствует.
#6
Отправлено 19 апреля 2012 - 11:59
Спасибо, но я сделал немного по другому, просто слово contains заменил на starts-with.
А если так ?
.//*[contains(@id, 'j_idt')]
Получилось так: //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')]
#7
Отправлено 19 апреля 2012 - 12:50
#8
Отправлено 19 апреля 2012 - 13:16
Круто, спасибо) Я как-то не подумал что можно contains использовать с любой частью id а не только с началом.
Нашел 2 шпаргалки. Мб кому пригодятся.
Прикрепленные файлы
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных