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

Фотография

Как обратиться к одному элементу блока, идентифицировав его по другому


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

#1 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 18 августа 2014 - 07:01

Всем привет.
У меня вопрос, который многим наверное покажется достаточно простым, но вот моих познаний пока для его решения не хватает.

Короче есть div с классом contact-header. Он содержит 4 блока.

<div class="pull-left" >
<div class="contact-image">
<div class="contact-action">
<div class="contact-content">

Блок "contact-content" содержит блок "contact-name" внутри которого лежит интересующаяя меня ссылка.

Xpath путь к ней следующий.

//div[@class='contact-header']/div[@class='contact-content']/div[@class='contact-name']/a[contains(text(), 'username')]

С помощью этой команды я нахожу блок "contact-header" с пользователем "username". В этом блоке мне нужно выполнить действие с элементом лежащим в блоке "contact-action"

<div class="contact-action" data-bind="if: $data.Id != 2319 && $parent.UserContextMenuItems.length">
  <div class="dropdown" style="width: 94px;">
    <a class="btn dropdown-toggle" data-toggle="dropdown">
      Действие
      <span class="caret"></span>
    </a>
    <ul class="dropdown-menu" data-bind="template: { name: $parent.ContextMenuItemTemplate, foreach: $parent.UserContextMenuItems }" style="left: 0">
  </div>
</div>

Как мне вернуться в коренной блок и перейти на действие - я ума не приложу. Возможно это вопрос больше по XPath, но прошу не судить строго и если не трудно - помочь разобраться. Заранее благодарен.

Ну и сразу скажу - идетифицировать этот блок для этого user'a другим способом - нет никакой возможности (Не считая id пользователя в аттрибуте data-bind, но "вытаскивать" id я не вижу возможностей.)


  • 0

:smile:


#2 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 18 августа 2014 - 07:22

Если я правильно понял, то советую смотреть в сторону родителя элемента parent::


  • 1

#3 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 18 августа 2014 - 07:27

Можно чуток иначе, найти элемент //div[@class='contact-header']  с текстом 'username', второй этап в найденом элементе найти "contact-action".


  • 1

#4 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 18 августа 2014 - 07:42

Можно чуток иначе, найти элемент //div[@class='contact-header']  с текстом 'username', второй этап в найденом элементе найти "contact-action".

Текст же находится в теге <a>. Так что тут ругань идет на такой XPath //div[contains(@class, 'contact-header') and text() = 'u4']. Хотя я может я не так прописал чего)


  • 0

:smile:


#5 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 18 августа 2014 - 07:45

Если я правильно понял, то советую смотреть в сторону родителя элемента parent::

Ну тут я не представляю в принципе как работать с родителями, ну а тут ничего дельного не написано для меня(хотя может просто не внимательно прочел текст на бусурманщине)


  • 0

:smile:


#6 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 18 августа 2014 - 08:01

По типу такого  



//div[@class='b-adv'] | a[text()= 'Яндекс.Браузер']

А затем в этом элементе искать уже класс с дейтвиями.


  • 1

#7 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 18 августа 2014 - 08:24

По типу такого  

//div[@class='b-adv'] | a[text()= 'Яндекс.Браузер']

А затем в этом элементе искать уже класс с дейтвиями.

Получилось

//div[@class='contact-header'] | div[@class='contact-content']/div[@class='contact-name']/a[contains(text(), 'username')]

Элемент нашел - ругани нет.

Ну а итоговый XPath:

Здесь могла быть ваша реклама

Большое спасибо, без тебя бы точно не разобрался)
Однако, мне интересно как бы это выглядело через предков. Рано или поздно мне придется столкнуться с этим)


  • 0

:smile:


#8 vmaximv

vmaximv

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

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

Отправлено 18 августа 2014 - 08:34

"|" - есть просто union, и по факту вас запрос возвращает первый попавшийся div[@class='contact-header']
  • 0

#9 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 18 августа 2014 - 08:45

"|" - есть просто union, и по факту вас запрос возвращает первый попавшийся div[@class='contact-header']

Так и есть, я просто начал копаться и когда решил GetAttribute(class) сделать, то он и вернул contact-header. Не думал, что кто-то прогонит мой запрос) А я надеялся по-тихому исправить тут после того как у себя исправлю)


  • 0

:smile:


#10 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 18 августа 2014 - 16:09

 

