Выбор различных веб-элементов в Selenium

Я инженер по обеспечению качества программного обеспечения, и я пытаюсь создать автоматизированный тест для веб-страницы.

Небольшая предыстория:

Структура Selenium, которую использует ТОЛЬКО моя компания, позволяет вам использовать X-пути, сохраненные как объект, а затем вы используете уже существующие методы, такие как «щелчок (какой-то объект)» или «ввод (какой-то объект)» и т. д.

Проблема:

В настоящее время я пытаюсь создать тест, который выбирает несколько кнопок одного класса. Есть 6 кнопок настройки, которые мне нужно выбрать. Теперь я могу сделать это, но используя:

`//*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[1]/div/a
 //*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[2]/div/a
 //*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[3]/div/a
 //*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[4]/div/a
 //*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[5]/div/a
 //*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[6]/div/a`

-Однако это только временно, потому что позже тест завершится неудачно, когда кнопка будет удалена... Я говорил с командой разработчиков о добавлении уникальных идентификаторов к каждой кнопке. Но не похоже, что это тот путь, по которому они хотят идти...

Возможное решение:

  • Можно ли сузить «область действия» селена?
    Например, указать Selenium просматривать определенный класс, а не всю страницу?
    – Я думаю, что он должен искать класс, сопоставьте определенный текст, затем выберите «Установить».
  • Если да, то возможно ли объединение нескольких путей X Что-то вроде....

    //div[@class='col-sm-4'].... //div[contains(.,'Birth Date: Set +')]

Я думаю, что я мог бы создать Xpath, который сужает то, что на самом деле будет просматривать Selenium.

  1. Поиск класса
  2. Поиск текста «Дата рождения»
  3. Выбор кнопки «Установить»

Вот несколько картинок: ПЕРЕДНЯЯ ЧАСТЬ

Вот некоторый HTML-код, когда я проверяю страницу HTML-КОД


person Stewart Moon    schedule 06.02.2017    source источник


Ответы (3)


Вы хотели бы что-то вроде этого:

//div[@class='col-sm-4'][.//*[contains(text(), 'Birth Date')]]//a

Это означает, что выберите ссылку из div, которая имеет class со значением col-sm-4 и содержит указанный текст.

Или это также может работать так:

//div[contains(text(), 'Birth Date')]/a
person lauda    schedule 06.02.2017

Я полагаю, что вы уже спрашивали об этом, и мы ответили на него.

Но вот несколько решений:

  1. //div[@class='col-sm-4' and contains(text(),'Birth Date')]/div/a

  2. //div[contains(@class,'col-sm-4') and contains(text(),'Birth Date']//a

есть еще много вариантов. Попробуйте посетить w3schools.com, чтобы узнать больше о xpath.

person becixb    schedule 06.02.2017

Чтобы сначала найти div с классом 'col-sm-4' и текстом 'Дата рождения:', а затем найти ссылку с текстом 'Set +' под ним, любой из следующих XPATH может быть использован:

//div[@class='col-sm-4' and contains(text(),'Birth Date')]/descendant::a[1]

Or

//div[@class='col-sm-4' and contains(text(),'Birth Date')]/descendant::a[contains(text(),'Set +')][1]

Or

//div[@class='col-sm-4' and contains(text(),'Birth Date')]/descendant::a[text()='Set +'][1]
person Mahipal    schedule 07.02.2017
comment
зачем использовать потомок вместо //? - person becixb; 08.02.2017
comment
Xpath //div[@class='col-sm-4' и contains(text(),'Dirth Date')]//a[1] также должен работать. Однако, в случае, если по какой-то причине это не работает, то для поиска нужной ссылки можно использовать потомок. - person Mahipal; 08.02.2017