5

我想测试一个具有动态菜单结构的网站。我想遍历所有菜单项并在每个页面上运行相同系列的测试。我们正在谈论 100 多个页面,这些页面会定期更改。

我想用 behat 或 codeception 来做到这一点。

有人知道如何做到这一点吗?

4

2 回答 2

1

我有一个类似的用例,我想访问给定站点地图的所有页面,以确保没有任何死链接。我有办法动态生成一系列步骤,然后由 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"

整个要点在这里https://gist.github.com/fudriot/6028678

于 2013-07-18T12:04:44.193 回答
1

将 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;
}
于 2013-05-13T23:35:46.997 回答