使用Behat 3和Mink 1.5的页面对象扩展会抛出异常

时间:2014-08-21 13:51:57

标签: php behat mink pageobjects

我的项目正在运行Behat 2.4Mink 1.4Behat Page Object Extension,此版本我的测试很好,100%通过。

但由于与Browserstack完全集成,现在我正在迁移到Behat 3,Behat 2不支持BrowserStack标记,并且集成很差。

我已经更改了我的作曲家文件并更新了项目,但是当我运行测试时,它会在Page Object Extension上返回一个例外。

To create pages you need to pass a factory with setPageObjectFactory() (RuntimeException)

查看Page Object Docs我看不到有关setPageObjectFatory的任何信息,这不是必需的。 在配置部分中,如果您创建自定义工厂或/和自定义类名称解析程序,则仅指定factory

我的作曲家包含所有依赖项

{
    "require-dev" : {
        "behat/behat" : "master-dev",
        "behat/mink-goutte-driver" : "master-dev",
        "behat/mink-browserkit-driver" : "master-dev",
        "sensiolabs/behat-page-object-extension" : "master-dev",
        "behat/mink-extension" : "master-dev",
        "behat/mink-selenium2-driver" : "master-dev",
        "behat/mink" : "master-dev"
    }
}

我的behat.yml吼叫

default:
  suites:
    default:
      contexts:
        - FeatureContext
        - ProductDetailsContext
        - CartContext
      extensions:
        SensioLabs\Behat\PageObjectExtension:
          namespaces:
            page: [Features\Page]
            element: [Features\Page\Element]
        Behat\MinkExtension:
          sessions:
            my_session:
              browser_stack:
                username: my_username
                access_key: my_password
                capabilities: 
                  browserName: "Chrome"
                  browserVersion: "35"
                  platform: "WIN8"

我的FeatureContext扩展了MinkContext

<?php

use Behat\MinkExtension\Context\MinkContext;

/**
 * Behat context class.
 */
class FeatureContext extends MinkContext
{
}

ProductDetailsContext扩展了PageObjectContext

<?php
use SensioLabs\Behat\PageObjectExtension\Context\PageObjectContext;

/**
 *
 *
 */
class ProductDetailsContext extends PageObjectContext
{
    /**
     * @Given /^I am on product details "([^"]*)"$/
     *
     * @param string $url
     */
    public function iAmOnProductDetails($url)
    {
        $this->getPage("ProductDetails")->open(array("productUrl" => $url));
    }

    /**
     * @Given /^I am at a random product details$/
     */
    public function iAmAtARandomProductDetails()
    {
        $catalog = $this->getPage("Catalog");
        $catalog->open(array('category' => 'calcados-femininos'));
        $catalog->openRandomProduct();
    }

    /**
     * @When /^I select product size$/
     */
    public function iSelectProductSize()
    {
        $this->getPage("ProductDetails")->selectProductSize();
    }

    /**
     * @Then /^I add product to cart$/
     */
    public function iAddProductToCart() {
        $this->getPage("ProductDetails")->addProductToCart();
    }

    /**
     * @Then /^I add product to wishlist$/
     */
    public function iAddProductToWishlist()
    {
        $this->getPage("ProductDetails")->addProductToWishlist();
    }
}

我不知道如何解决这个问题,我需要帮助。

3 个答案:

答案 0 :(得分:2)

问题是因为在Extensions内配置了suites,将Extensions放在suites之外,然后就可以了。

default:
  suites:
    default:
      contexts:
        - FeatureContext
        - ProductDetailsContext
        - CartContext
  extensions:
    SensioLabs\Behat\PageObjectExtension:
      namespaces:
        page: [Features\Page]
        element: [Features\Page\Element]
      Behat\MinkExtension:
        sessions:
          my_session:
            browser_stack:
              username: my_username
              access_key: my_password
              capabilities: 
                browserName: "Chrome"
                browserVersion: "35"
                platform: "WIN8"

答案 1 :(得分:1)

这是一个很长的镜头,但是我们在这里......在之前的Behat版本中,您使用了单/根上下文,它必须具有扩展PageObjectContext。它必须是初始化的唯一/第一个上下文,它也是初始化页面工厂和页面本身的正确上下文。现在您有多个上下文,合乎逻辑的步骤是确保它们都按the docs here中的说明实现SensioLabs\Behat\PageObjectExtension\Context\PageObjectAwareInterface

我也没有在扩展名下看到'SensioLabs \ Behat \ PageObjectExtension'条目。我不认为Behat会在没有列表的情况下初始化扩展(它不能随便猜测它必须加载,对吧?)。这可能是你应该改变的第一件事。基于the docs about configuration,并按照默认约定,一切都应该有效。

答案 2 :(得分:0)

尝试安装

composer require --dev --ignore-platform-reqs sensiolabs/behat-page-object-extension:^2.0

在作曲家中我添加了--ignore-platform-reqs,因为我使用php 7. *作为我的作品