使用Sahi Driver在Behat 3中使CSS Selector(第一个孩子)工作

时间:2014-11-26 16:16:47

标签: xpath css-selectors behat mink sahi

我只是想知道你是否可以指出问题在哪里,如果它是Behat,CSS选择器或Sahi驱动程序。

我们刚刚升级到Behat 3并使用Sahi Driver(最新的开源版本)。我们发现任何使用伪元素first-child的Behat测试现在似乎都破裂了。

示例:

步骤:

And I follow "#the-list tr:first-child .row-title"

(其中包含一个带有类行标题的锚元素,请参阅HTML)

错误:

  

链接id | title | alt | text"#the-list tr:first-child .row-title"未找到。 (贝哈特\水貂\异常\ 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();
        }
    }

使用jquery在Chrome控制台中使用css选择器时,它会选择适当的元素。我查看了代码并查看了css - &gt; xpath转换然后根据我们正在测试的网站上生成的html验证xpath,它似​​乎也是有效的。 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"

它有效,因为我认为它只是从它们的列表中选择第一个tr,但我们希望能够使用第一个孩子。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

抱歉迟到了

你的问题在于Minks自己的步骤&#34;我关注&#34; /&#34; clickLink&#34;不接受以下内容:

  1. &#34;#&#34; s代表ID
  2. ID,文本,标题或替代值以外的任何内容。
  3. 我建议使用&#34;点击&#34;步骤而不是&#34;关注&#34;,类似这样:

        /**
         * @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

    这也是我犯的错误,这是我们当时决定的解决方案,我们不得不回头看看。