--- /dev/null
+<?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);
+?>
--- /dev/null
+<?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() {}
+}
--- /dev/null
+<?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 );
+ }
+
+}
+
+?>
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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);
+ }
+}
+
--- /dev/null
+<?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);
+ }
+}
+