Behat登录表单始终会触发无效凭据

时间:2016-09-15 09:44:31

标签: symfony selenium tdd behat mink

我正在尝试使用Behat进行登录验证步骤。 我正在清理数据库并在测试开始之前执行Fixture加载程序,以便用户在数据库中(我检查了这个并且它是正确的)。 由于某些原因,在输入填充后(使用正确的数据)提交失败并且凭据无效。如果我在打开的浏览器的同一个打开会话上再次手动输入数据(用户名和密码),则可以正常工作。 查看底部的更新以获取解决方案

  

特征

Feature: Login to application
  In order to access admin area
  I need to login as an administrator

  @javascript
  Scenario Outline: Login as <administrator>
    When I am logged in as an administrator with <administrator> credentials
    Then I wait for "10" seconds
...

    Examples:
      | administrator |
      | admin         |
  

LoginContext的

use SensioLabs\Behat\PageObjectExtension\Context\PageObjectContext;
use Behat\Behat\Context\Context;

require_once __DIR__.'/Resources/Users/ymlParser/UserCredentialsParser.php';

/**
 * Class LoginContext
 */
class LoginContext extends PageObjectContext implements Context
{

    /**
     * @param $administrator
     *
     * @When /^I am logged in as an administrator with ([^"]*) credentials$/
     */
    public function iAmLoggedInAsAnAdministrator($administrator)
    {
        $this->getPage('Login Page')->open();
        $this->getPage('Login Page')->enterLoginDetails(UserCredentialsParser::load($administrator));
        $this->getPage('Login Page')->submitLoginForm();

        //$this->getPage('Login Page')->showLoginSuccessful();
        //$this->getPage('Login Page')->isLoggedInUserAdmin(true);
    }
}
  

UserCredentialParser

require_once __DIR__.'/../../../../../../vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Yaml\Parser;
use Symfony\Component\Yaml\Exception\ParseException;

/**
 * Class UserCredentialsParser
 */
class UserCredentialsParser
{    
    /**
     * @param $fileName
     *
     * @return null|stdClass
     */
    public static function load($fileName)
    {
        $oUser    = null;
        $filePath = __DIR__.'/../usersCredentials/'.$fileName.'.yml';

        if (file_exists($filePath)) {
            try {
                $userData = Yaml::parse(file_get_contents($filePath));

                $oUser           = new stdClass();
                $oUser->username = $userData['username'];
                $oUser->password = $userData['password'];
            } catch (ParseException $e) {
                printf("Unable to parse YAML string %s", $e->getMessage());
            }
        }

        return $oUser;
    }
}
  

登录页面

namespace Page;

use SensioLabs\Behat\PageObjectExtension\PageObject\Page;

/**
 * Class LoginPage
 * @package Page
 */
class LoginPage extends Page
{
    protected $path = '/login';

    /**
     * @param $oUser
     *
     * @return mixed
     */
    public function enterLoginDetails($oUser)
    {
        return $this->getElement('Login Form')->enterLoginDetails($oUser);
    }

    /**
     * Submit registration form
     *
     * @return mixed
     */
    public function submitLoginForm()
    {
        return $this->getElement('Login Form')->submitLoginForm();
    }    
}
  

登录表格

namespace Page\Element;

use SensioLabs\Behat\PageObjectExtension\PageObject\Element;

/**
 * Class LoginForm
 * @package Page\Element
 */
class LoginForm extends Element
{
    /**
     * @var string
     */
    protected $selector = 'form';

    /**
     * Fill up the login form
     *
     * @param $oUser
     */
    public function enterLoginDetails($oUser)
    {
        $this->fillField('_username', $oUser->username);
        $this->fillField('_password', $oUser->password);
    }

    /**
     * Submit registration form button
     */
    public function submitLoginForm()
    {
        $this->pressButton('_submit');
    }
}

更新 问题是,对于任何类型的自由文本,在输入框中的文本之后插入了一个选项卡(可能是由驱动程序 - 在我的情况下为chrome)。当我切换到Firefox时,它没有任何问题,并且没有添加额外的空格。

2 个答案:

答案 0 :(得分:1)

问题在于,对于任何类型的自由文本,在输入框中的文本之后插入了一个选项卡(可能是由驱动程序 - 在我的情况下为chrome)。当我切换到Firefox时,它没有任何问题,并且没有添加额外的空格。

更新:至于 2016年11月2日我更新了最新的CHROME驱动程序,它似乎按预期工作。

答案 1 :(得分:1)

我已经将Chrome驱动程序更新到目前2.24的最新版本,它解决了我的问题。