2014-11-26 3 views
9

Мне просто интересно, можете ли вы указать, где проблема, если это 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" 

Это работает, потому что я считаю, что это просто выбирает первый тр из списка из них во всяком случае, но мы хотим, конечно, иметь возможность использовать первого ребенка.

Благодарим за помощь!

+1

[Этот вопрос github] (https://github.com/Behat/Mink/issues/268), похоже, говорит о том же. Помогает ли это вообще? –

+0

Проблема https://github.com/symfony/symfony/issues/11803 актуальна, но это не имеет смысла, потому что Xpath, который генерируется Symfony, кажется правильным. – sugarwaffle

+0

Вы пробовали «# the-list tr: nth-child (1) .row-title»? –

ответ

0

Извините за опоздание на партию

Ваша проблема здесь состоит в том, что норка собственный шаг «Я следую»/«clickLink» не принимает следующие:

  1. «#» S для идентификаторов
  2. Все, кроме идентификатора, текста, названия или альтернативного значения.

Я предлагаю использовать «щелчок на» шаг вместо «следовать», что-то вроде этого:

/** 
    * @Then /^(?:|I)click (?:|on)(?:|the)"([^"]*)"(?:|.*)$/ 
    */ 
    public 
    function iClickOn($arg1) 
    { 
     $findName = $this->getSession()->getPage()->find("css", $arg1); 
     if (!$findName) { 
      throw new Exception($arg1 . " could not be found"); 
     } else { 
      $findName->click(); 
     } 
    } 

Вы с помощью CSS здесь, что позволит, чтобы это было написано :

Then I click on the "#the-list tr:first-child .row-title" link

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