для каждого элемента с поведением или кодовым восприятием

Я хочу протестировать веб-сайт с динамической структурой меню. Я хочу просмотреть все элементы меню и запустить одну и ту же серию тестов на каждой странице. Мы говорим о 100+ страницах, которые регулярно меняются.

Я хотел бы сделать это либо с поведением, либо с кодированием.

Кто-нибудь знает, как это сделать?


person Jeroen    schedule 11.05.2013    source источник


Ответы (2)


При использовании Behat с Mink вы можете получить элементы меню с помощью findAll(), а затем выполнить итерацию по ним:

/**
 * @When /^I run my test series for all menu items$/
 */
public function iRunMyTestSeriesForAllMenuItems() {

    $result = TRUE;
    $this->getSession()->visit('http://www.example.com/');
    $links = $this->getSession()->getPage()->findAll('css', '#menu ul li a');
    foreach ($links as $link) {
        $url = $link->getAttribute('href');
        if (FALSE === $this->yourTestHere($url)) {
            $result = FALSE;
        }
    }

    return $result;
}
person stmllr    schedule 13.05.2013
comment
Вместо возврата true/false было бы лучше просто создать исключение. Behat расценит это как сбой шага. - person Jakub Zalas; 05.06.2013

У меня был аналогичный случай использования, когда я хотел посетить все страницы данной карты сайта, чтобы убедиться, что нет мертвых ссылок. У меня был подход к динамическому созданию массива шагов, который затем возвращается и обрабатывается Behat. Мне пришлось добавить искусственный шаг «Я распечатываю страницу», чтобы убедиться, что я вижу на консоли, какая страница в данный момент тестируется.

/**
 * @Then /^I should access all pages of site map "([^"]*)"$/
 */
public function iShouldAccessAllPagesOfSiteMap($selector) {

    $page = $this->getSession()->getPage();
    $locator = sprintf('#%s a', $selector);
    $elements = $page->findAll('css', $locator);

    $steps = array();
    foreach ($elements as $element) {
        /** @var \Behat\Mink\Element\NodeElement $element */
        $steps[] = new Behat\Behat\Context\Step\When(sprintf('I print out page "%s"', $element->getAttribute('href')));
        $steps[] = new Behat\Behat\Context\Step\When(sprintf('I go to "%s"', $element->getAttribute('href')));
        $steps[] = new Behat\Behat\Context\Step\Then('the response status code should be 200');
    }
    return $steps;
}

/**
 * @When /^I print out page "([^"]*)"$/
 */
public function iPrintOutThePage($page) {
    $string = sprintf('Visiting page ' . $page);
    echo "\033[36m    ->  " . strtr($string, array("\n" => "\n|  ")) . "\033[0m\n";
}

Тогда мой сценарий выглядит следующим образом:

Scenario: my website has no "dead" pages
Given I am on "/examples/site-map/"
Then I should access all pages of site map "c118"

Весь Gist находится здесь https://gist.github.com/fudriot/6028678.

person Fabien    schedule 18.07.2013