断言每个选定的 div 元素

assert every selected div element

我想测试每个 selected div,但它只测试第一个 select 元素。

这是DOM:

<div>
    <div>
        <div>
            <div class="select" [datetime="20190101"]>
                <div class="data">{{data}}</div>
                <div class="other"></div>
            </div>
        </div>
    </div>

    <div>
        <div>
            <div class="select" [datetime="20190102"]>
                <div class="data">{{data}}</div>
                <div class="other"></div>
            </div>
        </div>
    </div>

    <!-- and many of them -->
</div>

这是我的测试:

/** @test */
public function every_data_should_match()
{
    $this->browse(function (Browser $browser) {
        $browser->visit('/page');

        $browser->whenAvailable('div.select', function ($div) {
            $datetime = $div->attribute('div.data', 'datetime');
            $expected_data = User::where('datetime', $datetime)->first()->data;

            $data = $div->getAttribute('outerHTML');

            $this->assertSame($expected_data, $data);
        }
    }
}

There should have many assertions, but there is only one, how to fix so the testing would iterate every div.select?

每个 .select 属于不同的父级,所以我不能使用 .select:nth-child(n).

您可以使用 elements():

/** @test */
public function every_data_should_match()
{
    $this->browse(function (Browser $browser) {
        $browser->visit('/page');

        $browser->waitFor('div.select');

        foreach ($browser->elements('div.select') as $select) {
            $datetime = $select->findElement(WebDriverBy::cssSelector('div.data'))->getAttribute('datetime');
            $expected_data = User::where('datetime', $datetime)->first()->data;

            $data = $select->getAttribute('outerHTML');

            $this->assertSame($expected_data, $data);
        }
    }
}