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

Подготовка к сертификации ISTQB FL
онлайн, начало 10 августа
Тестирование REST API
онлайн, начало 10 августа
Программирование на Python для тестировщиков
онлайн, начало 14 августа
Тестирование без требований
онлайн, начало 17 августа
Фотография

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 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


Selenium 2.0: стартовый уровень
онлайн
Программирование на Java для тестировщиков
онлайн
Автоматизация функционального тестирования
онлайн
Selenium WebDriver: полное руководство
онлайн



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

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

Яндекс.Метрика
Реклама на портале