Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

phantomjs
javascript
webdriver
Теги: #<Tag:0x00007f7b69a114e0> #<Tag:0x00007f7b69a11210> #<Tag:0x00007f7b69a10f40>

(Tatyana Durova) #1

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

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

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

(asolntsev) #2

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

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


(Tatyana Durova) #3

@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]);
            }

(Stan) #4

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


(Tatyana Durova) #5

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

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]);
}

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

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


(asolntsev) #6

Нет, 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?


(Tatyana Durova) #7

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


(Tatyana Durova) #8

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

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


(asolntsev) #9

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


(Stan) #10

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


(asolntsev) #11

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

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

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


(Jane Tymoschuk) #12

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


(Tatyana Durova) #13

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