Как получить xpath элемента во время выполнения теста webdriver?

Думаю сделать выполнение скрипта во время теста на webdriver типа
$(’#some_element’).trigger(‘hover’);

Но не знаю, как мне имя или xpath элемента, который мне нужен и уже описан например в каком то pageobject классе. То есть я хочу сделать что-то типа такого:

string xpath = stoneHeader[i].GetAttribute("xpath"); //Только вот эта часть не работает!
string stringForExecute = "$x(" + xpath + ").trigger('hover')";
js.ExecuteScript(stringForExecute);

Проблема решается без xpath. Надо просто передать элемент как параметр в JavaScript:

executeJavascript("$(arguments[0]).trigger(‘hover’)", myWebElement);

1 лайк

@asolntsev Спасибо большое за ответ, но у меня есть несколько нубских вопросов…:

  1. А если у меня массив элементов? Мне писать
    ExecuteScript("$(arguments[0]).trigger(‘hover’)", stoneHeader[i]); ?
  2. arguments[0] - это какая то константа, или это myArguments[0]?
  3. Всегда индекс писать [0] или он тоже дложен меняться? т.е. вы имели в виду arguments[i] ?
  4. как бы еще в лог выводить “этот элемент был hovered”, для отладки…? =)

Написала пока так, но почему то элементы не становяться видимыми, в консоли браузера во время дебага ничего не видно (а должны ли там js команды вообще отобрадаться, которые я выполняю через тесты?):

 for (int i = 0; i < stones.Count - 1; i++)
            { 
                ExecuteScript("$(arguments[0]).trigger('hover')", stoneHeader[i]);
                VerifyElementVisible("stoneDetailsBadge " + i, stoneDetailsBadge[i]);
            }

arguments[0] - первый аргумент функции, в данном случае там единственный аргумент - myWebElement, т.е. вы используете ховер над myWebElement. Сделать это над массивом элемментов без доаолнительных телодвижений у вас не получится (да и зачем?).

Если я правильно понимаю, то вот так должно работать?

for (int i = 0; i < stones.Count - 1; i++)
{
ExecuteScript("$(arguments[0]).trigger(‘hover’)", stoneHeader[i]);
}

или надо слово arguments заменять?

for (int i = 0; i < stones.Count - 1; i++)
{
ExecuteScript("$(stoneHeader[i]).trigger(‘hover’)", stoneHeader[i]);
}

Может еще задержки какие то нужны, или свойство после изменения должно оставаться видимым на протяжении всего теста до перезагрузки страницы?

Тест пока что падает (тк элемент остается не видим).

Нет, arguments заменять не надо.
Первый вариант правильный:
for (int i = 0; i < stones.Count - 1; i++) {
ExecuteScript("$(arguments[0]).trigger(‘hover’)", stoneHeader[i]);
VerifyElementVisible("stoneDetailsBadge " + i, stoneDetailsBadge[i]);
}

Если элементы не становятся видимыми, значит, просто “trigger(‘hover’)” недостаточно, надо что-то ещё. Вероятно, надо уже с разработчиками консультироваться.

P.S. А почему не хотите использовать Actions, который позволяет наводить мышку без javascript?

так я хочу в phantomJs озеленить эти тесты, у меня actions работает прекрасно в других браузерах, но не тут =(

В итоге оказазывается проблема с быстрым появлением-исчезанием элемента (подтвердил разработчик), надо как то задержать курсор или поставить какой то таймер наверное еще… Событие было все-таки hover.

Как сделать задержку курсора через javascript?

Я не очень понимаю, что значит “задержку курсора”.

Если курсор “уходит на другой элемент”, то вероятнее всего вы выполнили уже другое действие?)

Всё равно не понимаю, но может, так заработает:

for (int i = 0; i < stones.Count - 1; i++) { 
  ExecuteScript("$(arguments[0]).trigger('hover')", stoneHeader[i]);
  VerifyElementVisible("stoneDetailsBadge " + i, stoneDetailsBadge[i]);
  Thread.sleep(100);
}

А вообще, непонятно, что вам нужно протестировать. Зачем в тесте мышкой водить по всем элементам? Какой-то бессмысленный тест.

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

Hover там не получиться, там вообще css стиль меняется при наведении мышью, в общем в phantomJs такое не протестировать видимо.