单击此 class 页面上的第二个 link 的 XPath

XPath to click 2nd link on page with this class

在验收测试中,我尝试单击给定地址的 .fa-trash-o 图标。为了简化事情,我一直在尝试 select 页面上具有给定 class 名称的第二个元素。

我尝试了以下几种变体,但都没有成功。

$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>

我怎样才能点击那个删除按钮?

您遇到了与 // 运算符定义方式相关的常见错误。 XPath 表达式

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

其实就是

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

[2] 适用于 child:: 步骤而不是后代搜索,因此它将 select 每个 a 元素,即第二个 fa-trash-o link 在其各自的父项下。这什么也找不到,因为在任何给定的 div 中只有一个这样的 a。如果加上括号:

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

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