Extension:Selenium.php
<?php
/** * Extension:Selenium Template:Php
Category:Extensions in progress
* Category:SeleniumCategory:Extensions created with Template:SpecialPage * - Licenced under LGPL http://www.gnu.org/copyleft/lesser.html * - Author: http://www.organicdesign.co.nz/User:Sven (M Davy) */
if (!defined('MEDIAWIKI')) die('Not an entry point.'); define('SELENIUM_VERSION','0.7.6, 2007-1-09, selenium-core 0.8.3');
$egSeleniumTag = "selenium"; $egSeleniumPath = "/wiki/extensions/Selenium/selenium-core-0/core/TestRunner.html"; $egResultsUrlPath = "../../tmp/results.php"; $egSpecialPath = "/wiki/index.php?title=Special:Selenium&suite="; $egSeleniumCategory = "Selenium"; $egSeleniumNamespace = "";
/**
* http://www.mediawiki.org/wiki/Manual:Special_pages * $wgSpecialPages['Selenium'] = 'Selenium'; */
$wgExtensionFunctions[] = 'efSetupSelenium'; $wgHooks['LanguageGetMagic'][] = 'efSeleniumLanguageGetMagic';
$wgExtensionCredits['specialpage'][] = array( 'name' => 'Special:Selenium', 'author' => 'Sven (M Davy)', 'description' => 'Incorporating Selenium tests into the MediaWiki environment', 'url' => 'http://www.organicdesign.co.nz/Extension:Selenium.php', 'version' => SELENIUM_VERSION );
require_once "$IP/includes/SpecialPage.php";
class Selenium {
- Properties
- Constructor
function __construct() {
global $wgHooks,$wgParser,$egSeleniumTag;
- Add the tagHook
$wgParser->setHook($egSeleniumTag,array($this,'tagSelenium')); }
- Deploy tags to allow additional html table tags
public function tagSelenium($text,$argv,&$parser) {
global $wgTitle, $egSeleniumCategory;
/**
* Should be a preprocess using first stage of parser
* $text = $parser->preprocess($text,$wgTitle,$parser->mOptions);
*/
- Want the Selenium tag to strip out ... enclosing tags
$text = eregi_replace('.+);
- Constructor
function __construct() {
SpecialPage::SpecialPage(
'Selenium', # name as seen in links etc , # user rights required true, # listed in special:specialpages false, # function called by execute() - defaults to wfSpecial{$name} false, # file included by execute() - defaults to Special{$name}.php, only used if no function false # includable );
}
/**
* -------------------- Create form for Special:Selenium --------------------
* Override SpecialPage::execute()
*/
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'));
- print $suiteTitle;
- print $suiteTitle->getText();
- print $wgRequest->getText('suite');
$wikitext = $this->fetchContents($suiteTitle);
- Expanding braces of any transcluded tests
$wikitext = $wgParser->preprocess($wikitext,$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')) {
- Grab name of 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;
- Retrieve articles in category labelled $egSeleniumCategory
$list = $this->categoryArticles($egSeleniumCategory);
- Grab article $param and process contents
$suites = array();
foreach($list as $articleName) {
$suiteTitle = Title::newFromText($articleName); $wikitext = $this->fetchContents($suiteTitle);
if( $this->articleRegex($wikitext, $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');
global $egSeleniumPath, $egSpecialPath;
$path = "$egSeleniumPath?test=" . urlencode($egSpecialPath);
$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'));
$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);
}
}
}
private function categoryArticles($category) {
$list = array();
$dbr = &wfGetDB(DB_SLAVE);
$cl = $dbr->tableName('categorylinks');
$res = $dbr->select($cl,'cl_from',"cl_to = '$category'",__METHOD__,array('ORDER BY' => 'cl_sortkey'));
while ($row = $dbr->fetchRow($res)){
$list[] = Title::newFromID($row[0])->getPrefixedText();
}
return($list);
}
private function fetchContents($title) {
$article = new Article($title);
$contents = $article->getContent();
return($contents);
}
private function articleRegex(&$wikitext,&$matches) {
$count = preg_match_all('|^={2,}\s*([^\#\<\>\[\]\|\{\}\n]+?)\s*={2,}(.+?</selenium>)|ms',$wikitext,$matches);
return($count);
}
- Method to bypass $wgOut -must be called early to avoid conflict with other extensions
static function disableHTML(&$wgOut) {
$wgOut->disable();
wfResetOutputBuffers();
return;
}
- Method to generate 404 error
private function build404($message) {
header('HTTP/1.0 404 not Found');
$err = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">404 Error
$message
The requested URL was not found on this server.
";
print $err;
return;
}
- Method to build a suite from an array of tests
private function buildSuite($tests, $article) {
$html = $this->suite['header'];
$html .= "$article";
foreach ($tests as $element) {
$html .= "\n<a href=\"/wiki/index.php?title=Special:Selenium&suite=$article&test=$element\">$element</a>";
} $html .= $this->suite['footer']; return $html; }
}
- Called from $wgExtensionFunctions array when initialising extensions
function efSetupSelenium() {
global $wgRequest, $wgOut;
- Process suite or test if ?suite=article_name in query string
if($wgRequest->getText('suite')) {
- Render only Selenium html
SpecialSelenium::disableHTML($wgOut); } global $egSelenium, $wgLanguageCode, $wgMessageCache; $egSelenium = new Selenium();
- Add the messages used by the specialpage
if ($wgLanguageCode == 'en') {
$wgMessageCache->addMessages(array(
'selenium' => 'Selenium testing environment', # The friendly page title ));
}
- Add the specialpage to the environment
SpecialPage::addPage(new SpecialSelenium());
}
- Needed in MediaWiki >1.8.0 for magic word hooks to work properly
function efSeleniumLanguageGetMagic(&$magicWords,$langCode = 0) {
global $egSeleniumMagic; $magicWords[$egSeleniumMagic] = array(0,$egSeleniumMagic); return true;
}



