SpecialSelenium.php

From Organic Design wiki
Revision as of 10:24, 1 August 2008 by Nad (talk | contribs) (New page: <?php /** * Selenium extension * * ...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

<?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\">404 Error

$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 = " Selenium

"; $title = Title::makeTitle(NS_SPECIAL, 'Selenium'); foreach ($tests as $element) { $url = $title->getLocalURL("suite=$article&test=$element"); $html .= "\n"; } return "$html\n
$article
$element

"; } }