gpt4 book ai didi

xpath - 使用 Sahi 驱动程序使 CSS 选择器(第一个 child )在 Behat 3 中工作

转载 作者:行者123 更新时间:2023-12-03 15:24:32 26 4
gpt4 key购买 nike

我只是想知道您是否可以指出问题出在哪里,是 Behat、CSS 选择器还是 Sahi 驱动程序。

我们刚刚升级到 Behat 3 并且正在使用 Sahi 驱动程序(最新的开源版本)。我们发现任何使用伪元素 first-child 的 Behat 测试现在好像坏了。

例子:

步:

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

(其中包含一个带有行标题类的 anchor 元素,请参阅 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();
}
}

当在带有 jquery 的 Chrome 控制台中使用 css 选择器时,它会选择适当的元素。我浏览了代码并查看了 css -> 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 ,但我们当然希望能够使用 first-child 。

谢谢你的帮助!

最佳答案

很抱歉在聚会上迟到了

您的问题是 Minks 自己的步骤“我遵循”/“clickLink”不接受以下内容:

  • ID的“#”
  • 除了 ID、文本、标题或替代值之外的任何内容。

  • 我建议使用“单击”步骤而不是“跟随”,如下所示:
        /**
    * @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
    这也是我犯的一个错误,这是我们当时决定的解决方案,我们不必回头。

    关于xpath - 使用 Sahi 驱动程序使 CSS 选择器(第一个 child )在 Behat 3 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27153971/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com