Расширение объекта страницы с 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();
    }
}

Я не знаю, как это решить, и мне нужна помощь.

Author: Thiago França, 2014-08-21

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"
 2
Author: Thiago França, 2014-08-26 13:47:04

Это долгий путь, но мы начинаем… В предыдущей версии Behat вы использовали одиночный/корневой контекст, который должен был иметь расширенный PageObjectContext. Должно быть, это был единственный/первый контекст, который был инициализирован, это также был правильный контекст для инициализации фабрики страниц и самих страниц. Теперь у вас есть несколько контекстов, логичным шагом было бы убедиться, что все они реализуют SensioLabs\Behat\PageObjectExtension\Context\PageObjectAwareInterface, как сказано в документах здесь.

Я также не вижу записи "SensioLabs\Behat\pageobjectextension" в разделе расширения. Я не думаю, что Behat инициализировал бы расширение, если бы его не было в списке (он не может просто случайно догадаться, что оно должно быть загружено, верно?). Это, вероятно, первое, что вам следует изменить. Основываясь на документах о конфигурации и учитывая, что вы следовали соглашению по умолчанию, все должно работать.

 1
Author: Ian Bytchek, 2014-08-25 22:12:17

Попробуйте установить

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

В композиторе я добавил --ignore-platform-reqs, потому что я использую php 7.* для своих работ

 0
Author: Noel Barrera, 2017-03-26 21:38:40