如何在Behat + Mink中断言页面/标签/窗口标题

时间:2016-11-25 11:36:42

标签: behat mink

我需要为我的测试断言页面标题,这是使用Behat + Mink的标签/窗口标题 我试过getWindowName(),但意识到这不是我要找的功能。

3 个答案:

答案 0 :(得分:4)

您应该使用css的常规查找标题标记,并使用getText()来获取标题。

css应该是:"头衔"

你的解决方案几乎没问题,你需要注意可能的异常,特别是遇到可以阻止你的套件的致命异常。

例如,find()方法将返回一个对象或null,如果返回null并且您在其上使用getText(),则会导致致命例外,您的套房将会停止。

略微改进的方法:

/**
 * @Given /^the page title should be "([^"]*)"$/
 */
public function thePageTitleShouldBe($expectedTitle)
{
    $titleElement = $this->getSession()->getPage()->find('css', 'head title');
    if ($titleElement === null) {
        throw new Exception('Page title element was not found!');
    } else {
        $title = $titleElement->getText();
        if ($expectedTitle !== $title) {
            throw new Exception("Incorrect title! Expected:$expectedTitle | Actual:$title ");
        }
    }
}

改进:

  • 处理可能的致命异常
  • 如果找不到元素,则抛出异常
  • 如果标题不匹配,则
  • 抛出包含详细信息的异常

请注意,您还可以使用其他方法检查标题,例如:striposstrpos或者只是像我一样比较字符串。我更喜欢简单的比较,如果我需要精确的文本或strpos / stripos方法的PHP和我个人,避免常规异常和相关的方法,如preg_match通常有点慢。

你可以做的一个主要改进是有一个方法来等待元素并为你处理异常并使用它而不是简单的查找,当你需要根据元素的存在来决定时,你可以使用它:如果元素存在,请执行此操作..

答案 1 :(得分:0)

谢谢劳达。是的,确实有效。写下面的函数:

/**
     * @Given /^the page title should be "([^"]*)"$/
     */
    public function thePageTitleShouldBe($arg1)
    {
        $actTitle = $this->getSession()->getPage()->find('css','head title')->getText();
        if (!preg_match($arg1, $actTitle)) {
            throw new Exception ('Incorrect title');
        }
    }

答案 2 :(得分:0)

在使用Javascript和history.pushState / replaceState操作标题的情况下,这对我不起作用

以下是适用于Javascript的实现:

  /**
   * @Then /^the title is "([^"]*)"$/
   */
  public function theTitleIs($arg1) {
    $title = $this->getSession()->evaluateScript("return document.title");
    if ($arg1 !== $title) {
      throw new \Exception("expected title '$arg1', got '$title'");
    }
  }