Initial commit of the Selenium framework
authorRyan Lane <laner@users.mediawiki.org>
Fri, 30 Apr 2010 20:45:52 +0000 (20:45 +0000)
committerRyan Lane <laner@users.mediawiki.org>
Fri, 30 Apr 2010 20:45:52 +0000 (20:45 +0000)
maintenance/tests/RunSeleniumTests.php [new file with mode: 0644]
maintenance/tests/selenium/Selenium.php [new file with mode: 0644]
maintenance/tests/selenium/SeleniumTestCase.php [new file with mode: 0644]
maintenance/tests/selenium/SeleniumTestConsoleLogger.php [new file with mode: 0644]
maintenance/tests/selenium/SeleniumTestHTMLLogger.php [new file with mode: 0644]
maintenance/tests/selenium/SeleniumTestListener.php [new file with mode: 0644]
maintenance/tests/selenium/SeleniumTestSuite.php [new file with mode: 0644]

diff --git a/maintenance/tests/RunSeleniumTests.php b/maintenance/tests/RunSeleniumTests.php
new file mode 100644 (file)
index 0000000..bae7234
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+ /**
+  * Copyright (C) Wikimedia Deuschland, 2009
+  * Authors Hallo Welt! Medienwerkstatt GmbH
+  * Authors Markus Glaser
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+  * the Free Software Foundation; either version 2 of the License, or
+  * (at your option) any later version.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+  * GNU General Public License for more details.
+  *
+  * You should have received a copy of the GNU General Public License along
+  * with this program; if not, write to the Free Software Foundation, Inc.,
+  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  * http://www.gnu.org/copyleft/gpl.html
+  *
+  */
+
+define( "MEDIAWIKI", true );
+define( "SELENIUMTEST", true);
+
+//command line only
+$wgSeleniumTestsRunMode = 'cli';
+if( $wgSeleniumTestsRunMode == 'cli' && php_sapi_name() != 'cli' ) {
+       echo 'Must be run from the command line.';
+       die( -1 );
+}
+//include path and installation instructions
+
+//URL: http://localhost/tests/RunSeleniumTests.php
+//set_include_path(get_include_path() . PATH_SEPARATOR . './PEAR/');
+
+// Hostname of selenium server
+$wgSeleniumTestsSeleniumHost          = "http://localhost";
+
+// URL of the wiki to be tested.
+$wgSeleniumTestsWikiUrl               = 'http://localhost';
+
+// Wiki login. Used by Selenium to log onto the wiki
+$wgSeleniumTestsWikiUser      = "WikiSysop";
+$wgSeleniumTestsWikiPassword  = "password";
+
+// Common browsers on Windows platform
+// Use the *chrome handler in order to be able to test file uploads
+// further solution suggestions: http://www.brokenbuild.com/blog/2007/06/07/testing-file-uploads-with-selenium-rc-and-firefoxor-reducing-javascript-security-in-firefox-for-fun-and-profit/
+//$wgSeleniumTestsBrowsers['firefox']   = '*firefox c:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe';
+$wgSeleniumTestsBrowsers['firefox']   = '*chrome c:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe';
+$wgSeleniumTestsBrowsers['iexplorer'] = '*iexploreproxy';
+
+// Actually, use this browser
+$wgSeleniumTestsUseBrowser = 'firefox';
+
+// requires PHPUnit 3.4
+require_once 'Testing/Selenium.php';
+require_once 'PHPUnit/Framework.php';
+require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
+
+// include uiTestsuite
+require_once 'selenium/SeleniumTestHTMLLogger.php';
+require_once 'selenium/SeleniumTestConsoleLogger.php';
+require_once 'selenium/SeleniumTestListener.php';
+require_once 'selenium/Selenium.php';
+require_once 'selenium/SeleniumTestSuite.php';
+require_once 'selenium/SeleniumTestCase.php';
+
+$result = new PHPUnit_Framework_TestResult;
+switch ($wgSeleniumTestsRunMode) {
+    case 'html' : $logger = new SeleniumTestHTMLLogger; break;
+    case 'cli'  : $logger = new SeleniumTestConsoleLogger; break;
+}
+$result->addListener(new SeleniumTestListener($logger));
+
+
+$wgSeleniumTestSuites = array();
+
+// Todo: include automatically
+#include_once '<your tests>';
+
+// Here, you can override standard setting
+if (file_exists('LocalSeleniumSettings.php'))
+{
+       include_once 'LocalSeleniumSettings.php';
+}
+
+// run tests
+foreach ($wgSeleniumTestSuites as $suite)
+    $suite->run($result);
+?>
diff --git a/maintenance/tests/selenium/Selenium.php b/maintenance/tests/selenium/Selenium.php
new file mode 100644 (file)
index 0000000..b4bcc8e
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Selenium connector
+ * This is implemented as a singleton.
+ */
+
+if (!defined('MEDIAWIKI') || !defined('SELENIUMTEST')) {
+       echo "This script cannot be run standalone";
+       exit(1);
+}
+
+class Selenium extends Testing_Selenium
+{
+    protected static $_instance = null;
+    public $isStarted = false;
+    public static function getInstance()
+    {
+        global $wgSeleniumTestsBrowsers, $wgSeleniumTestsSeleniumHost, $wgSeleniumTestsUseBrowser;
+        if (null === self::$_instance)
+        {
+            self::$_instance = new self($wgSeleniumTestsBrowsers[$wgSeleniumTestsUseBrowser], $wgSeleniumTestsSeleniumHost);
+        }
+        return self::$_instance;
+    }
+
+    public function start()
+    {
+        global $wgSeleniumTestsBrowsers, $wgSeleniumTestsSeleniumHost;
+        parent::start();
+        $this->isStarted = true;
+    }
+
+    public function stop()
+    {
+        parent::stop();
+        $this->isStarted = false;
+    }
+
+    public function login()
+    {
+        global $wgSeleniumTestsWikiUser, $wgSeleniumTestsWikiPassword, $wgSeleniumTestsWikiUrl;
+
+        $this->open($wgSeleniumTestsWikiUrl.'/index.php?title=Special:Userlogin');
+        $this->type("wpName1", $wgSeleniumTestsWikiUser);
+        $this->type("wpPassword1", $wgSeleniumTestsWikiPassword);
+        $this->click("//input[@id='wpLoginAttempt']");
+        $value = $this->doCommand('assertTitle', array('Anmeldung erfolgreich*'));
+    }
+
+    public function loadPage($title, $action)
+    {
+        global $wgSeleniumTestsWikiUrl;
+        $this->open($wgSeleniumTestsWikiUrl.'/index.php?title='.$title.'&action='.$action);
+    }
+
+    // Prevent external cloning
+    protected function __clone() {}
+    // Prevent external construction
+    //protected function __construct() {}
+}
diff --git a/maintenance/tests/selenium/SeleniumTestCase.php b/maintenance/tests/selenium/SeleniumTestCase.php
new file mode 100644 (file)
index 0000000..6aadbfa
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+if (!defined('MEDIAWIKI') || !defined('SELENIUMTEST')) {
+       echo "This script cannot be run standalone";
+       exit(1);
+}
+
+class SeleniumTestCase extends PHPUnit_Framework_TestCase //PHPUnit_Extensions_SeleniumTestCase
+{
+    protected $selenium;
+
+    public function setUp()
+    {
+        set_time_limit(60);
+        $this->selenium = Selenium::getInstance();
+        //print_r($this->suite);
+    }
+
+    public function tearDown()
+    {
+
+    }
+
+    public function __call($method, $args)
+    {
+       return call_user_func_array (array($this->selenium, $method), $args);
+    }
+
+    public function assertSeleniumAttributeEquals($attribute, $value)
+    {
+        $attr = $this->getAttribute($attribute);
+        $this->assertEquals($attr, $value);
+    }
+
+    public function assertSeleniumHTMLContains($element, $text)
+    {
+        $innerHTML = $this->getText($element);
+        //or assertContains
+        $this->assertRegExp("/$text/", $innerHTML );
+    }
+
+}
+
+?>
diff --git a/maintenance/tests/selenium/SeleniumTestConsoleLogger.php b/maintenance/tests/selenium/SeleniumTestConsoleLogger.php
new file mode 100644 (file)
index 0000000..7473ece
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+if (!defined('MEDIAWIKI') || !defined('SELENIUMTEST')) {
+       echo "This script cannot be run standalone";
+       exit(1);
+}
+
+class SeleniumTestConsoleLogger
+{
+    public function __construct()
+    {
+        // Prepare testsuite for immediate output
+        @ini_set('zlib.output_compression', 0);
+        @ini_set('implicit_flush', 1);
+        for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
+        ob_implicit_flush(1);
+        
+    }
+
+    public function write($message, $mode = false)
+    {
+        $out .= '';
+        //if ($mode == MW_TESTLOGGER_RESULT_OK) $out .= '<font color="green">';
+        $out .=  htmlentities($message);
+        //if ($mode == MW_TESTLOGGER_RESULT_OK) $out .= '</font>';
+        if ($mode != MW_TESTLOGGER_CONTINUE_LINE) $out .= "\n";
+
+        echo $out;
+    }
+}
\ No newline at end of file
diff --git a/maintenance/tests/selenium/SeleniumTestHTMLLogger.php b/maintenance/tests/selenium/SeleniumTestHTMLLogger.php
new file mode 100644 (file)
index 0000000..6b9c3a6
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+if (!defined('MEDIAWIKI') || !defined('SELENIUMTEST')) {
+       echo "This script cannot be run standalone";
+       exit(1);
+}
+
+class SeleniumTestHTMLLogger
+{
+    public function __construct()
+    {
+        // Prepare testsuite for immediate output
+        @ini_set('zlib.output_compression', 0);
+        @ini_set('implicit_flush', 1);
+        for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
+        ob_implicit_flush(1);
+        
+        // Output some style information
+        echo '<style>
+        pre {
+         overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */
+         white-space: pre-wrap; /* css-3 */
+         white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
+         white-space: -pre-wrap; /* Opera 4-6 */
+         white-space: -o-pre-wrap; /* Opera 7 */
+         /* width: 99%; */
+         word-wrap: break-word; /* Internet Explorer 5.5+ */
+        }
+        </style>';
+        
+        
+    }
+
+    public function write($message, $mode = false)
+    {
+        $out .= '';
+        if ($mode == MW_TESTLOGGER_RESULT_OK) $out .= '<font color="green">';
+        $out .=  htmlentities($message);
+        if ($mode == MW_TESTLOGGER_RESULT_OK) $out .= '</font>';
+        if ($mode != MW_TESTLOGGER_CONTINUE_LINE) $out .= '<br/>';
+
+        echo $out;
+    }
+}
\ No newline at end of file
diff --git a/maintenance/tests/selenium/SeleniumTestListener.php b/maintenance/tests/selenium/SeleniumTestListener.php
new file mode 100644 (file)
index 0000000..d467589
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+if (!defined('MEDIAWIKI') || !defined('SELENIUMTEST')) {
+       echo "This script cannot be run standalone";
+       exit(1);
+}
+
+class SeleniumTestListener implements PHPUnit_Framework_TestListener
+{
+    private $logger;
+    private $tests_ok = 0;
+    private $tests_failed = 0;
+
+    public function __construct($loggerInstance)
+    {
+        $this->logger = $loggerInstance;
+    }
+
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->logger->write("Error: ".$e->getMessage());
+        $this->tests_failed++;
+    }
+
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+        $this->logger->write("Failed: ".$e->getMessage());
+        $this->tests_failed++;
+
+    }
+
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->logger->write("Incomplete.");
+        $this->tests_failed++;
+    }
+
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->logger->write("Skipped.");
+        $this->tests_failed++;
+    }
+
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        $this->logger->write("Testing ".$test->getName()." ... ", MW_TESTLOGGER_CONTINUE_LINE);
+    }
+
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        if (!$test->hasFailed())
+        {
+            $this->logger->write("OK", MW_TESTLOGGER_RESULT_OK);
+            $this->tests_ok++;
+        }
+    }
+
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        $this->logger->write("Testsuite ".$suite->getName()." started.");
+        $this->tests_ok = 0;
+    }
+
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        $this->logger->write("Testsuite ".$suite->getName()." ended. OK: ".$this->tests_ok." Failed: ".$this->tests_failed);
+
+    }
+
+    public function statusMessage($message)
+    {
+        $this->logger->write($message);
+    }
+}
+
diff --git a/maintenance/tests/selenium/SeleniumTestSuite.php b/maintenance/tests/selenium/SeleniumTestSuite.php
new file mode 100644 (file)
index 0000000..b7456f1
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+if (!defined('MEDIAWIKI') || !defined('SELENIUMTEST')) {
+       echo "This script cannot be run standalone";
+       exit(1);
+}
+
+// Do not add line break after test output
+define('MW_TESTLOGGER_CONTINUE_LINE', 1);
+define('MW_TESTLOGGER_RESULT_OK', 2);
+define('MW_TESTLOGGER_RESULT_ERROR', 3);
+
+class SeleniumTestSuite extends PHPUnit_Framework_TestSuite
+{
+    private $selenium;
+
+    public function setUp()
+    {
+
+        $this->selenium = Selenium::getInstance();
+        $this->selenium->start();
+        $this->login();
+        //$this->loadPage('Testpage', 'edit');
+    }
+
+    public function tearDown()
+    {
+        $this->selenium->stop();
+    }
+
+    public function login()
+    {
+        $this->selenium->login();
+    }
+
+    public function loadPage($title, $action)
+    {
+        $this->selenium->loadPage($title, $action);
+    }
+}
+