Create own PageObject

As a simple example we will create a PageObject for the contact page. Run the following command from inside the module Tests directory (<vendor_name>/<module_name>/Tests):

<shop_dir>/vendor/bin/codecept generate:pageobject ContactPage

The empty <vendor_name>/<module_name>/Tests/Codeception/_support/Page/ContactPage.php PageObject will be created.

<?php
namespace MyVendor\MyModule\Tests\Codeception\Page;

class ContactPage
{
    // include url of current page
    public static $URL = '';

    /**
     * Declare UI map for this page here. CSS or XPath allowed.
     * public static $usernameField = '#username';
     * public static $formSubmitButton = "#mainForm input[type=submit]";
     */

    /**
     * Basic route example for your current URL
     * You can append any additional parameter to URL
     * and use it in tests like: Page\Edit::route('/123-post');
     */
    public static function route($param)
    {
        return static::$URL.$param;
    }
}

We adapt this ContactPage to extend from OxidEsales\Codeception\Page\Page and it uses the OXID Codeception Translator module. Then we need to figure out all CSS or XPath locators we will need and assemble a method sendContactForm which takes the form data as input and returns the contact page in the state from after contact form is sent.

<?php

namespace MyVendor\MyModule\Tests\Codeception\Page;

use OxidEsales\Codeception\Page\Page;
use OxidEsales\Codeception\Module\Translation\Translator;

class ContactPage extends Page
{
    // include url of current page
    public $URL = '/en/contact';

    public $userFirstName = 'editval[oxuser__oxfname]';

    public $userLastName = 'editval[oxuser__oxlname]';

    public $userEmail = 'editval[oxuser__oxusername]';

    public $messageSubject= 'c_subject';

    public $messageBody= 'c_message';

    public $sendContact = "//button[contains(., '%s')]";

    public $salutationSelection = "//button[@title='%s']";

    public $salutationValue = "//li[@data-original-index='%s']";

    /**
     * @param string $userFirstName
     * @param string $userLastName
     * @param string $userEmail
     * @param string $subject
     * @param string $body
     *
     * @return $this
     */
    public function sendContactForm($userFirstName, $userLastName, $userEmail, $subject, $body)
    {
        $I = $this->user;

        $this->selectSalutation();
        $I->fillField($this->userFirstName, $userFirstName);
        $I->fillField($this->userLastName, $userLastName);
        $I->fillField($this->userEmail, $userEmail);
        $I->fillField($this->messageSubject, $subject);
        $I->fillField($this->messageBody, $body);
        $I->click(sprintf($this->sendContact, Translator::translate('SEND')));
        $I->waitForPageLoad();

        return $this;
    }

    /**
     * Select salutation.
     */
    private function selectSalutation()
    {
        $locator = sprintf($this->salutationSelection, Translator::translate('DD_CONTACT_SELECT_SALUTATION'));

        $I = $this->user;
        $I->seeElement($locator);
        $I->click($locator);
        $I->click(sprintf($this->salutationValue, 1));
    }
}

Here we use this Contact PageObject in a test. Contact form is sent and test asserts, that we see the correct thank you message.

public function sendContactFormSuccess(AcceptanceTester $I)
{
    $I->wantToTest('sending a contact message');

    $contactPage = new \MyVendor\MyModule\Tests\Codeception\Page\ContactPage($I);
    $I->amOnPage($contactPage->URL);
    $contactPage->sendContactForm('Max', 'Muster',  '[email protected]', 'subject', 'body');

    $I->see(Translator::translate('DD_CONTACT_THANKYOU1'));
}