如何在使用PHPUnit、Selenium和phpwebdriver进行测试后保持登录状态
我正在尝试使用共享会话运行多个测试,从登录开始如何在使用PHPUnit、Selenium和phpwebdriver进行测试后保持登录状态,php,selenium,selenium-webdriver,phpunit,Php,Selenium,Selenium Webdriver,Phpunit,我正在尝试使用共享会话运行多个测试,从登录开始 <?php class ExampleTest extends PHPUnit_Framework_TestCase { /** * @var \RemoteWebDriver */ protected $webDriver; protected $host = 'http://localhost:4444/wd/hub'; protec
<?php
class ExampleTest extends PHPUnit_Framework_TestCase {
/**
* @var \RemoteWebDriver
*/
protected $webDriver;
protected $host = 'http://localhost:4444/wd/hub';
protected $browser = array (
'browserName' => 'chrome',
'sessionStrategy' => 'shared'
);
public function setUp()
{
$this->webDriver = RemoteWebDriver::create($this->host, $this->browser);
}
public function tearDown()
{
$this->webDriver->quit();
}
然后,我想测试对表行的单击(基于行内的值):
不幸的是,我得到了以下错误:
NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//td[contains(text(), 'TestPortal')]"}
我确信这是由于测试没有使用同一个会话(用户没有登录,因此无法访问/特许权页面),因为如果我在testLogin()函数中包含这两条指令,它可以正常工作
知道我做错了什么吗?我仍然希望能够使用这些“findElement(WebDriverBy::”东西
非常感谢!我使用了Selenium,但我不熟悉PHP,这是tearDown()吗在每个测试之后执行还是在所有测试用例之后执行?您的测试需要是独立的,这样您就可以毫无问题地运行其中一个测试。这意味着对于每个测试,您必须执行登录,完成自己的工作,然后注销。如果我能给您一个建议,请创建一个方法登录,您将在测试中使用它。在这个登录中方法,您将获取元素并与它们交互。每次测试后。“一旦测试方法完成运行,无论成功与否,都会调用另一个名为tearDown()的模板方法”谢谢。你能解释一下为什么独立测试如此重要吗?因为我想测试整个平台,以了解哪些页面被破坏了。顺便说一句,为每个测试添加一个登录函数会使测试执行的时间更长。无论如何,非常感谢你的回答。有几个原因是(某种程度上)链接。首先,你必须能够在不运行其他测试的情况下运行每个测试。当你认为你想测试整个应用程序时,这可能会显得有点奇怪,但在将来,你可能需要进行快速测试,而不想运行所有测试。或者,假设一个测试因为一件小事而失败,你可能无法运行整个应用程序其他测试。当它们独立时,你可以测试整个应用程序并获得测试的实际结果。你仍然可以询问是否需要更多信息。看看那里-->。它可能与你想要创建的框架不完全相同,但它教会了你很多好的实践
public function testFranchiseClick()
{
$this->webDriver->get('http://localhost:8888/public/franchises');
$this->webDriver->findElement(WebDriverBy::xpath("//td[contains(text(), 'TestPortal')]"))->click();
}
NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//td[contains(text(), 'TestPortal')]"}