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


Page Object Extension with Behat 3 and Mink 1.5 throws an Exception

我有一个与Behat 2.4, Mink 1.4Behat Page Object Extension一起运行的项目,这个版本我的测试很好,100%通过。

但是现在我迁移到Behat 3由于与Browserstack的完全集成,Behat 2不支持Browserstack标志和集成很差。

我已经改变了我的编写器文件,我更新了项目,但是当我运行测试时,它在Page Object Extension上返回一个异常。

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

看页面对象文档我没有看到任何关于setpageobjectatory,这是不需要的。在配置部分,只有在创建自定义工厂或/和自定义类名解析器时才指定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"
    }
}

和我的行为。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"

My 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();
    }
}

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

这个问题是因为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"

这是一个很长的镜头,但是我们开始吧…在以前的Behat版本中,你使用了单一/根上下文,它必须扩展PageObjectContext。它必须是唯一/第一个被初始化的上下文,它也是初始化页面工厂和页面本身的正确上下文。现在您有了多个上下文,合乎逻辑的步骤是确保它们都像这里的文档中所说的那样实现SensioLabs'Behat'PageObjectExtension'Context'PageObjectAwareInterface

我也没有在扩展项下看到'SensioLabs'Behat'PageObjectExtension'条目。我不认为Behat会初始化扩展,没有它在列表中(它不能只是随机猜测它必须加载,对吗?)。这可能是你首先应该改变的。根据有关配置的文档,如果您遵循默认约定,那么一切都应该正常。

尝试安装

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

在编写器中,我添加了——ignore-platform-reqs,因为我使用php 7。* for my works