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

Фотография

Обращение к элементам с заранее неизвестным id - Python


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

#1 uxtu

uxtu

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

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

Отправлено 07 апреля 2016 - 08:02

Всем привет!
Друзья нужна помощь, спасайтеsmile3.gif
Есть связка python+selenium.
Допустим есть такой код с кучей однотипных div, в которых в значения class и id подставляются auto-* 

<div role="presentation" class="x-form-element x-form-el-x-auto-6" id="x-form-el-x-auto-6" style="padding-left:145px"><div role="presentation" class=" x-form-field-wrap  x-component " id="x-auto-6" style="width: 153px;"><input type="text" class=" x-form-field x-form-text " id="x-auto-6-input"></div>
 
<div role="presentation" class="x-form-element x-form-el-x-auto-7" id="x-form-el-x-auto-7" style="padding-left:145px"><div role="presentation" class=" x-form-field-wrap  x-component " id="x-auto-7" style="width: 153px;"><input type="password" class=" x-form-field x-form-text  x-form-invalid " id="x-auto-7-input" ></div>

Проблема в том, что значение auto-* заранее неизвестно, и не понятно как обращаться к каждому input по driver.find_elements_by...

Подскажите плз как можно это сделать???


  • 0

#2 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 07 апреля 2016 - 08:10

xpath:
//div[contains(@class,'x-form-el-x-auto')][1]//input

- где [1] - порядковый номер элемента


  • 1

#3 uxtu

uxtu

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

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

Отправлено 07 апреля 2016 - 10:00

xpath:
//div[contains(@class,'x-form-el-x-auto')][1]//input

- где [1] - порядковый номер элемента

 

Спасибо!!!


  • 0

#4 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 07 апреля 2016 - 13:43

У вас оба элемента с разными типом: input type="text" и input type="password". Это тоже можно использовать.
  • 0

#5 uxtu

uxtu

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

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

Отправлено 08 апреля 2016 - 03:05

У вам оба элемента с разными типом: input type="text" и input type="password". Это тоже можно использовать.

Это подойдет если два input, а если их 100 ...


  • 0

#6 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 11 апреля 2016 - 13:13

У вам оба элемента с разными типом: input type="text" и input type="password". Это тоже можно использовать.

Это подойдет если два input, а если их 100 ...

"Можно использовать" - не означает, что это единственный критерий.
К примеру, пример выше, но с уточнением типа инпута - уже будет конкретнее, чем просто поиск абстрактного N-ого div'а с вложенным инпутом:
//div[contains(@class,'x-form-el-x-auto')][1]//input[@type='password']

  • 0

#7 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 11 апреля 2016 - 16:09

У вам оба элемента с разными типом: input type="text" и input type="password". Это тоже можно использовать.

Это подойдет если два input, а если их 100 ...
"Можно использовать" - не означает, что это единственный критерий.К примеру, пример выше, но с уточнением типа инпута - уже будет конкретнее, чем просто поиск абстрактного N-ого div'а с вложенным инпутом:
//div[contains(@class,'x-form-el-x-auto')][1]//input[@type='password']

И для чего это нужно если в диве всего один инпут?
  • 0

#8 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 12 апреля 2016 - 09:42

У вам оба элемента с разными типом: input type="text" и input type="password". Это тоже можно использовать.

Это подойдет если два input, а если их 100 ...

"Можно использовать" - не означает, что это единственный критерий.К примеру, пример выше, но с уточнением типа инпута - уже будет конкретнее, чем просто поиск абстрактного N-ого div'а с вложенным инпутом:
//div[contains(@class,'x-form-el-x-auto')][1]//input[@type='password']


И для чего это нужно если в диве всего один инпут?

Для того, что под локатор "//div[contains(@class,'x-form-el-x-auto')][1]//input" - подойдут все дивы с указанным текстом в названии класса, внутри которых где-то будет любой инпут.
С уточнением - он будет искать элемент не среди всех таких дивов, а только среди тех, где есть инпут с нужным типом. Он ведь спросил - что будет если 100 полей.
element[56] из 100 дивов - или element[3] из, к примеру всего 5 дивов с инпутами с типом 'password'. Разница вроде небольшая, но при изменении структуры - со вторым будет чуть меньше вероятность, что его надо переделывать.
Я в принципе не очень люблю локаторы с порядковывми номерами, уж очень они не конкретные. Поэтому и стараюсь сделать настолько конкретный локатор, насколько это в принципе возможно.
  • 0


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

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