使用phpunit& amp ;;测试多个浏览器的代码facebook的php-webdrivers

时间:2014-12-31 18:15:37

标签: php selenium phpunit

我正在使用facebook的php-webdrivers for selenium来实现我网站的集成测试。我正在使用phphunit来运行我的测试并将我的代码包装在phpunitframework_testcase扩展类中:

class WebTest extends PHPUnit_Framework_TestCase
{
    /**
     * @var \RemoteWebDriver
     */
    protected $driver;
    protected $url='http://example.com';
    protected $screenShotDirectoryPath  =   '/screenshots/';


    /**
     * @BeforeMethod
     */
    protected function setUp()
    {
        try{
            $capabilities = array( WebDriverCapabilityType::BROWSER_NAME=>WebDriverBrowserType::FIREFOX );
            $this->driver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities, 5000);
        } catch (Exception $e){
            echo $e->getMessage();
        }
    }

    /**
     * @AfterMethod
     */
    public function tearDown()
    {
        $this->driver->close();
    }

    public function testImageUpload()
    {
        $errorSnaps='';
        $myBrowserDriver    =   $this->driver;

        //open the url
        $myBrowserDriver->get($this->url);
        try{
            //get email field in login page
            $emailField =   $myBrowserDriver->findElement(WebDriverBy::id('email'));
            //check if the field is displayed
            if(!$emailField->isDisplayed()) {
                try {
                    $errorSnaps = $this->takeScreenshot();
                    $this->errorLogs[] = "The email input Element is not present, a screen-shot of the error has been placed here --> " . $errorSnaps;
                } catch (Exception $e){
                    $this->errorLogs[]  =   $e->getMessage();
                }
            }
        } catch (NoSuchElementException $nse){
            try {
                $errorSnaps = $this->TakeScreenshot();
                $this->errorLogs[] = "The email field on ".$this->driver->getCurrentURL()." not found , a screen-shot for the error has been placed here -->" . $errorSnaps;
            }catch (Exception $e){
                $this->errorLogs[]=$e->getMessage();
            }
         }
     }

php-webdrivers文档建议使用这种方式初始化浏览器驱动程序

$capabilities=array(
    \WebDriverCapabilityType::BROWSER_NAME=>WebDriverBrowserType::FIREFOX
);
$this->driver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities, 5000);

但是没有提供一种机制来初始化多个浏览器驱动程序来运行我的测试只有一个测试文件意味着考虑到上面的代码我必须为所有这些浏览器制作不同的副本并且只有一个行代码差异意味着我想要运行上面的测试铬,然后我必须改变

的行
$capabilities=array(\WebDriverCapabilityType::BROWSER_NAME=>WebDriverBrowserType::FIREFOX);

$capabilities=array(\WebDriverCapabilityType::BROWSER_NAME=>WebDriverBrowserType::CHROME);

并将该代码与上面所有相同的代码保存在另一个文件中并运行我的测试套件。正如您所看到的,这不是实现我的测试和代码重用性的最佳方式。


我遇到了两个选项:

  1. 从发送浏览器名称的终端传递参数,其参数为phpunit brName=chrome,并通过$_SERVER['brName']获取。每次我想为任何其他浏览器运行测试时,我仍然需要输入。
  2. 我在phpunit网站上看​​到了下面的TestDecorator课程,这看起来像是一种更常规的方式来实现我正在做的事情但却无法弄清楚我将如何使用它来运行我的测试。
  3. 我应该在哪里放置代码以便检测并运行它?每次我尝试运行下面的示例代码时都表示没有执行任何测试。如果我有下面的样品测试功能,我怎么能用testdecorator作为基类运行它4次?

    样品测试:

    public function sampleTest(){
        $this->assertTrue(TRUE);
    }
    

    Test Decorator类:

    require_once 'PHPUnit/Extensions/TestDecorator.php';
    
    class PHPUnit_Extensions_RepeatedTest extends PHPUnit_Extensions_TestDecorator
    {
        private $timesRepeat = 1;
    
        public function __construct(PHPUnit_Framework_Test $test, $timesRepeat = 1)
        {
            parent::__construct($test);
    
            if (is_integer($timesRepeat) &&
                $timesRepeat >= 0) {
                $this->timesRepeat = $timesRepeat;
            }
        }
    
        public function count()
        {
            return $this->timesRepeat * $this->test->count();
        }
    
        public function run(PHPUnit_Framework_TestResult $result = NULL)
        {
            if ($result === NULL) {
                $result = $this->createResult();
            }
    
            for ($i = 0; $i < $this->timesRepeat && !$result->shouldStop(); $i++) {
                $this->test->run($result);
            }
    
            return $result;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

我没有朝着正确的方向实现这个场景我不应该使用testdecorator类,但是更好的方法就是这样。

  1. 通过cmd-line / terminal设置环境变量 ({unix} export BROWSER_REQUESTED=chrome和(Windows)set BROWSER_REQUESTED=chrome,或者您可以使用以下代码创建.sh文件 export BROWSER_REQUESTED=chrome && phpunit并通过cmd-line运行它。

  2. 创建一个BrowserFatory类,该类侦听环境变量并启动所请求浏览器类型的驱动程序。

  3. 创建尽可能多的.sh个文件来运行测试所需的浏览器,我已经添加了下面的代码以便更具描述性。

    WebTest.php

    class WebTest extends PHPUnit_Framework_TestCase
    {
        /**
         * @var \RemoteWebDriver
         */
        protected $driver;
        protected $url='http://example.com';
        protected $screenShotDirectoryPath  =   '/screenshots/';
    
    
        /**
         * @BeforeMethod
         */
        protected function setUp()
        {
            try{
                $this->driver = BrowserFactory::drivers();
            } catch (Exception $e){
                echo $e->getMessage();
            }
        }
    }
    

    <强> BrowserFactory.php

    class BrowserFactory
    {
        public static function drivers()
        {
            switch ($_SERVER['BROWSER_REQUESTED']) {
                case 'chrome':
                    return self::createChrome();
                    break;
                case "ie":
                    throw new Exception('Not implemented');
                    break;
    
                case 'firefox':
                default:
                    return self::createFirefox();
                    break;
            }
        }
    
        public static function createChrome()
        {
            putenv("webdriver.chrome.driver=/path/to/chromedriver");
    
            $service = ChromeDriverService::createDefaultService();
            $service->start();
    
            return ChromeDriver::start(DesiredCapabilities::chrome(), $service);
        }
    
        public static function createFirefox()
        {
            // these are just constants defined in bootstrap.php
            $seleniumUrl = isset($_SERVER['JENKINS_URL']) ? TEST_ENV_SELENIUM_SERVER : LOCAL_ENV_SELENIUM_SERVER;
    
            return RemoteWebDriver::create(
                $seleniumUrl, DesiredCapabilities::firefox()
            );
        }
    }
    

    <强> command-line.sh

    export BROWSER_REQUESTED='chrome' && phpunit