5

我想检查这样的事情:

<?php

$I->amOnPage('/go/google');
$I->seeCurrentUrlEquals('http://google.com');

但我得到错误:

Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'http://google.com'
+''

Scenario Steps:
2. I see current url equals "http://google.com"
1. I am on page "/go/google"

想法只是检查用户是否被重定向到外部资源。

4

6 回答 6

4

不幸的是, CodeceptionseeCurrentUrlEquals()seeCurrentUrlMatches()方法命名错误,因为它们不允许对整个 URL 进行断言,而只能对 URI 部分进行断言。

我通过在 Helper 类中声明以下方法解决了这个问题:

public function seeFullCurrentURLEquals($value)
{
    return ($this->getModule('PhpBrowser')->client->getHistory()->current()->getUri() == $value);
}

然后,在场景中,您可以简单地执行以下操作:

$I->seeFullCurrentUrlEquals('google.com');
于 2014-07-16T16:54:17.183 回答
2

我会通过换掉第 2 行来改进@rickroyce 的评论

$I->wait(2);

有类似的东西

$I->waitForElement('#gbqfq', 30);

它等待谷歌搜索输入字段,并且比假设 2 秒就足以加载页面更健壮。

完整的例子是

<?php

$I->amOnPage('/go/google');
$I->waitForElement('#gbqfq', 30);
$I->seeCurrentUrlEquals('http://google.com');

(通常它会将添加作为评论,但由于我没有足够的声誉,这是一个答案:))

于 2014-07-12T23:12:32.797 回答
2

正如@gopherIT 提到的,Codeception 在使用这些功能时不会检查 URL 的域名部分。

如果您使用的是phpBrowser,这里有几个选项。


  1. 我编写了两个函数verifyRedirect()verifyNoRedirect()可以用于此目的。您只需弹出里面的代码_support/Helper/Acceptance.php

    然后可以这样测试...

    $I->verifyRedirect('http://www2.ames.net.au/', 'http://www.ames.net.au/', 301);
    

    查看代码:https ://gist.github.com/SimonEast/b550e04300ac56cb5ac8eea704fccdfa


  1. GaryJones 还为测试重定向组合了另一个(稍微复杂一点)变体,并将其发布在 Github 上:

    https://gist.github.com/GaryJones/284eea905cff882cc7cb

    它允许您运行这样的测试...

    $I = new RedirectsTester($scenario);
    $I->wantTo('check 301 redirects are working');
    
    // First, test /login/ page gets rewritten to https://
    $I->seePermanentRedirectToHttpsFor('login/');
    $I->seePermanentRedirectToHttpsFor('login/?redirect_to=foo');
    
    // For all other redirects, a Location header is sent, so we stop the redirect
    // and just check that header instead.
    $I->followRedirects(false);
    
    // External
    $I->sendHead('facebook');
    $I->seePermanentRedirectTo('https://www.facebook.com/DanielsTrading');
    
    // Internal link
    $I->sendHead('don-debartolo/access');
    $I->seePermanentRedirectTo('ddebartolo/#account');
    

    如有必要,查看他的源代码可能有助于进一步定制。

于 2016-08-01T07:08:02.697 回答
1

这是一段可以提供帮助的代码:

$uri_to_redirect = '/use_stackoverflow';
$redirected_to_uri = '/love_stackoverflow';

$I->wantToTest( 'if rediecting works well from : '.$uri_to_redirect.' to : '.$redirected_to_uri );
$I->amOnUrl( $mydomain.$uri_to_redirect );
$I->seeCurrentUrlEquals( $redirected_to_uri );

您需要牢记“seeCurrentUrlEquals”验证的是 URI,而不是 URL。

问候

于 2017-12-19T11:35:23.057 回答
0

您想使用哪种浏览器?大多数浏览器需要一些时间来解释重定向。访问站点“/go/google”后,测试立即运行 url 检查,这可能比浏览器执行重定向更快。再给它一点时间。

尝试:

<?php

$I->amOnPage('/go/google');
$I->wait(2);
$I->seeCurrentUrlEquals('http://google.com');

亲切的问候

于 2014-07-12T22:12:16.823 回答
-1

检查响应代码不是更好吗?

$I->amOnPage('/go/google');
$I->seeResponseCodeIs(302);
$I->seeHttpHeader('Location', 'http://google.com');
于 2014-07-15T08:47:20.970 回答