Сделать локатор элементов уникальным

Я начинаю изучать Selenium, практикую автоматизацию с помощью Eclipse, и я работаю над автоматизацией тестового примера со следующими первыми двумя шагами:

Go to http://automationpractice.com/index.php
Verify -5% displayed on product 'Printed Summer Dress'

На втором этапе у меня возникла следующая проблема: я не могу создать уникальный локатор для элемента -5% на веб-странице. Я пробовал разные локаторы элементов, но в консоли элементов «Проверить», в строке поиска «Найти по строке, селектору или Xpath» локаторы выдают несколько результатов, например 1 из 8 или 1 из 4. Я определенно хочу убедитесь, что я использую уникальный локатор элементов, чтобы при запуске теста я получал полностью достоверный результат.

Это элемент:

<span class="price-percent-reduction">-5%</span>

Насколько я могу судить, других атрибутов элемента, кроме класса, нет, поэтому я не могу использовать альтернативный атрибут.

Примечание: это не домашнее задание и не классная работа, а моя собственная практика.

Я пытался использовать следующие локаторы, но ни один из них не дает результата 1 из 1, то есть они не уникальны.

CSS --> span.price-percent-reduction
CSS --> span[class='price-percent-reduction']
XPath --> //span[text()='-5%']
XPath --> //span[@class='price-percent-reduction']

Я искал похожие вопросы здесь, в Stack Overflow, но не смог найти ни одного, соответствующего моему собственному.


person Anne Bailly    schedule 11.11.2019    source источник


Ответы (3)


Вы правы в своем предположении, что поиск <span class="price-percent-reduction"> вернет несколько элементов. Похоже, вы пытаетесь найти на странице конкретный продукт с процентной скидкой. Таким образом, вам нужно будет найти span в контексте продукта, который вы ищете.

Вот расширенный XPath, который просматривает название продукта и на его основе получает скидку в процентах:

//ul[@id='homefeatured']//div[h5/a[@title='Printed Chiffon Dress']]/div/span[@class='price-percent-reduction']

Этот селектор возвращает 1 результат -20%, то есть процентную скидку на продукт Printed Chiffon Dress.

Это можно обобщить на:

//ul[@id='homefeatured']//div[h5/a[@title='product title here']]/div/span[@class='price-percent-reduction']

XPath можно разбить следующим образом:

На веб-сайте есть два списка продуктов — «Популярные» и «Бестселлеры». В этих двух списках продуктов есть дублирующиеся продукты — некоторые «Популярные» продукты также находятся в списке бестселлеров. Чтобы получить один элемент продукта, нам нужно указать список. Приведенный выше XPath определяет список «Популярные», указанный в предложении //ul[@id='homefeatured']. Обратите внимание, что это можно изменить на //ul[@id='blockbestsellers'], чтобы вместо этого выбирать из списка «Бестселлеры».

После выбора //ul[@id='homefeatured'] мы запрашиваем продукт в списке, используя атрибут title, который появляется внутри предложения //div[h5/a[@title='product title here']]. Этот запрос указывает наш путь для поиска содержащего элемент div, который содержит заголовок product title here.

Как только мы выбираем продукт на основе его названия, мы можем запросить снижение цены в процентах, часть /div/span[@class='price-percent-reduction'] пункта.

С полученным XPath вы можете изменить product title here на Printed Chiffon Dress или название любого другого проекта и получить значение %off (-5%), которое отображается под этим продуктом.

Стоит отметить, что я использую вспомогательное расширение XPath для своего Google Chrome, поэтому я могу тестировать большинство XPath в режиме реального времени, и я могу писать сложные оценки, такие как путь, который я написал выше. Это механизм, который я использовал для проверки этого XPath на указанном вами URL-адресе веб-сайта.

person Christine    schedule 11.11.2019

Чтобы получить уникальный элемент сокращения -5%, используйте следующий xpath.

//ul[@id='homefeatured'][.//a[@title='Printed Summer Dress']]//div[@class='right-block']//span[@class='price-percent-reduction'][text()='-5%']

Вызвать WebDriverWait и visibilityOfElementLocated()

WebDriverWait wait = new WebDriverWait(driver, 20); 
WebElement itempricediscount=wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//ul[@id='homefeatured'][.//a[@title='Printed Summer Dress']]//div[@class='right-block']//span[@class='price-percent-reduction'][text()='-5%']")));
System.out.println(itempricediscount.getText());
person KunduK    schedule 11.11.2019

Вот css для этого:

#homefeatured > li:nth-child(5) .left-block .price-percent-reduction

Что я делаю, так это ищу его на панели хромированных элементов и продолжаю подниматься, пока не появится что-то уникальное.

person pguardiario    schedule 12.11.2019