如何运行PHPUnit Selenium测试而不需要为每个函数运行一个新的浏览器窗口?


How do I run a PHPUnit Selenium test without having a new browser window run for each function?

我正在尝试使用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');
        }
    }
?>

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

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

默认为'isolated'

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

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

等等,这将只运行下一个函数,而不需要新的浏览器,但是,如果它在任何测试中的任何地方失败,整个测试将停止,因此反馈不会像单个测试那样好。

在一个函数中创建assetrions,因为这是功能测试。我也是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');
.....
}

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

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

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

手册上写着:

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