Мне просто интересно, можете ли вы указать, где проблема, если это Behat, селектор CSS или драйвер Sahi.Создайте селектор CSS (первый ребенок) в Behat 3 с драйвером Sahi
Мы только что обновили до Behat 3 и использовали драйвер Sahi (последняя версия с открытым исходным кодом). Мы обнаружили, что любой тест Behat, который использует псевдоэлемент first-child
, теперь, похоже, сломается.
Пример:
Шаг:
And I follow "#the-list tr:first-child .row-title"
(который содержит элемент якорь с классом строки-заголовка на нем, см HTML)
Ошибка:
Link with id|title|alt|text "#the-list tr:first-child .row-title" not found. (Behat\Mink\Exception\ElementNotFoundException)
HTML:
<tbody id="the-list">
<tr id="post-162382" class="post-162382 type-post status-publish format-standard hentry category-uncategorized alternate iedit author-other level-0">
<th class="check-column" scope="row"></th>
<td class="post-title page-title column-title">
<strong>
<a class="row-title" title="Edit “Post Title”" href="https://domain.com"></a>
</strong>
<div class="locked-info"></div>
<div class="row-actions"></div>
<div id="inline_162382" class="hidden"></div>
</td>
CSSSelector.php (переопределение мы использовали с нашим старым Behat, мы оставили этот файл в)
/**
* Makes all of the form field related steps allow CSS selectors.
*/
class CSSSelectorContext extends MinkContext
{
/**
* Finds an element via CSS or fails with a given error
*
* @param $element string A CSS selector string
* @param $error Exception An error to throw in case the element can not be found
* @return object An Element object
*/
protected function findOrFail($element, $error){
$element = $this->getSession()->getPage()->find('css', $element);
if (!isset($element)){
throw $error;
}
return $element;
}
public function clickLink($link) {
try {
parent::clickLink($link);
return;
}catch (Exception $error){
$link = $this->fixStepArgument($link);
$link = $this->findOrFail($link, $error);
$link->press();
}
}
При использовании селектора CSS в консоли Chrome с JQuery он выбирает соответствующий элемент. Я прошел через код и посмотрел на css -> xpath переводы, а затем проверил xpath на html, который создается на сайте, который мы тестируем, и, похоже, он также действителен. Селектор css также работает с драйвером Goutte.
Сформирован XPath:
find(function(){
var count = 0;
while (_sahi._byXPath("("+"\/\/html\/descendant-or-self::*[@id = 'the-list']\/descendant-or-self::*\/*[name() = 'tr' and (position() = 1)]\/descendant-or-self::*\/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' row-title ')]"+")["+(count+1)+"]")) count++;
return count;
})()
descendant-or-self::*[@id = 'the-list']/descendant-or-self::*/*[name() = 'tr' and (position() = 1)]/descendant-or-self::*/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' row-title ')]
//html/descendant-or-self::*[@id = 'the-list']/descendant-or-self::*/*[name() = 'tr' and (position() = 1)]/descendant-or-self::*/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' row-title ')]
Когда я изменить CSS для:
Шаг:
And I follow "#the-list tr .row-title"
Это работает, потому что я считаю, что это просто выбирает первый тр из списка из них во всяком случае, но мы хотим, конечно, иметь возможность использовать первого ребенка.
Благодарим за помощь!
[Этот вопрос github] (https://github.com/Behat/Mink/issues/268), похоже, говорит о том же. Помогает ли это вообще? –
Проблема https://github.com/symfony/symfony/issues/11803 актуальна, но это не имеет смысла, потому что Xpath, который генерируется Symfony, кажется правильным. – sugarwaffle
Вы пробовали «# the-list tr: nth-child (1) .row-title»? –