Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Запись локаторов найденного текста в переменные


(Anatoly Kuznetsov) #1

Добрый день.
Хочется реализовать следующую функцию:

  1. Найти в таблице(ID таблици известно) текст.
  2. Записать номера столбца и строчки данного текста в две переменные (tr, td).
    Можно ли это сделать в codeception без приминения grabMultiple?

(Sxema Luna) #2

Если я правильно понимаю то , что вам нужно сделать, то можно воспользоватся xpath.
Например, count(//tbody/tr/td[contains(., ‘your text’)]/ancestor::tr)+count(//tbody/tr/td[contains(., your text’)]) даст вам номер строки с этим элементом. Со столбцом аналогично.
Подробнее об этом смотрите тут http://www.slideshare.net/QAFest/qa-fest-2015-xpath-yourself-tips-tricks


(Anatoly Kuznetsov) #3

огромное спасибо, но судя по синтаксису это явно не для PHP.


(5am) #4

php тут не причем. это выражение xpath


(Anatoly Kuznetsov) #5

И снова здравствуйте)) На данном этапе ситуация следующая:

  1. я нахожу в таблице в нужном столбце необходимый мне текст $I->seeElement(’//table[@class=“table1”]/descendant::tr/td[10 and text()=“my text”]’);
  2. Но при попытке получить номер строки через: $N = count(’//table[@class=“table1”]/descendant::tr/td[10 and text()=“my text”]/ancestor::tr’); получаю $N = 1;
    при попытке: $N = count(’//table[@class=“table1”]/descendant::tr/td[10 and text()=“my text”]/ancestor::tr’) + count(’//table[@class=“table1”]/descendant::tr/td[10 and text()=“my text”]); получаю $N = 2;

Буду рад любому совету. Заранее спасибо.


(Fuji F) #6

начни писать xpath поэтапно и дописывай сверяясь с актуальным кол-вом, сначала таблица, потом строки, потом ячейки


(Ray Romanov) #7

Здесь дело не в xPath, а в понимании того что такое фрймворк для тестирования и программирование на РНР. [quote=“Anatoly_Kuznetsov, post:5, topic:11019”]
$N = count(’//table[@class=“table1”]/descendant::tr/td[10 and text()=“my text”]/ancestor::tr’) + count(’//table[@class=“table1”]/descendant::tr/td[10 and text()=“my text”]); получаю $N = 2;
[/quote]

Вот яркое выражение этого. Результат правильный с точки зрения РНР, т.е. 1 строка это 1-н элемент массива (count).


(Anatoly Kuznetsov) #8

Согласен. Поэтому решил пойти другим путе:
Нохожу в табице ячейку, поднимаюсь по XPath на уровень выше (уровень tr) и хочу получить позицию, но получаю пустое значение :
$I->executeInSelenium(function (\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) {
return $webdriver->findElement(WebDriverBy::xpath(’//table[@class=“table1”]/descendant::tr/td[position()=“10” and text()=“my text”]’))->findElement(WebDriverBy::xpath("…"))->getAttribute(‘position’);
});

При этом …findElement(WebDriverBy::xpath("…"))->getText(); - выдает содержимое всей строки.


(Ray Romanov) #9

Зачем такой огород можно проще, непосредственно функциями Codeception:
$n = $I->grabAttributeFrom('//table[@class="table1"]/descendant::tr/td[position()="10" and text()="my text"]/..', 'position');


(Anatoly Kuznetsov) #10

Спасибо за оптимизацию.
Но к сожалению результат что при моем коде что при Вашем переменная получается пустая.
У HTML кода стандартный вид. без каких либо атрибутов у [tr] :
[tbody]
[tr][/tr]
[tr][/tr]
[tr][/tr]

[/tbody]
Так что ломаю голову дальше.


(Ray Romanov) #11

Я вообще то не совсем понял что хотите получить?


(Anatoly Kuznetsov) #12

Номер строки в которой найден элемент.


(Ray Romanov) #13

А что у строк есть прямая нумерация (явная)?
Ссылка на страницу в студию (не скриншот, со скриншотом не поработаешь).


(Anatoly Kuznetsov) #14

Как пример, таблица чепионта по футболу.
Необходимо определить номер страки по названию клуба.
Сылка на сайт:http://www.sport-express.ru/football/rfpl/

мы находим “Арсенал Т” в второй колонке:
$webdriver->findElement(WebDriverBy::xpath(’//table[@class=“table_score nbb”]/descendant::tr/td[position()=“2”]/a[ text()=“Арсенал Т”]’)), но как получить номер строки?


(Ray Romanov) #15

Вот пожалуйста (согласно ссылки) обычный одноякорный локатор:
//table[@class="table_score nbb"]//td/a[contains(text(), "Анжи")]/../../td[1]


(Anatoly Kuznetsov) #16

Огромное спасибо. Задача решена.