Сокращение XPath – клик по тексту

Бывает так, что некоторые линки на странице настолько закрыты жаваскриптами, что Selenium IDE или записывает клики по ним в виде //html[@id=’js’]/body/table[2]/tbody/tr/td[2]/div[4]/div[1]/div/table[1]/tbody/tr/td/a/i, или вообще не может записать клик.

Ситуация:

1) на странице есть линк “details”, который открывает страницу или слой на странице с дополнительными данными, которые по-AJAX подсасываются с сервера, не открывая для этого отдельное окно браузера.

2) этот линк на странице уникален.

3) но конструкция у этого линка хитрая. Класс у него указан такой: class=”carticon item_addtocart”, и меняется в зависимости от некоторых условий (с какой страницы пришел, например). То есть, в эту минуту класс именно такой, какой был указан, а через некоторое время он же будет выглядеть как class=”carticon item_addtocart search_engine_guest”, или как-то еще. Записывать все эти состояния нет нужды, цель в том, чтобы клик по линку срабатывал правильно.

4) конструкция | click | link=details | в силу некоторых технологических причин (гребанный AJAX) невозможна.

Шо делать?

Приступ

Искать элементы страницы по XPath можно несколькими способами, в том числе и ориентируясь по обычному тексту.

По-заветам W3C касательно аббревиатур XPath, сокращать длинные пути можно всячески.

Следовательно, можно сделать клик по линку, обращаясь только к его тексту, а не параметрам:

| click | //*[text()=’details’] | |

Толкование:

найди мне на странице ЛЮБОЙ элемент, который содержит именно текст “details”, а не что-нибудь еще.

Важно знать, что если на странице есть несколько элементов, которые попадают под условия этого поиска, Selenium обработает первый из них (тот, кто ближе к открывающему тэгу html).

PS это “что-нибудь еще” можно искать посредством символа *:

| click | //*[text()=’*tails’] | |

13 thoughts on “Сокращение XPath – клик по тексту

  1. Спасибо за чудесный блог! очень помогает!
    Но у меня не всегда работает этот метод… Бывает по нажатию на клавишу X(Ч) работает, а при запуске теста нет. В чем может быть причина?

  2. Разобрался в причине. В веб-приложении с использованием Ajax куда-то уходит фокус и действие click по объекту с заданным текстом не выполняется, хотя и ошибку не выдает. По нажатию на find – объект находится, но если нажать X (Execute this command) – в логе пишется выполнено, но сам клик не делается..
    Если вручную сделаю клик на объекте, то после этого уже и скрипт его сделает.

    1. У меня тот же трабл.
      Локатор – находит цель. Команда клик выполняется успешно (зеленеет), но вот самого клика не происходит. Если вручную – то без проблем.

      1. Вариантов причин – масса.

        Надо смотреть на приложение и код в странице.

        Иногда при AJAX что-то подгружается в момент клика, и заранее не понять, как именно элемент видоизменяется.

        1. Если Вы уже встречались с таким, подскажите пожалуйста хотябы что искать? Код элемента не меняется при ручном клике. По крайней мере визуально в ФБаге этого не видно.

          1. Там может быть не обычный клик, а вызов какого-то скрипта, который помимо клика делает что-то еще.

            Скрипт может вызываться при событии mouseOver. А может срабатывать при mouseOut или releaseMouse – говорю же, масса вариантов, надо смотреть непосредственно на приложение.

            Спросите у программиста.

  3. Добрый день,подскажите пожалуйста как быть?Работаю в Selenium IDE,нужно на одной всплывающей страничке(PopUp) в текстовое поле ввести значение.Проблема в том что его id каждый раз меняется,вот описание с программного кода элемента:
    Last Name
    часть – 0EF912F0D2EF4D2 – каждый раз другая,как мне отследить этот элемент?заранее спасибо)

    1. мгм

      если есть и другие идентификаторы, и окно всплывающее всегда одно, то можно попробовать идентифицировать его не по полному ид, а по его части. Типа, contains blah-blah…

  4. id=ctl_flex_physician_sep_97BACF1E02E8425_physician_last_name
    я просто не пойму как обратится через type?можно пример с type,как заносить по неполному идентификатору

  5. selenium.type(“id=ctl_flex_physician_sep_97BACF1E02E8425_physician_last_name”,”doct);
    как то можно указать через неполный ид?

    1. Если элемент уникальный (судя по именованию, подозреваю, что это уникальное значение для поля ‘last name’), то делаем так:

      type | //*[contains(@id, ‘_physician_last_name’)] | doctorLastName

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

      Конструкция ‘//*’ означает “НАЙТИ ВАЩЩЕ ЛЮБОЙ ЭЛЕМЕНТ, у которого есть id и этот id содержит…”, но вы можете указать этот элемент более точно.

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