Легкий прицел по целям

Бывает такая проблема:

на странице несколько одинаково идентифицируемых элементов, а надо прицелиться во второй (или пятый).

Например, на странице каталога все превью продуктов снабжены кнопками “Купить”, и определяются все эти кнопки одним классом и обрабатываются все одним скриптом.

Уточню ситуацию в моем приложении: кнопка “Купить” оформлена в виде обычного линка. Но по-умолчанию на каждой продуктовой странице есть блок с “похожими товарами”, которые тоже снабжены точно такими же линками “Купить”…

И в коде этот блок “похожие товары” находится ПЕРЕД кодом товара, на страницу которого мы зашли (зрительно он находится в левом нижнем углу страницы, который еще и находится ПОД сгибом экрана, и сразу не заметен). Поэтому обращение к линку

//a[@class=’item_addtocart’ and @title=’Add to Cart’]

приводило к добавлению в корзину товара, который я вообще не видел, и не понимал, откуда он взялся…

Помогло уточнение div, в составе которого находится линк для нужного товара (дивы основного товара и див дополнительных товаров проименованы по-разному.

То есть, дошел я до подсчета количества определенных элементов на странице…

Selenium в этом смысле дружелюбен: XpathCount.

Проверка количества элементов одного типа

Например, результатом

<tr>
<td>verifyXpathCount</td>
<td>//a[@class=’item_addtocart’ and @title=’Add to Cart’]</td>
<td></td>
</tr>

и Селен сам подсказал, что таких элементов на странице аж три штуки.

[error] Actual value ‘3’ did not match ”

Уточняем проверку:

<tr>
<td>verifyXpathCount</td>
<td>//a[@class=’item_addtocart’ and @title=’Add to Cart’]</td>
<td>3</td>
</tr>

и строка окрашивается в сугубо веселый зеленый цвет.

Сохранение количества элементов в переменную

<tr>
<td>storeXpathCount</td>
<td>//a[@class=’item_addtocart’ and @title=’Add to Cart’]</td>
<td>kali4estffoIlimentaff</td>
</tr>

<tr>
<td>echo</td>
<td>${kali4estffoIlimentaff}</td>
<td></td>
</tr>

и в echo выводится точная цифра = 3.

Клик по второму элементу

Итак, в коде страницы линк на добавление в корзину нужного мне продукта находится на втором месте.

Решение совсем не очевидное:

<!– Результат напрямую зависит от положения элемента в зависимости от его окружающих. Если элементы одинаковые, но поменялись местами, тогда будет “ой”.–>

<tr>
<td>clickAndWait</td>
<td>xpath=(//a[@class=’item_addtocart’ and @title=’Add to Cart’])[2]</td>
<td></td>
</tr>

Реальный случай – на странице 36 одинаковых элементов. В указанном примере пишем “35” – и результат восхищает.

Указание элемента без привязки к html

Кстати, если нужный элемент содержит текст

<a class=”item_addtocart” title=”Add to Cart”>buy item</a>

то вместо указанного

//a[@class=’item_addtocart’ and @title=’Add to Cart’]

можно находить этот же элемент и таким образом:

//a[contains( text(),’buy item‘)]

или даже так:

//*[contains( text(),’buy item‘)]

Ведь кликать иногда приходится не только по живым линкам, но и по картинкам, и по дивам, и по спанам.

10 thoughts on “Легкий прицел по целям

  1. Например, в td есть три div. В каждой div есть //a[@class=’item_addtocart’ and @title=’Add to Cart’], но с разным текстом ‘buy item1’, ‘buy item2’, ‘buy item3’. Как попросить Селениума определить, что //a[contains( text(),’buy item2′)] находится именно во второй div[2]? тоисть мне нужно получить число div, которое в данном примере =2.

  2. Добрый день! В ходе выполнения теста формируются три переменные в каждой уникальное значение. Затем тест переходит на другую страницу где есть input type checkbox, name этого inputa составное в виде например text:135:text_2. 135 то, что объединяет значения переменных с inputaми. В трёх переменных как раз хранятся значения типа 135, мне нужно поставить галочки в те inputы в составном name которых есть 135, которое соответствует значению одной из переменных. Переменных три, а инпутов может быть хоть 10. Пока для меня задачка – тёмный лес…

  3. Спасибо за ответ! Простите не хотел… Хочу уточнить вопрос…
    Мне нужен инструмент selenium ide который выполнить проход по всем input checkbox на открытой странице. При каждом проходе будет брать значение name. После того как возьмёт составное значение name разобьёт его на составляющие (name такого вида rekviziti:1000:166:23:prl), выполнит сравнение составляющей name с индексом 2 (значение 166) со всеми значениями переменных (их три), и если будет совпадение выполнит //input[@type=’checkbox’ and contains(@name, ‘составное:название:чекбокса’)]. Что-то типа того, но это точно оно…

  4. Переменные полученные в Селене:
    id_1 = 166;
    id_1 = 170;
    id_1 = 172;
    Инпуты в странице:

    Нужно что-то типа:
    while ( пока_есть_инпуты_показать_значение_name_следующего ) {

    массив = explode ( “:”, пока_есть_инпуты_показать_значение_name_следующего );

    if ( массив[3] == id_1 ) {

    click | //input[@type=’checkbox’ and contains(@name, составное:название:чекбокса’)]

    } else if ( массив[3] == id_2 ) {

    click | //input[@type=’checkbox’ and contains(@name, составное:название:чекбокса’)]

    } else if ( массив[3] == id_3 ) {

    click | //input[@type=’checkbox’ and contains(@name, составное:название:чекбокса’)]

    } else {

    //ничего выбирать не нужно;

    }

  5. Вообще беда! Инпуты в странице я писал их, но они пропали!

    input type = ‘checkbox’ name = ‘rekviziti:1000:23:166:prl’
    input type = ‘checkbox’ name = ‘rekviziti:1000:23:167:prl’
    input type = ‘checkbox’ name = ‘rekviziti:1000:23:170:prl’
    input type = ‘checkbox’ name = ‘rekviziti:1000:23:171:prl’
    input type = ‘checkbox’ name = ‘rekviziti:1000:23:172:prl’
    input type = ‘checkbox’ name = ‘rekviziti:1000:23:180:prl’

  6. Ленина ул. 1

    Ленина ул. 2

    Есть вот такой кусок кода.
    Нужно отметить чекбоксы. Отмечаю по айди:
    – css=#a88dea31-8c7f-11e6-af9a-005056886752 > a > label.element_check > input.element_check
    – css=#f366747c-2e44-11e6-bbb6-005056886752 > a > label.element_check > input.element_check

    1. Как можно их отмечать используя label’ы? Чтоб максимально коротко и по именам типа Ленина ул. 1?

    З.Ы. И можно ли отметить все чекбоксы видимые на странице?

    З.З.Ы. Понимаю что это статья 2012, а сейчас 2016. Надеюсь что автор сюда заглянет 😉

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s