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

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

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

Если я правильно понимаю то , что вам нужно сделать, то можно воспользоватся xpath.
Например, count(//tbody/tr/td[contains(., ‘your text’)]/ancestor::tr)+count(//tbody/tr/td[contains(., your text’)]) даст вам номер строки с этим элементом. Со столбцом аналогично.
Подробнее об этом смотрите тут QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks

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

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

1 лайк

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

  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;

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

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

Здесь дело не в 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).

Согласен. Поэтому решил пойти другим путе:
Нохожу в табице ячейку, поднимаюсь по 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(); - выдает содержимое всей строки.

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

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

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

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

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

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

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

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

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

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