Если я правильно понял, то советую смотреть в сторону родителя элемента parent::

Ну тут я не представляю в принципе как работать с родителями, ну а тут ничего дельного не написано для меня(хотя может просто не внимательно прочел текст на бусурманщине)

 

Вот простой и понятный пример, вместо звездочки может быть тег и т.д.


  • 1

#11 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 19 августа 2014 - 02:28

Я сделал это :yess:. Правда немного по другому. Виноват я тем, что немного недосказал о примере - для чего же я это все делал. Есть страница с блоками. Получается, что есть список из div'ов класса 'contact-item well'. В нем уже содержится div класса 'contact-header'. Ну а дальше вы все и сами знаете. Получается первым шагом - я должен был идентифицировать конкретный блок 'contact-item well'. Что я сделал в этом куске:

//div[contains(@class, 'contact-item well') and div[@class='contact-header']/div[@class='contact-content']/div[@class='contact-name']/a[contains(text(), 'u4')]]

Кстати даже тут, можно было в принципе обойтись без блока верхнего уровня. Но в таком случае это бы расширило количество возможных решений (Например - получить номер блока и выполнять действие с конкретным номером). Но это уже лирика. Ну а дальше уже выполняем конкретное действие - еще раз спасибо babyroot за подсказку. Итого - я вставил после первого куска действие:

"/div[@class='contact-header']/div[@class='contact-action']/div[@class='dropdown']/a"

Ну и получил самый сложный (пока-что) XPath путь в тестируемом проекте:

//div[contains(@class, 'contact-item well') and div[@class='contact-header']/div[@class='contact-content']/div[@class='contact-name']/a[contains(text(), 'u4')]]/div[@class='contact-header']/div[@class='contact-action']/div[@class='dropdown']/a

  • 0

:smile:


#12 yulia_st

yulia_st

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

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

Отправлено 22 августа 2014 - 14:16

//div[@class='contact-header'][contains(.,'username')]//div[contains(@class,'contact-action')]//div/a


  • 0

#13 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 25 августа 2014 - 08:12

//div[@class='contact-header'][contains(.,'username')]//div[contains(@class,'contact-action')]//div/a

Ну тут тогда требуются пояснения. Меня лично смущает

][

этот момент. Ну еще:

[contains(.,'username')]

Хотя это больше от незнания XPath наверное. А вообще что-то подобное имеет право на жизнь


  • 0

:smile:


#14 yulia_st

yulia_st

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

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

Отправлено 28 августа 2014 - 13:33

 

//div[@class='contact-header'][contains(.,'username')]//div[contains(@class,'contact-action')]//div/a

Ну тут тогда требуются пояснения. Меня лично смущает

][

этот момент. Ну еще:

[contains(.,'username')]

Хотя это больше от незнания XPath наверное. А вообще что-то подобное имеет право на жизнь

 

 

ничего смущать тут не должно. условия выборки могут быть сложные, как в первом div'e.

 

//div[@class='contact-header'][contains(.,'username')]   - мы выбираем родительский div 'contact-header', который где-либо в своих дочерних элементах содержит значение username, но в то же время обращаемся к другому дочернему //div[contains(@class,'contact-action')] который Вам необходим по условию.

 

Вы пробовали использовать этот xpath? 


  • 0

#15 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

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

 

 

//div[@class='contact-header'][contains(.,'username')]//div[contains(@class,'contact-action')]//div/a

Ну тут тогда требуются пояснения. Меня лично смущает

][

этот момент. Ну еще:

[contains(.,'username')]

Хотя это больше от незнания XPath наверное. А вообще что-то подобное имеет право на жизнь

 

 

ничего смущать тут не должно. условия выборки могут быть сложные, как в первом div'e.

 

//div[@class='contact-header'][contains(.,'username')]   - мы выбираем родительский div 'contact-header', который где-либо в своих дочерних элементах содержит значение username, но в то же время обращаемся к другому дочернему //div[contains(@class,'contact-action')] который Вам необходим по условию.

 

Вы пробовали использовать этот xpath? 

 

Я пробовал использовать каркас, и он оказался правильный. Просто на тот момент у меня задача несколько изменилась и автоматизация этого тестирования данного ресурса приостановилась. Я обязательно гляну такой вариант, как у меня появится интернет дома)


  • 0

:smile:



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

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