Расширение объекта страницы с Behat 3 и норкой 1.5 создает исключение
У меня есть проект, работающий с 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)
Просматривая Документы объекта страницы Я ничего не вижу что касается 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"
}
}
И мое поведение.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 answers
Проблема в том, что 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.* для своих работ