0

我正在使用 SimpleBrowser,它是 SimpleTest PHP 框架的一部分。

这个想法是模仿用户与网站的交互,并将返回的 HTML 代码记录到文件中以供进一步比较。但是这里出了点问题,因为有时会返回空 HTML。

getTransportError() returns Nothing fetched

它发生在完全随机的地方,我不能使用 back() 函数,因为大多数页面都是提交的表单。

require_once('simpletest/browser.php');

class TesterBrowser extends SimpleBrowser
{

    /**
     * Test the page against the reference. If reference is missing, is it created
     * Uses md5 checksum to check if files are identical
     * 
     * @param string $forcename Optional. Substitude autogenerated filename. 
     * @param boolean $forceRef Optional. Force file to be saved as the reference
     *
     * @access public
     *
     * @return void
     */
    public function testPage($forcename = "")
    {
        //who called me?
        //$callers=debug_backtrace();
        //$whocalledme = $callers[1]['function'];
        //get the current source
        $html = $this->getContent();
        //generate filename
        $filename = empty($forcename) ? preg_replace('/[^\w\-'. ''. ']+/u', '-', $this->getUrl()) : $forcename;
        $filename .= ".html";
        //is there a gauge?
        if(file_exists("ref/".$filename) && filesize(dirname(__FILE__)."/ref/".$filename) > 0)
        {
            //is there a difference
            file_put_contents(dirname(__FILE__)."/actual/".$filename, $html);
            if(filesize(dirname(__FILE__)."/actual/".$filename) == 0)
            {
                return false;
            }   
            if(md5_file(dirname(__FILE__)."/actual/".$filename) != md5_file(dirname(__FILE__)."/ref/".$filename))
            {
                echo $this->getUrl() . " (" . $filename . ") has changed \r\n";
            }
        }
        else
        {
            file_put_contents(dirname(__FILE__)."/ref/".$filename, $html);
            if(filesize(dirname(__FILE__)."/ref/".$filename) == 0)
            {
                return false;
            }   
        }
        return true;
    }

    /**
     * Output the string to the terminal
     * 
     * @param mixed $string String to output
     *
     * @access public
     *
     * @return void
     */
    public function output($string)
    {
        echo date("d-m-Y H:i:s") . " - $string... \r\n";
        //update date so that it will be the same on every page
        exec('date -s "24 JUN 2013 10:00:00"');
    }

    /**
     * Restore the server date using external NTP server
     * 
     * @access public
     *
     * @return void
     */
    public function restoreDate(){
        $this->output("Restoring the date&time from NTP server");
        exec("ntpdate 0.uk.pool.ntp.org");
        exec("hwclock -systohc");
    }

}

以及执行测试的方式:

class Tester
{
    public $browser = null;
    const BASEURL = "http://ticketing/";

    function __construct(){
        $this->browser = new TesterBrowser();
        $this->browser->setConnectionTimeout(180);

        //get the list of class method to be run
        $methods = array();

        foreach(get_class_methods($this) as $var)
        {
            if(0 === strpos($var, 'test')) //they all start with test
            {
                $methods[] = $var;
            }
        }

        $methods[] = "cleanUp";

        //now we need to run these methods
        foreach($methods as $m){
            while($this->$m() == false){
                $this->browser->output("Empty page, trying again");
                sleep(5);
            }
        }
    }

    //index page
    function testGetIndexPage()
    {
        $this->browser->output("Getting index page");
        $this->browser->get(self::BASEURL);
        return $this->browser->testPage();
    }

    //try to enter wrong password
    function testWrongPassword()
    {
        $this->browser->output("Entering wrong credentials");
        $this->browser->setField("username", "wrong");
        $this->browser->setField("password", "wrong");
        $this->browser->clickSubmitByName("submit");
        return $this->browser->testPage("wrong-credentials");           
    }
        //Delete ticket though admin
    function testDeleteTicketThroughAdmin()
    {
        $this->browser->output("Deleting the ticket through admin page");
        $this->browser->setField("bulk[]", "375341");
        $this->browser->setField("bulkaction", "delete");
        $this->browser->clickSubmit("Do Action");
        return $this->browser->testPage("deleted-ticket-admin");        
    }

    //Restore the date
    function cleanUp()
    {
        $this->browser->restoreDate();
        return true;
    }

}

$tester = new Tester();

当然还有更多的测试,这是一个剥离版本。我已经用谷歌搜索了很多关于这个问题的信息,似乎没有足够的文档。

4

1 回答 1

0

解决了。这是一个超时问题,尽管由于某种原因没有实现足够的错误消息。

$this->browser->setConnectionTimeout(180);
于 2013-06-25T12:30:56.137 回答