Difference between revisions of "SpecialSelenium.php"

From Organic Design wiki
(New page: <?php /** * Selenium extension * * ...)
 
({{legacy}})
 
(12 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<?php
+
{{legacy}}
 +
<php><?php
 
/**
 
/**
 
  * Selenium extension
 
  * Selenium extension
Line 21: Line 22:
 
   
 
   
 
public function execute() {
 
public function execute() {
global $wgOut, $wgParser, $wgRequest, $egResultsUrlPath;
+
global $wgOut, $wgParser, $wgRequest, $wgServer,
 +
$egSeleniumCategory, $egSeleniumSchdeule, $egSeleniumLog, $egSeleniumPath, $egResultsUrlPath;
  
 
# Process suite or test if ?suite=article_name in query string
 
# Process suite or test if ?suite=article_name in query string
if ($wgRequest->getText('suite')) {
+
if ($suite = $wgRequest->getText('suite')) {
  
# Grab article $param and process contents
+
# Get the content of the suite article and parse it
$suiteTitle = Title::newFromText($wgRequest->getText('suite'));
+
# 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();
  
# get the content of the suite article and expand braces
+
# Extract the tests from the expanded content and  
$suiteArticle = new Article($suiteTitle);
+
$numTests = preg_match_all(
$wikitext = $wgParser->preprocess($suiteArticle->getContent(), $suiteTitle, new ParserOptions());
+
"|<div class=\"selenium\" id=\"(.+?)\">\\s*(.+?)\\s*</div><!-- selenium-end -->|is",
 +
$text,
 +
$matches,
 +
PREG_PATTERN_ORDER
 +
);
  
# Preparse encapsulations around Selenium tags e.g. <nowiki><selenium></nowiki>
+
# If any tests were extracted, build content and return it to the client
$wikitext = preg_replace("|<nowiki></?selenium></nowiki>|", "<nowiki><selenium></nowiki>", $wikitext);
+
if ($numTests > 0) {
  
$matches = array();
+
# Re-organise the matched test content into a hash indexed by test name
if (!$this->articleRegex($wikitext, $matches)) {
+
$tests = array();
$this -> build404('Specified suite contains no selenium test tags');
+
for ($i = 0; $i < $numTests; $i++) $tests[$matches[1][$i]] = $matches[2][$i];
}
 
else {
 
  
# Determine whether suite or test from ?suite=article_name&test=section_num in query string     
+
# If a test is specified, return it from the suite article content in raw HTML Selenium test format
if ($wgRequest->getText('test')) {
+
if ($test = $wgRequest->getText('test')) {
$testTitle = Title::newFromText($wgRequest->getText('test'));
+
if (array_key_exists($test, $tests)) print $tests[$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'));
 
 
}
 
}
 +
 +
# Or if no test specified, return the whole suite in raw HTML Selenium test-suite format
 
else {
 
else {
# Obtain suite section headers
+
$html = "<html><head><meta content=\"text/html; charset=ISO-8859-1\" http-equiv=\"content-type\">
$suite_urls = array();
+
<title>Selenium</title></head><body><table cellpadding=\"1\" cellspacing=\"1\" border=\"1\">
foreach ($matches[1] as $value) array_push($suite_urls, $value);
+
<tbody><tr><td><b>$suite</b></td></tr>\n";
print $this->buildSuite($suite_urls, $wgRequest->getText('suite'));
+
$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 {
 
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();
 
$this->setHeaders();
 
$title = Title::makeTitle(NS_SPECIAL, 'Selenium');
 
$title = Title::makeTitle(NS_SPECIAL, 'Selenium');
 +
$ide = "$egSeleniumPath/core/TestRunner.html";
  
$path = "$egSeleniumPath?test=".urlencode($title->getLocalURL());
+
# 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();
  
$form  = wfElement('form', array('action' => $title->getLocalURL('action=submit'), 'method' => 'post'), null);
+
# Split schedule into times and enabled suites
$form .= '<fieldset><legend>Select a suite to run</legend>';
+
$schedule = array();
$form .= "$selectTag";
+
$enabled = array();
$form .=  wfElement('input', array('type' => 'submit', value => 'Go'));
+
foreach ($egSeleniumSchdeule as $k => $v) is_numeric($k) ? $schedule[] = $v : $enabled[$k] = $v;
$form .= "<br /><br />" . wfCheckLabel("Run automatically", "wfRunAuto" , "wfRunAuto", $checked = false);
+
$desc = "<b>".array_pop($schedule)."</b>";
$form .=  '</fieldset></form>';
+
if (count($schedule) > 0) $desc = "<b>".join("</b>, <b>", $schedule)."</b> and $desc";
  
$wgOut->addHTML($form);
+
# Render table of all available suites and their information
 
+
$thead =  "{|class=\"selenium-special\" border\n";
if ($wgRequest->getText('action')) {
+
$thead .= "!Test suite!!".wfMsg('selenium-schedule', $desc);
# foreach($_REQUEST as $key=>$value) {
+
$thead .= "!!".wfMsg('selenium-last')."!!".wfMsg('selenium-run')."!!\n";
#   print "$key>$value" . "<br />";
+
$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";
 
}
 
}
$path .= urlencode($wgRequest->getText('selenium'));
+
$wgOut->addWikitext("$thead$tbody|}\n".wfMsg('selenium-loginfo', $egSeleniumLog));
 
 
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\"><html><head><title>404 Error</title></head>
 
<body><h1>$message</h1><p>The requested URL was not found on this server.</p></body></html>";
 
print $err;
 
return;
 
}
 
 
 
/**
 
* Build a suite from an array of tests
 
*/
 
private function buildSuite($tests, $article) {
 
$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>$article</b></td></tr>";
 
$title = Title::makeTitle(NS_SPECIAL, 'Selenium');
 
foreach ($tests as $element) {
 
$url = $title->getLocalURL("suite=$article&test=$element");
 
$html .= "\n<tr><td><a href=\"$url\">$element</a></td></tr>";
 
 
}
 
}
return "$html\n</tbody></table></body></html>";
 
 
}
 
}
 
}
 
}
 +
</php>

Latest revision as of 14:20, 22 October 2014

Legacy.svg Legacy: This article describes a concept that has been superseded in the course of ongoing development on the Organic Design wiki. Please do not develop this any further or base work on this concept, this is only useful for a historic record of work done. You may find a link to the currently used concept or function in this article, if not you can contact the author to find out what has taken the place of this legacy item.

<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, $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(

"|

\\s*(.+?)\\s*

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

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

"; } } }

# 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 = "".array_pop($schedule).""; if (count($schedule) > 0) $desc = "".join(", ", $schedule)." 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)); } } } </php>