SpecialSelenium.php
<?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 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, $egResultsUrlPath;
# Process suite or test if ?suite=article_name in query string if ($wgRequest->getText('suite')) {
# Grab article $param and process contents $suiteTitle = Title::newFromText($wgRequest->getText('suite'));
# get the content of the suite article and expand braces $suiteArticle = new Article($suiteTitle); $wikitext = $wgParser->preprocess($suiteArticle->getContent(), $suiteTitle, new ParserOptions());
# Preparse encapsulations around Selenium tags e.g. <selenium> $wikitext = preg_replace("|</?selenium>|", "<selenium>", $wikitext);
$matches = array(); if (!$this->articleRegex($wikitext, $matches)) { $this -> build404('Specified suite contains no selenium test tags'); } else {
# Determine whether suite or test from ?suite=article_name&test=section_num in query string if ($wgRequest->getText('test')) { $testTitle = Title::newFromText($wgRequest->getText('test')); if (in_array($testTitle->getText(), $matches[1])) { $counter = 0; foreach ($matches[1] as $value) { if ($value == $testTitle->getText()) { # Generating test html $matches[2][$counter] = preg_replace( '|.+?<selenium>\n?(.+?)</selenium>|ms', "$1", $matches[2][$counter] ); print $matches[2][$counter]; break; #exit foreach loop when test is found } $counter++; } } else $this->build404("Specified test does not exist in ".$wgRequest->getText('suite')); } else { # Obtain suite section headers $suite_urls = array(); foreach ($matches[1] as $value) array_push($suite_urls, $value); print $this->buildSuite($suite_urls, $wgRequest->getText('suite')); } } }
else { global $egSeleniumCategory, $egSeleniumPath;
# Retrieve articles in category labelled $egSeleniumCategory $list = array(); $dbr = &wfGetDB(DB_SLAVE); $cl = $dbr->tableName('categorylinks'); $res = $dbr->select($cl, 'cl_from', "cl_to = '$egSeleniumCategory'", __METHOD__, array('ORDER BY' => 'cl_sortkey')); while ($row = $dbr->fetchRow($res)) $list[] = Title::newFromID($row[0])->getPrefixedText();
# Grab article $param and process contents $suites = array(); foreach ($list as $articleName) { $suiteTitle = Title::newFromText($articleName); $suiteArticle = new Article($suiteTitle); if ($this->articleRegex($suiteTitle->getContent(), $matches)) $suites[] = $articleName; }
$selectTag = '<select name="selenium">'; foreach ($suites as $suite) $selectTag .= "<option>$suite</option>"; $selectTag .= '</select>';
$this->setHeaders(); $title = Title::makeTitle(NS_SPECIAL, 'Selenium');
$path = "$egSeleniumPath?test=".urlencode($title->getLocalURL());
$form = wfElement('form', array('action' => $title->getLocalURL('action=submit'), 'method' => 'post'), null);
$form .= '<fieldset><legend>Select a suite to run</legend>';
$form .= "$selectTag";
$form .= wfElement('input', array('type' => 'submit', value => 'Go'));
$form .= "
" . wfCheckLabel("Run automatically", "wfRunAuto" , "wfRunAuto", $checked = false);
$form .= '</fieldset></form>';
$wgOut->addHTML($form);
if ($wgRequest->getText('action')) {
# foreach($_REQUEST as $key=>$value) {
# print "$key>$value" . "
";
}
$path .= urlencode($wgRequest->getText('selenium'));
if ($wgRequest->getBool('wfRunAuto')) $path .= "&auto=true&resultsUrl=$egResultsUrlPath";
$form_link = '<fieldset><legend>Click link to run selenium-core</legend>'; $form_link .= "<a href=\"$path\">" . $wgRequest->getText('selenium') . '</a></fieldset>'; $wgOut->addHTML($form_link); } }
/** * Bypass $wgOut -must be called early to avoid conflict with other extensions */ static function disableHTML(&$wgOut) { $wgOut->disable(); wfResetOutputBuffers(); return; }
/** * Generate 404 error */ private function build404($message) { header('HTTP/1.0 404 not Found'); $err = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">
$message
The requested URL was not found on this server.
"; print $err; return; }
/** * Build a suite from an array of tests */ private function buildSuite($tests, $article) { $html = "
$article |
$element |
"; } }