我想测试每个选定的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);
}
}
}
应该有很多断言,但是只有一个, 如何解决,以便测试可以迭代每个div.select?
每个.select都属于不同的父对象,所以我不能使用.select:nth-child(n)。
答案 0 :(得分:1)
您可以使用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);
}
}
}