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

Фотография

Выбор из выпадающего списка


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

#1 Mevmix

Mevmix

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

  • Members
  • Pip
  • 43 сообщений
  • ФИО:Evgen

Отправлено 31 марта 2014 - 13:07

Всем доброго дня!!!

Как из выпадающего списка выбрать значение на C#

в таком случае все работает хорошо, 

driver.FindElement(By.XPath("//select[@id='country']/option[@value='VA']")).Click();

но если мы не знаем значение value.

 

Выбрать просто первый в списке ListBox.

Спасибо

 


  • 0

#2 vmaximv

vmaximv

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

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

Отправлено 31 марта 2014 - 13:32

//select[@id='country']/option[1] - это разве не очевидно?


  • 0

#3 vitorg

vitorg

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

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

Отправлено 01 апреля 2014 - 12:13

Правильнее всё-таки (//select[@id='country']/option)[1].


  • 0

#4 vmaximv

vmaximv

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

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

Отправлено 01 апреля 2014 - 12:25

Обоснуйте


  • 0

#5 vitorg

vitorg

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

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

Отправлено 01 апреля 2014 - 13:04

Обоснуйте

Это разве не очевидно? Ответил на ваш пример в соседней теме.
  • 0

#6 vmaximv

vmaximv

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

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

Отправлено 01 апреля 2014 - 13:09

Абсолютно не очевидно - как и ваш ответ с соседней теме.
Покажите разницу между (//select[@id='country']/option)[1] и //select[@id='country']/option[1].
Могу подсказать что эти варианты отличаются как минимум производительностью, а первый вариант имеет достаточно "подводных камней".
  • 0

#7 leipreachan

leipreachan

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

  • Members
  • PipPip
  • 95 сообщений
  • Город:Москва

Отправлено 01 апреля 2014 - 15:02

Абсолютно не очевидно - как и ваш ответ с соседней теме.
Покажите разницу между (//select[@id='country']/option)[1] и //select[@id='country']/option[1].
Могу подсказать что эти варианты отличаются как минимум производительностью, а первый вариант имеет достаточно "подводных камней".

 

оператор [] в xpath имеет больший приоритет, чем //

ваше выражение возвращает массив из N элементов и выбирает все опции, которые являются первым потомком select. Т.е., опять же все :)

 

Пояснение есть, например, тут: http://stackoverflow...text-with-xpath

 

Ну, и в конце концов, проверьте.

Далеко ходить не надо - проверьте, какой элемент на этом топике //h3[2], а какой (//h3)[2]

Выражение Виталия выбирает все опции в массив, а из них уже получает первое


  • 1

#8 vitorg

vitorg

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

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

Отправлено 01 апреля 2014 - 15:30

Абсолютно не очевидно - как и ваш ответ с соседней теме.
Покажите разницу между (//select[@id='country']/option)[1] и //select[@id='country']/option[1].
Могу подсказать что эти варианты отличаются как минимум производительностью, а первый вариант имеет достаточно "подводных камней".

Здесь скорее второй вариант имеет много подводных камней, т.к. выбирается всё множество для которого справедливо "//select[@id='country']/option[1]" - option является первым, и только счастливое стечение обстоятельств приводит к правильному выбору элемента. В то же время первый вариант достаточно однозначен.

 

Если же исходить из предположения, что документ гарантированно валиден, то конечно же не может быть второго select с id=country и в этом случае локаторы взаимозаменяемы, но всё-таки не эквивалентны. В варианте без скобок наложились слишком много удачных моментов благодаря которым он работает, но стоит шевельнуть немного вёрстку и такие конструкции чёрту ногу свернут если тот начнёт разбираться почему же не работает локатор.

 

Про производительность не могу ничего сказать однозначно, т.к. не сравнивал, но всё-таки подозреваю, что первый вариант (со скобками) должен быть более производительным, т.к. оперирует меньшими объёмами данных.


  • 1

#9 vitorg

vitorg

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

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

Отправлено 01 апреля 2014 - 15:33

оператор [] в xpath имеет больший приоритет, чем //

Вы меня опередили, спасибо за ссылку :)


  • 0

#10 vmaximv

vmaximv

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

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

Отправлено 02 апреля 2014 - 07:29

Парни, я прекрасно знаю что такое предикаты, node-sets, context и т.д. И вполне себе понимаю разницу между (//h3)[2] и //h3[2].

По производительности: давайте я "откомпилирую" эти выражения
1. //select[@id='country']/option[1] - браузер серчит DOM с начала, находит <select id='country'>, берет первый чайлд <option>, применяет к нему предикат [position()=1], получает тру => искомый элемент найдет => коней
2. (//select[@id='country']/option)[1] - браузер серчит DOM с начала, находит <select id='country'>, собирает *всех* чайлдов <option> (которые нам абсолютно не нужны), и идет гулять дальше по DOM выискивая новых кандидатов.
Какой вариант будет быстрее? Подсказка - select с 100К опциями во втором варианте отправил Opera'у в нокаут минут на 20.

По "счастливому стечению обстоятельств" и стабильности:
//select[@id='country']/option[1] - я точно знаю, что ищу: опцию в селекте, которая является первым чайлдом.
1. Если у селекта первый чайлд не option (optgroup во внимание не берем) - это баг => тест должен упасть.
2. Если имеет место быть


<select id='county'>
  <option>1</option>
</select>
<select id='county'>
  <option>3</option>
</select>
То //select/option[2] приведет к вполне ожидаемому фейлу, при(//select[@id='county')[2] выберет первое значение второго селекта, что не совсем ответствует ожиданиям.
  • 0

#11 leipreachan

leipreachan

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

  • Members
  • PipPip
  • 95 сообщений
  • Город:Москва

Отправлено 02 апреля 2014 - 08:54

Парни, я прекрасно знаю что такое предикаты, node-sets, context и т.д. И вполне себе понимаю разницу между (//h3)[2] и //h3[2].

По производительности: давайте я "откомпилирую" эти выражения
1. //select[@id='country']/option[1] - браузер серчит DOM с начала, находит <select id='country'>, берет первый чайлд <option>, применяет к нему предикат [position()=1], получает тру => искомый элемент найдет => коней
2. (//select[@id='country']/option)[1] - браузер серчит DOM с начала, находит <select id='country'>, собирает *всех* чайлдов <option> (которые нам абсолютно не нужны), и идет гулять дальше по DOM выискивая новых кандидатов.
Какой вариант будет быстрее? Подсказка - select с 100К опциями во втором варианте отправил Opera'у в нокаут минут на 20.

По "счастливому стечению обстоятельств" и стабильности:
//select[@id='country']/option[1] - я точно знаю, что ищу: опцию в селекте, которая является первым чайлдом.
1. Если у селекта первый чайлд не option (optgroup во внимание не берем) - это баг => тест должен упасть.
2. Если имеет место быть



<select id='county'>
  <option>1</option>
</select>
<select id='county'>
  <option>3</option>
</select>
То //select/option[2] приведет к вполне ожидаемому фейлу, при(//select[@id='county')[2] выберет первое значение второго селекта, что не совсем ответствует ожиданиям.

 

 

у вас html с проблемкой: два элемента с одинаковым id. Вас это не смущает?


  • 0

#12 vmaximv

vmaximv

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

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

Отправлено 02 апреля 2014 - 09:12

Нет. Мопед не мой - это дэвы. Если вас это смущает - замените id на name например - это сути не меняет.
  • 0

#13 vitorg

vitorg

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

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

Отправлено 02 апреля 2014 - 09:18

Протестировал оба варианта на FF 28.0, среднее время поиска локатора составило 25 мс в обоих случаях (30 опытов на 100000 option'ах). Вы уверены, что на Opera использовали нативный XPath, какая версия? Думаю, что там далеко не всё так просто разворачивается и есть куча различных оптимизаций, работающих по-своему в каждом браузере, где-то будет быстрее один вариант, а где-то другой, ну и опять же от вёрстки всё сильно зависит.


  • 1

#14 leipreachan

leipreachan

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

  • Members
  • PipPip
  • 95 сообщений
  • Город:Москва

Отправлено 02 апреля 2014 - 11:16

Нет. Мопед не мой - это дэвы. Если вас это смущает - замените id на name например - это сути не меняет.

я бы багу влепил за такой HTML. Так делать нельзя (раз)

 

Расширим пример до:

<select id='county'>
  <option>1</option>
  <option>2</option>
</select>
<select id='county'>
  <option>3</option>
  <option>4</option>
</select>

вы ведь в курсе, что //select/option[2] выберет два элемента?

Полагаю, топикстартеру важнее выбрать, всё-таки, ОДИН элемент


  • 0

#15 vmaximv

vmaximv

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

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

Отправлено 02 апреля 2014 - 12:21

Протестировал оба варианта на FF 28.0, среднее время поиска локатора составило 25 мс в обоих случаях (30 опытов на 100000 option'ах).

Вы правы - мой фейл. Время во всех браузерах примерно одинаковое. Только одна опера (12.16) честно пытается создать сет нодов и падает по таймауту через WD+OperaDriver, либо виснет очень надолго, если ручками через dragonfly.

В общем так я от вас и не услышал, почему имея такой сорс





<body>
  <select>
    <option>a</option>
    <option>b</option>
  </select>
</body>

правильнее писать (//select/option)[1], а не //select/option[1]? При том, что наличие у select других чайлдов, отличных от option - это хак,баг и провокация. А при использовании сета есть вероятность "влететь" в совершенно другой селект.


  • 0

#16 leipreachan

leipreachan

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

  • Members
  • PipPip
  • 95 сообщений
  • Город:Москва

Отправлено 02 апреля 2014 - 13:46

 

Протестировал оба варианта на FF 28.0, среднее время поиска локатора составило 25 мс в обоих случаях (30 опытов на 100000 option'ах).

Вы правы - мой фейл. Время во всех браузерах примерно одинаковое. Только одна опера (12.16) честно пытается создать сет нодов и падает по таймауту через WD+OperaDriver, либо виснет очень надолго, если ручками через dragonfly.

В общем так я от вас и не услышал, почему имея такой сорс





<body>
  <select>
    <option>a</option>
    <option>b</option>
  </select>
</body>

правильнее писать (//select/option)[1], а не //select/option[1]? При том, что наличие у select других чайлдов, отличных от option - это хак,баг и провокация. А при использовании сета есть вероятность "влететь" в совершенно другой селект.

 

в случае вашего примера - всё одинаково

 

По поводу хаков-багов-провокаций: в select можно запихнуть, например, <input type=hidden/>. Это вообще никак не скажется на вёрстке. А вот на отправке формы - может сказаться.


  • 0

#17 vitorg

vitorg

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

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

Отправлено 02 апреля 2014 - 15:13

правильнее писать (//select/option)[1], а не //select/option[1]? При том, что наличие у select других чайлдов, отличных от option - это хак,баг и провокация. А при использовании сета есть вероятность "влететь" в совершенно другой селект.

 

Не думаю, что наличие у select других потомков отличных от option является хаком, даже наоборот, они там могут запросто оказаться и будут правы :D

 

Правильнее в данной ситуации исключительно потому, что (//select/option)[1] - это гарантированный возврат одного элемента, а //select/option[1] может вернуть любое количество элементов в зависимости от ситуации и от того как в будущем изменится вёрстка, т.е. это скорее идейно правильный подход, но результаты будут одинаковыми в данном примере. Если уж на то пошло, то и "[1]" в вашем варианте лишняя, первый элемент удачно выберется и так: //select/option... Но это исключительно удача :)

 

В реальной же ситуации надо конечно жёстко фиксировать select (по id или по привязке к форме в которой он находится и т.п.), а дальше уже выбирать конкретный option. Данный способ со скобками лично мне видится намного более однозначным и очевидным по принципу работы, плюс имеет меньше побочных эффектов.


  • 0

#18 vmaximv

vmaximv

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

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

Отправлено 03 апреля 2014 - 06:51

По поводу хаков-багов-провокаций: в select можно запихнуть, например, <input type=hidden/>. Это вообще никак не скажется на вёрстке.

Не думаю, что наличие у select других потомков отличных от option является хаком, даже наоборот, они там могут запросто оказаться и будут правы :D

Покажите - у меня не получается :(
  • 0

#19 vitorg

vitorg

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

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

Отправлено 03 апреля 2014 - 08:38

По спецификации select может содержать 2 типа тегов: <!ELEMENT SELECT - - (OPTGROUP|OPTION)+, не думаю, что есть законный способ поместить <input type=hidden/> внутрь select, но допускаю, что там могут оказаться и другие теги типа meta, script и т.п.


  • 0

#20 vmaximv

vmaximv

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

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

Отправлено 03 апреля 2014 - 08:47

<select id='my'>
  <script>alert();</script>
  <meta content="select with meta and script tags">
  <option>one</option>
  <option>two</option>
</select>
//select/option[1] возвращает мне опцию "one" - что я делаю не так?
  • 0


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

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