write ahead log

ロールフォワード用

Laravel Duskで要素数を数えたり現れる順序をテストしたかった

直接的なアサーションがなかったから作った. TestCaseでuseして使うtraitにしてみた.

たぶんMacroを用意するのが正当なアプローチだと思うんだけど, 調べるの面倒で雑に書いてしまった.

<?php

namespace Tests;

use Facebook\WebDriver\WebDriverBy;

trait MyDuskAssertions
{
    /**
     * $selector要素が$count個あるかをassertionする
     * 
     * Usage:
     *   $this->myAssertElementsCountIs($browser, 'tbody>tr', 1);
     */
    public function myAssertElementsCountIs($browser, $selector, $count)
    {
        $elements = $browser->driver->findElements(WebDriverBy::cssSelector($selector));
        $this->assertCount($count, $elements);
    }

    /**
     * $textsが$selector内で順番に現れるかassertionする
     *
     * Usage:
     *   $this->myAssertSeeInOrder($browser, 'tbody td', ['No.1', 'No.2', 'No.3']);
     */
    public function myAssertSeeInOrder($browser, $selector, $texts)
    {
        $targets = $texts;
        $elements = $browser->driver->findElements(WebDriverBy::cssSelector($selector));
        $msg_texts = implode(',', $texts);

        foreach ($elements as $e) {
            $expect = reset($targets);

            if ($e->getText() == $expect || $e->getAttribute('value') == $expect) {
                array_shift($targets);
            }
        }
        $this->assertEmpty($targets, "'$msg_texts' were not see in order in '$selector'.");
    }
}