无法模拟通过链接:方法不允许错误(#405)

时间:2016-06-27 16:05:43

标签: selenium selenium-webdriver yii2 codeception http-status-code-405

我正在为网站撰写验收/功能测试并遇到以下问题。

在网站上有一个菜单:

<ul class="b">
<li ng-repeat="item2 in item.items" class="ng-scope">
  <a href="/persons/personaccount/index" class="ng-binding">Account</a>
</li><li ng-repeat="item2 in item.items" class="ng-scope">
  <a href="/persons/persontype/index" class="ng-binding">Person type</a>
</li><li ng-repeat="item2 in item.items" class="ng-scope">
  <a href="/persons/person/index" class="ng-binding">Person</a>
</li>
</ul>

在普通模式下,我可以自由点击任何项目。 在一个连续的Cept文件中,我可以调用该方法:

$I->click('//*[@class="b"]/li[last()]/a');

然后加载了我需要的页面。

当我使用类似Cest格式(我更喜欢它)时会出现问题。如果我通过授权的方法进行此调用,例如:

public function tryToDoSomething(FunctionalTester $I)
{
    $I->amOnPage('/site/login');

    $I->fillField('#loginform-username','admin');
    $I->fillField('#loginform-password','admin');

    $I->seeElement('button', ['name' => 'login-button']);

    $I->click('#login-form button[type=submit]');

    $I->wait(5);

    $I->cantSee('....', '.error-block');

    ... 
    $I->click('//*[@class="b"]/li[last()]/a'); // <<-----
}

然后页面加载。但是,如果我将此调用移到另一个方法, 在逻辑上更合适的地方,例如:

public function tryToDoSomething(FunctionalTester $I)
{
    $I->amOnPage('/site/login');
    ...
    $I->cantSee('....', '.error-block');

    ...     
}

public function TryToDoAnythingElse(FunctionalTester $I)
{
    ...
    $I->click('//*[@class="b"]/li[last()]/a'); // <<-----
    ...
}

然后,我收到以下错误:

  

不允许的方法(#405)。此网址只能处理   以下请求方法:。上面的错误发生了   Web服务器正在处理您的请求。

     

如果您认为这是服务器错误,请与我们联系。谢谢。

可能是什么原因?我非常感谢这些信息。谢谢大家。

1 个答案:

答案 0 :(得分:0)

虽然解决方案在我看来如下...... 除了标记为protected之外的所有方法,因此它们不会作为测试执行。

然后我从&#34; main&#34;测试方法:

protected function tryToDoSomething(FunctionalTester $I)
{
    $I->amOnPage('/site/login');
    ...
    $I->cantSee('....', '.error-block');

    ...     
}

public function tryToDoAnythingElse(FunctionalTester $I)
{
    tryToDoSomething($I);
    $I->click('//*[@class="b"]/li[last()]/a');
    ...
}

如果我使用这种方法,则不会发生错误。

然后整个测试可以表示为对受保护方法的调用序列:

public function tryToGoThroughTheFlow(FunctionalTester $I) 
{
    $this->tryToA($I);
    $this->tryToB($I);
    $this->tryToC($I);
    $this->tryToD($I);
    ...
}

,其中:

protected function tryToA(FunctionalTester $I) 
{
   ...
}

protected function tryToB(FunctionalTester $I) 
{
   ...
}

等等。虽然错误的原因仍不清楚。我是否发送了不允许类型的请求?