如何在不运行每个函数的新浏览器窗口的情况下运行PHPUnit Selenium测试?

时间:2013-05-24 11:45:40

标签: php unit-testing selenium phpunit

我正在尝试使用PHPUnit运行selenium测试用例。我做的第一件事是尝试登录功能,这是完美的,但我想运行一个函数来检查登录后页面上的信息,但它打开一个新的浏览器,而不是继续在当前的浏览器窗口。这是一个问题的原因是因为页面设置为在窗口关闭时删除登录身份验证,所以如果你使用$ this-> url()转到页面,它会给出我需要登录的错误。这是我的代码,它启动浏览器并运行测试登录表单的功能,然后关闭浏览器,打开一个新的并运行链接检查。这当然会因为身份验证错误而导致错误,因为窗口已关闭。我可以在一个函数中运行所有测试,但这是非常草率的编码,我想避免这种情况。有谁知道如何解决这个问题?

<?php
    class TestMyTest extends PHPUnit_Extensions_Selenium2TestCase {
        public function setUp()
        {
            $this->setBrowser("firefox");
            $this->setBrowserUrl("https://**************************");
        }

        public function testLoginForm()
        {

            $this->url("login.php");
            $this->byLinkText('Forgot your password?');
            $form = $this->byCssSelector('form');
            $this->byName('username')->value('test');
            $this->byName('password')->value('1234');
            $form->submit();
        }


        public function testCheckForMainMenueLinks ()
        {
            $this->url("index.php");
            $this->byLinkText('Home');
            $this->byLinkText('Products');
            $this->byLinkText('About us');
            $this->byLinkText('Contact');
        }
    }
?>

5 个答案:

答案 0 :(得分:7)

要在Selenium2TestCase中共享浏览器会话,您必须在初始浏览器设置中设置sessionStrategy => 'shared'

public static $browsers = array(
    array(
        '...
        'browserName' => 'iexplorer',
        'sessionStrategy' => 'shared',
        ...
    )
);

备选方案(默认)为'isolated'

答案 1 :(得分:4)

Okej所以我猜你可以直接从另一个函数调用这个函数:

public function testOne
{
#code
$this->Two();
}

public function Two()
{
#code
$this->Three();
}

public function Three()
{
#code
}

等等,这将只运行下一个没有新浏览器的功能,但是,如果它在任何测试中的任何地方都失败,整个测试就会停止,这样反馈就不如单个测试好。

答案 2 :(得分:1)

在一个函数中生成断言,因为这是功能测试。 我也是phpunit和selenium的新手,但我成功地测试了所有这样的:

public function testAuth(){  

$this->open('register.php&XDEBUG_SESSION_START=PHPSTORM');
$this->assertTextPresent('Register');
$this->type('name=email', "...");
$this->type('name=firstname', "...");
$this->type('name=lastname', "...");       
$this->type('name=password', "...");
$this->type('name=verifyPassword', "...");
$this->click("reg-butt");
$this->waitForPageToLoad("5000");
$this->assertTextPresent('Profile');
$this->open('logout.php');
$this->assertTextPresent('text from redirect page');
$this->open('login.php');
.....

}

答案 3 :(得分:1)

设置会话共享的一种优雅方式是使用PHPUnit的setUpBeforeClass()方法:

public static function setUpBeforeClass()
{
    self::shareSession(true);
}

答案 4 :(得分:0)

您可以调用PHPUnit_Extensions_SeleniumTestCase :: shareSession(true)来启用浏览器窗口重用。

manual中说:

  

从Selenium 1.1.1开始,包含一个实验性功能,允许用户在测试之间共享会话。唯一支持的情况是在使用单个浏览器时在所有测试之间共享会话。在引导程序文件中调用PHPUnit_Extensions_SeleniumTestCase :: shareSession(true)以启用会话共享。如果没有成功的测试(失败或不完整),会话将被重置;用户可以通过重置cookie或从测试中的应用程序注销(使用tearDown()方法)来避免测试之间的交互。