我有一个与Behat 2.4
, Mink 1.4
和Behat 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