XPath单击此类的页面上的第二个链接

时间:2015-05-20 12:10:34

标签: xpath codeception

在验收测试中,我尝试点击指定地址的.fa-trash-o图标。为简化起见,我一直在尝试使用给定的类名选择页面上的第二个元素。

我已经尝试了以下几种变体而没有运气。

$I->click(\Codeception\Util\Locator::find('a', ['class' => 'fa fa-trash-o']).'[2]');

$I->click('//a[contains(@class,"fa-trash-o")][2]');

这是我的模板:

            <div class="grid simple address-card">
                <div class="grid-title no-border">
                    <h4>{{ $address->name }}</h4>
                    <div class="tools">
                        {!! Form::open(['url' => '/account/address/'.$address->id, 'method' => 'delete']) !!}
                            <a href="/account/address/{{ $address->id }}/edit" class="fa fa-edit"></a>
                            <a onclick="$(this).closest('form').submit();" class="fa fa-trash-o"></a>
                        {!! Form::close() !!}
                    </div>
                </div>
                <div class="grid-body no-border">
                    @include('partials.address')
                </div>
            </div>

如何点击该删除按钮?

1 个答案:

答案 0 :(得分:2)

您正在绊倒与定义//运算符的方式相关的常见错误。 XPath表达式

//a[contains(@class,"fa-trash-o")][2]

实际上意味着

/descendant-or-self::node()/child::a[contains(@class,"fa-trash-o")][2]

[2]适用于child::步骤而不是后代搜索,因此它会选择每个a元素,该元素是其各自父级下的第二个fa-trash-o链接。这找不到任何内容,因为在任何给定的a中只有一个div。如果你添加括号:

(//a[contains(@class,"fa-trash-o")])[2]

然后它将在整个文档中选择第二个fa-trash-o - [2]现在适用于(...)表达式的整个结果,而不仅仅是最后一步。