📄 browser.php
字号:
<?php /** * Base include file for SimpleTest * @package SimpleTest * @subpackage WebTester * @version $Id: browser.php 163 2008-01-14 04:40:16Z matt $ */ /**#@+ * include other SimpleTest class files */ require_once(dirname(__FILE__) . '/simpletest.php'); require_once(dirname(__FILE__) . '/http.php'); require_once(dirname(__FILE__) . '/encoding.php'); require_once(dirname(__FILE__) . '/page.php'); require_once(dirname(__FILE__) . '/selector.php'); require_once(dirname(__FILE__) . '/frames.php'); require_once(dirname(__FILE__) . '/user_agent.php'); /**#@-*/ if (!defined('DEFAULT_MAX_NESTED_FRAMES')) { define('DEFAULT_MAX_NESTED_FRAMES', 3); } /** * Browser history list. * @package SimpleTest * @subpackage WebTester */ class SimpleBrowserHistory { var $_sequence; var $_position; /** * Starts empty. * @access public */ function SimpleBrowserHistory() { $this->_sequence = array(); $this->_position = -1; } /** * Test for no entries yet. * @return boolean True if empty. * @access private */ function _isEmpty() { return ($this->_position == -1); } /** * Test for being at the beginning. * @return boolean True if first. * @access private */ function _atBeginning() { return ($this->_position == 0) && ! $this->_isEmpty(); } /** * Test for being at the last entry. * @return boolean True if last. * @access private */ function _atEnd() { return ($this->_position + 1 >= count($this->_sequence)) && ! $this->_isEmpty(); } /** * Adds a successfully fetched page to the history. * @param SimpleUrl $url URL of fetch. * @param SimpleEncoding $parameters Any post data with the fetch. * @access public */ function recordEntry($url, $parameters) { $this->_dropFuture(); array_push( $this->_sequence, array('url' => $url, 'parameters' => $parameters)); $this->_position++; } /** * Last fully qualified URL for current history * position. * @return SimpleUrl URL for this position. * @access public */ function getUrl() { if ($this->_isEmpty()) { return false; } return $this->_sequence[$this->_position]['url']; } /** * Parameters of last fetch from current history * position. * @return SimpleFormEncoding Post parameters. * @access public */ function getParameters() { if ($this->_isEmpty()) { return false; } return $this->_sequence[$this->_position]['parameters']; } /** * Step back one place in the history. Stops at * the first page. * @return boolean True if any previous entries. * @access public */ function back() { if ($this->_isEmpty() || $this->_atBeginning()) { return false; } $this->_position--; return true; } /** * Step forward one place. If already at the * latest entry then nothing will happen. * @return boolean True if any future entries. * @access public */ function forward() { if ($this->_isEmpty() || $this->_atEnd()) { return false; } $this->_position++; return true; } /** * Ditches all future entries beyond the current * point. * @access private */ function _dropFuture() { if ($this->_isEmpty()) { return; } while (! $this->_atEnd()) { array_pop($this->_sequence); } } } /** * Simulated web browser. This is an aggregate of * the user agent, the HTML parsing, request history * and the last header set. * @package SimpleTest * @subpackage WebTester */ class SimpleBrowser { var $_user_agent; var $_page; var $_history; var $_ignore_frames; var $_maximum_nested_frames; /** * Starts with a fresh browser with no * cookie or any other state information. The * exception is that a default proxy will be * set up if specified in the options. * @access public */ function SimpleBrowser() { $this->_user_agent = &$this->_createUserAgent(); $this->_user_agent->useProxy( SimpleTest::getDefaultProxy(), SimpleTest::getDefaultProxyUsername(), SimpleTest::getDefaultProxyPassword()); $this->_page = &new SimplePage(); $this->_history = &$this->_createHistory(); $this->_ignore_frames = false; $this->_maximum_nested_frames = DEFAULT_MAX_NESTED_FRAMES; } /** * Creates the underlying user agent. * @return SimpleFetcher Content fetcher. * @access protected */ function &_createUserAgent() { $user_agent = &new SimpleUserAgent(); return $user_agent; } /** * Creates a new empty history list. * @return SimpleBrowserHistory New list. * @access protected */ function &_createHistory() { $history = &new SimpleBrowserHistory(); return $history; } /** * Disables frames support. Frames will not be fetched * and the frameset page will be used instead. * @access public */ function ignoreFrames() { $this->_ignore_frames = true; } /** * Enables frames support. Frames will be fetched from * now on. * @access public */ function useFrames() { $this->_ignore_frames = false; } /** * Switches off cookie sending and recieving. * @access public */ function ignoreCookies() { $this->_user_agent->ignoreCookies(); } /** * Switches back on the cookie sending and recieving. * @access public */ function useCookies() { $this->_user_agent->useCookies(); } /** * Parses the raw content into a page. Will load further * frame pages unless frames are disabled. * @param SimpleHttpResponse $response Response from fetch. * @param integer $depth Nested frameset depth. * @return SimplePage Parsed HTML. * @access private */ function &_parse($response, $depth = 0) { $page = &$this->_buildPage($response); if ($this->_ignore_frames || ! $page->hasFrames() || ($depth > $this->_maximum_nested_frames)) { return $page; } $frameset = &new SimpleFrameset($page); foreach ($page->getFrameset() as $key => $url) { $frame = &$this->_fetch($url, new SimpleGetEncoding(), $depth + 1); $frameset->addFrame($frame, $key); } return $frameset; } /** * Assembles the parsing machinery and actually parses * a single page. Frees all of the builder memory and so * unjams the PHP memory management. * @param SimpleHttpResponse $response Response from fetch. * @return SimplePage Parsed top level page. * @access protected */ function &_buildPage($response) { $builder = &new SimplePageBuilder(); $page = &$builder->parse($response); $builder->free(); unset($builder); return $page; } /** * Fetches a page. Jointly recursive with the _parse() * method as it descends a frameset. * @param string/SimpleUrl $url Target to fetch. * @param SimpleEncoding $encoding GET/POST parameters. * @param integer $depth Nested frameset depth protection. * @return SimplePage Parsed page. * @access private */ function &_fetch($url, $encoding, $depth = 0) { $response = &$this->_user_agent->fetchResponse($url, $encoding); if ($response->isError()) { $page = &new SimplePage($response); } else { $page = &$this->_parse($response, $depth); } return $page; } /** * Fetches a page or a single frame if that is the current * focus. * @param SimpleUrl $url Target to fetch. * @param SimpleEncoding $parameters GET/POST parameters. * @return string Raw content of page. * @access private */ function _load($url, $parameters) { $frame = $url->getTarget(); if (! $frame || ! $this->_page->hasFrames() || (strtolower($frame) == '_top')) { return $this->_loadPage($url, $parameters); } return $this->_loadFrame(array($frame), $url, $parameters); } /** * Fetches a page and makes it the current page/frame. * @param string/SimpleUrl $url Target to fetch as string. * @param SimplePostEncoding $parameters POST parameters. * @return string Raw content of page. * @access private */ function _loadPage($url, $parameters) { $this->_page = &$this->_fetch($url, $parameters); $this->_history->recordEntry( $this->_page->getUrl(), $this->_page->getRequestData()); return $this->_page->getRaw(); } /** * Fetches a frame into the existing frameset replacing the * original. * @param array $frames List of names to drill down. * @param string/SimpleUrl $url Target to fetch as string. * @param SimpleFormEncoding $parameters POST parameters. * @return string Raw content of page. * @access private */ function _loadFrame($frames, $url, $parameters) { $page = &$this->_fetch($url, $parameters); $this->_page->setFrame($frames, $page); } /** * Removes expired and temporary cookies as if * the browser was closed and re-opened. * @param string/integer $date Time when session restarted. * If omitted then all persistent * cookies are kept. * @access public */ function restart($date = false) { $this->_user_agent->restart($date); } /** * Adds a header to every fetch. * @param string $header Header line to add to every * request until cleared. * @access public */ function addHeader($header) { $this->_user_agent->addHeader($header); } /** * Ages the cookies by the specified time. * @param integer $interval Amount in seconds. * @access public
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -