From OrganicDesign Wiki
<?php
/**
* Selenium extension
*
* See http://www.mediawiki.org/Extension:Selenium for installation and usage details
* See http://www.organicdesign.co.nz/Extension_talk:Selenium.php for development notes and disucssion
*
* @package MediaWiki
* @subpackage Extensions
* @author Marcus Davy [http://www.organicdesign.co.nz/User:Sven User:Sven]
* @copyright © 2007 Marcus Davy
* @licence GNU General Public Licence 2.0 or later
*/
if (!defined('MEDIAWIKI')) die();
class SpecialSelenium extends SpecialPage {
function __construct() {
SpecialPage::SpecialPage('Selenium', '', true, false, false, false);
}
public function execute() {
global $wgOut, $wgParser, $wgRequest, $wgServer,
$egSeleniumCategory, $egSeleniumSchdeule, $egSeleniumLog, $egSeleniumPath, $egResultsUrlPath;
# Process suite or test if ?suite=article_name in query string
if ($suite = $wgRequest->getText('suite')) {
# Get the content of the suite article and parse it
# NOTE: parsing the content results in the head, body, thead, tbody etc being removed,
# but it seems that the TestRunner doesn't care and can work with the basic table structure
$suiteTitle = Title::newFromText($suite);
$suiteArticle = new Article($suiteTitle);
$text = $wgParser->parse($suiteArticle->getContent(), $suiteTitle, new ParserOptions(), true, true)->getText();
# Extract the tests from the expanded content and
$numTests = preg_match_all(
"|<div class=\"selenium\" id=\"(.+?)\">\\s*(.+?)\\s*</div><!-- selenium-end -->|is",
$text,
$matches,
PREG_PATTERN_ORDER
);
# If any tests were extracted, build content and return it to the client
if ($numTests > 0) {
# Re-organise the matched test content into a hash indexed by test name
$tests = array();
for ($i = 0; $i < $numTests; $i++) $tests[$matches[1][$i]] = $matches[2][$i];
# If a test is specified, return it from the suite article content in raw HTML Selenium test format
if ($test = $wgRequest->getText('test')) {
if (array_key_exists($test, $tests)) print $tests[$test];
}
# Or if no test specified, return the whole suite in raw HTML Selenium test-suite format
else {
$html = "<html><head><meta content=\"text/html; charset=ISO-8859-1\" http-equiv=\"content-type\">
<title>Selenium</title></head><body><table cellpadding=\"1\" cellspacing=\"1\" border=\"1\">
<tbody><tr><td><b>$suite</b></td></tr>\n";
$title = Title::makeTitle(NS_SPECIAL, 'Selenium');
foreach (array_keys($tests) as $test) {
$url = $title->getLocalURL("suite=$suite&test=$test");
$html .= "<tr><td><a href=\"$url\">$test</a></td></tr>\n";
}
print "$html</tbody></table></body></html>";
}
}
}
# No suite specified, render the main special page and form
else {
$this->setHeaders();
$title = Title::makeTitle(NS_SPECIAL, 'Selenium');
$ide = "$egSeleniumPath/core/TestRunner.html";
# Retrieve suites from Selenium category (only selenium tests should be in this cat)
$suites = array();
$dbr = &wfGetDB(DB_SLAVE);
$cat = Title::makeTitle(NS_CATEGORY, $egSeleniumCategory)->getDBkey();
$cl = $dbr->tableName('categorylinks');
$res = $dbr->select($cl, 'cl_from', "cl_to = '$cat'", __METHOD__, array('ORDER BY' => 'cl_sortkey'));
while ($row = $dbr->fetchRow($res)) $suites[] = Title::newFromID($row[0])->getPrefixedText();
# Split schedule into times and enabled suites
$schedule = array();
$enabled = array();
foreach ($egSeleniumSchdeule as $k => $v) is_numeric($k) ? $schedule[] = $v : $enabled[$k] = $v;
$desc = "<b>".array_pop($schedule)."</b>";
if (count($schedule) > 0) $desc = "<b>".join("</b>, <b>", $schedule)."</b> and $desc";
# Render table of all available suites and their information
$thead = "{|class=\"selenium-special\" border\n";
$thead .= "!Test suite!!".wfMsg('selenium-schedule', $desc);
$thead .= "!!".wfMsg('selenium-last')."!!".wfMsg('selenium-run')."!!\n";
$tbody = '';
foreach ($suites as $suite) {
$tbody .= "|-\n|valign=top|[[$suite]]\n|\n";
if (array_key_exists($suite, $enabled)) {
foreach ($enabled[$suite] as $domain) $tbody .= "*$domain\n";
} else $tbody .= "-\n";
$tbody .= "|valign=top|last log item\n";
$tbody .= "|valign=top|[$wgServer$ide?test=".urlencode($title->getLocalURL("suite=$suite"));
$tbody .= " ".wfMsg('selenium-run')."]\n";
}
$wgOut->addWikitext("$thead$tbody|}\n".wfMsg('selenium-loginfo', $egSeleniumLog));
}
}
}