511 lines
13 KiB
PHP
511 lines
13 KiB
PHP
<?php
|
|
/* Set the error reporting. */
|
|
error_reporting(E_ALL);
|
|
|
|
/* 设置常量和常用目录路径 */
|
|
define('RUN_MODE', 'uitest');
|
|
$zentaoRoot = dirname(__FILE__, 3) . '/';
|
|
$configRoot = $zentaoRoot . 'test/config/';
|
|
$frameworkRoot = $zentaoRoot . 'framework' . '/';
|
|
|
|
if($argc > 1 && $argv[1] == '-extract')
|
|
{
|
|
include 'parseztfstep.php';
|
|
printSteps();
|
|
exit;
|
|
}
|
|
|
|
/* Load the framework. */
|
|
include $frameworkRoot . 'router.class.php';
|
|
include $frameworkRoot . 'control.class.php';
|
|
include $frameworkRoot . 'model.class.php';
|
|
include $frameworkRoot . 'helper.class.php';
|
|
|
|
/* 初始化禅道框架 */
|
|
$app = router::createApp('pms', dirname(__FILE__, 3), 'router');
|
|
$uiTester = $app->loadCommon();
|
|
|
|
/* 加载框架配置项 */
|
|
include $configRoot . 'config.php';
|
|
|
|
/* 加载框架基础类 */
|
|
include 'result.class.php'; // 加载用例执行结果处理类
|
|
include 'page.class.php'; // 加载页面元素类
|
|
include 'yaml.class.php'; // 加载测试数据处理类
|
|
include 'webdriver/webdriver.class.php'; // 加载php-webdriver类
|
|
|
|
/**
|
|
* Save variable to $_result.
|
|
*
|
|
* @param mixed $result
|
|
* @access public
|
|
* @return bool true
|
|
*/
|
|
function r($testResult)
|
|
{
|
|
global $_result;
|
|
$_result = $testResult;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Print value or properties.
|
|
*
|
|
* @param string $index
|
|
* @param string $delimiter
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function p($index = '', $delimiter = ',')
|
|
{
|
|
global $_result;
|
|
|
|
/* Print $_result. */
|
|
if($index === '') return print_r($_result) . "\n";
|
|
|
|
$keywords = explode(';', $index);
|
|
foreach($keywords as $keyword)
|
|
{
|
|
$resultList = getValuesByKeyword($_result, $keyword, $delimiter);
|
|
if(!is_array($resultList)) continue;
|
|
|
|
foreach($resultList as $result) echo $result . "\n";
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get values by keyword.
|
|
*
|
|
* @param mixed $result
|
|
* @param string $keyword
|
|
* @param string $delimiter
|
|
* @access public
|
|
* @return int|array
|
|
*/
|
|
function getValuesByKeyword($result, $keyword, $delimiter)
|
|
{
|
|
$index = -1;
|
|
$pos = strpos($keyword, ':');
|
|
if($pos)
|
|
{
|
|
$index = substr($keyword, 0, $pos);
|
|
$keyword = substr($keyword, $pos + 1);
|
|
}
|
|
|
|
$keys = explode($delimiter, $keyword);
|
|
if($index != -1)
|
|
{
|
|
if(is_array($result))
|
|
{
|
|
if(!isset($result[$index])) return print("Error: Cannot get index $index.\n");
|
|
$result = $result[$index];
|
|
}
|
|
else if(is_object($result))
|
|
{
|
|
if(!isset($result->$index)) return print("Error: Cannot get index $index.\n");
|
|
$result = $result->$index;
|
|
}
|
|
else
|
|
{
|
|
return print("Error: Not array, cannot get index $index.\n");
|
|
}
|
|
}
|
|
|
|
$values = array();
|
|
foreach($keys as $key) $values[] = zget($result, $key, '');
|
|
|
|
return $values;
|
|
}
|
|
|
|
/**
|
|
* Expect values, ztf will put params to step.
|
|
*
|
|
* @param string $exepect
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function e()
|
|
{
|
|
}
|
|
|
|
class tester extends result
|
|
{
|
|
public $webdriver;
|
|
public $page;
|
|
public $config;
|
|
public $cookieFile;
|
|
public $lang;
|
|
|
|
/**
|
|
* Initialize the basic configuration of the ui test framework.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function __construct()
|
|
{
|
|
global $config;
|
|
$this->config = $config;
|
|
|
|
$this->webdriver = new webdriver($config->uitest->chrome);
|
|
$this->page = new page($this->webdriver);
|
|
$this->cookieFile = '/tmp/cookie';
|
|
|
|
// 设置异常处理函数
|
|
if($this->config->uitest->setExceptionHandler) set_exception_handler(array($this, 'exceptionHandler'));
|
|
}
|
|
|
|
/**
|
|
* Exception handler.
|
|
*
|
|
* @param object $e
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function exceptionHandler($e)
|
|
{
|
|
print("异常信息: \n");
|
|
print($e->getMessage() . "\n");
|
|
|
|
if($this->config->uitest->exitBrowserOnException) $this->closeBrowser();
|
|
}
|
|
|
|
/**
|
|
* Login to the test URL.
|
|
*
|
|
* @param string $account
|
|
* @param string $password
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function login($account = '', $password = '')
|
|
{
|
|
if(!$account) $account = $this->config->uitest->defaultAccount;
|
|
if(!$password) $password = $this->config->uitest->defaultPassword;
|
|
$webRoot = $this->getWebRoot();
|
|
|
|
$this->page->openURL($webRoot)->deleteCookie()->refresh();
|
|
|
|
if($this->config->uitest->langClient == 'en')
|
|
{
|
|
$this->page->deleteCookie('lang');
|
|
$cookie = array();
|
|
$cookie['lang'] = 'en';
|
|
$this->addCookie($webRoot, $cookie);
|
|
$this->page->refresh()->wait(1);
|
|
}
|
|
|
|
$this->checkError();
|
|
|
|
$this->page->dom->account->setValue($account);
|
|
$this->page->dom->password->setValue($password);
|
|
$this->page->dom->submit->click();
|
|
|
|
$this->page->saveCookie($this->cookieFile);
|
|
|
|
sleep(1);
|
|
if(empty($this->lang)) $this->initLang();
|
|
|
|
return $this->page;
|
|
}
|
|
|
|
/**
|
|
* Add a cookie in test site.
|
|
*
|
|
* @param string $webRoot
|
|
* @param array $cookie eg:array('lang' = 'zh-cn')
|
|
* @param bool $clear
|
|
* @access public
|
|
* @return bool|object
|
|
*/
|
|
public function addCookie($webRoot, $cookie, $clear = true)
|
|
{
|
|
if(empty($cookie) || !is_array($cookie)) return false;
|
|
|
|
if($clear) $this->page->openURL($webRoot)->deleteCookie();
|
|
|
|
/* Set path, domain and secure for cookie. */
|
|
$fullCookie['name'] = key($cookie);
|
|
$fullCookie['value'] = current($cookie);
|
|
$fullCookie['path'] = '/';
|
|
$fullCookie['domain'] = parse_url($webRoot, PHP_URL_HOST);
|
|
$fullCookie['secure'] = false;
|
|
$this->page->addCookie($fullCookie);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Switch a zentao vision.
|
|
*
|
|
* @param string $vision
|
|
* @param int $waitTime
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function switchVision($vision, $waitTime = 2)
|
|
{
|
|
if(empty($this->lang->visionList->{$vision})) return false;
|
|
$visionName = $this->lang->visionList->{$vision};
|
|
|
|
$this->page->wait(2);
|
|
$this->page->dom->switchToIframe();
|
|
$this->page->dom->visionSwitcher->click();
|
|
$this->page->wait(2);
|
|
$this->page->dom->btn($visionName)->click();
|
|
|
|
$this->page->wait($waitTime);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get cookie value in cookie file.
|
|
*
|
|
* @param string $cookieName
|
|
* @access public
|
|
* @return bool|string
|
|
*/
|
|
public function getCookieValueFromFile($cookieName)
|
|
{
|
|
if(!file_exists($this->cookieFile)) return false;
|
|
|
|
$cookies = json_decode(file_get_contents($this->cookieFile), true);
|
|
if(empty($cookies)) return false;
|
|
|
|
foreach($cookies as $cookie) if($cookie['name'] == $cookieName) return $cookie['value'];
|
|
}
|
|
|
|
/**
|
|
* Open a test URL.
|
|
*
|
|
* @param string $module
|
|
* @param string $method
|
|
* @param array $params
|
|
* @param string $iframeID
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function openURL($module, $method, $params = array(), $iframeID = '')
|
|
{
|
|
if(!$module || !$method) return;
|
|
$this->module = $module;
|
|
$this->method = $method;
|
|
$webRoot = $this->getWebRoot();
|
|
|
|
if($this->config->requestType == 'GET')
|
|
{
|
|
$url = "index.php?m=$module&f=$method";
|
|
if(!empty($params)) foreach($params as $key => $value) $url .= "&$key=$value";
|
|
}
|
|
else
|
|
{
|
|
$url = "$module-$method";
|
|
if(!empty($params)) foreach($params as $value) $url .= "-$value";
|
|
$url .= ".html";
|
|
}
|
|
|
|
if(!$this->page->getCookie('zentaosid'))
|
|
{
|
|
$zentaosid = $this->getCookieValueFromFile('zentaosid');
|
|
$this->addCookie($webRoot, array('zentaosid' => $zentaosid));
|
|
$this->page->refresh()->wait(1);
|
|
}
|
|
$this->page->openURL($webRoot . $url);
|
|
|
|
$appIframeID = $iframeID ? $iframeID : "appIframe-{$module}";
|
|
$this->page->wait(1);
|
|
$this->checkError($appIframeID);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set up a test page.
|
|
*
|
|
* @param string $module
|
|
* @param string $method
|
|
* @param string $ext
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function loadPage($module = '', $method = '', $ext = '')
|
|
{
|
|
if($this->module && !$module) $module = $this->module;
|
|
if($this->method && !$method) $method = $this->method;
|
|
$edition = $this->config->edition;
|
|
|
|
$method = strtolower($method);
|
|
$pageClass = "{$method}Page";
|
|
|
|
$openPage = dirname(__FILE__, 3). "/module/$module/test/ui/page/$method.php";
|
|
if(!class_exists($pageClass))
|
|
{
|
|
if($edition != 'open')
|
|
{
|
|
if(!$ext) $ext = $edition;
|
|
if(file_exists($openPage))
|
|
{
|
|
include $openPage;
|
|
}
|
|
else
|
|
{
|
|
$extDir = is_dir(dirname(__FILE__, 3). "/extension/$ext/$module/ext/test") ? dirname(__FILE__, 3). "/extension/$ext/$module/ext/test" : dirname(__FILE__, 3). "/extension/$ext/$module/test";
|
|
include "$extDir/ui/page/$method.php";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
include $openPage;
|
|
}
|
|
}
|
|
|
|
$methodPage = new $pageClass($this->webdriver);
|
|
$this->pageObject = $methodPage;
|
|
|
|
return $methodPage;
|
|
}
|
|
|
|
/**
|
|
* Visit a form test page.
|
|
*
|
|
* @param int $module
|
|
* @param int $method
|
|
* @param array $params
|
|
* @param string $iframeID
|
|
* @param string $ext
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function initForm($module, $method, $params = array(), $iframeID = '', $ext = '')
|
|
{
|
|
$this->openURL($module, $method, $params, $iframeID);
|
|
return $this->loadPage($module, $method, $ext);
|
|
}
|
|
|
|
/**
|
|
* Screenshoot in page.
|
|
*
|
|
* @param string $imageFile
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function screenshot($imageFile = '')
|
|
{
|
|
if(!$imageFile) $imageFile = $this->config->uitest->captureRoot;
|
|
return $this->page->capture($imageFile);
|
|
}
|
|
|
|
/**
|
|
* Check errors in page.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function checkError($iframeID = '')
|
|
{
|
|
$errors = $this->page->dom->getErrorsInPage($iframeID);
|
|
if(!empty($errors))
|
|
{
|
|
$this->errors = $errors;
|
|
$this->screenshot();
|
|
}
|
|
|
|
return $errors;
|
|
}
|
|
|
|
/**
|
|
* Get web root in test site.
|
|
*
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
public function getWebRoot()
|
|
{
|
|
return rtrim($this->config->uitest->webRoot, '/') . '/';
|
|
}
|
|
|
|
/**
|
|
* Init langage file on login test site.
|
|
*
|
|
* @access public
|
|
* @return bool
|
|
*/
|
|
public function initLang()
|
|
{
|
|
$webRoot = $this->getWebRoot();
|
|
if(!$webRoot) return false;
|
|
if(!$this->config->uitest->langClient) return false;
|
|
$langClient = $this->config->uitest->langClient;
|
|
|
|
$langFile = '/tmp/lang_' . $langClient . '_' . str_replace('.', '_', parse_url($webRoot, PHP_URL_HOST));
|
|
if(file_exists($langFile))
|
|
{
|
|
$this->lang = json_decode(file_get_contents($langFile));
|
|
return true;
|
|
}
|
|
|
|
$zentaosid = $this->getCookieValueFromFile('zentaosid');
|
|
if($zentaosid)
|
|
{
|
|
$url = $webRoot . "api.php/v1/langs?modules=all&lang={$langClient}&zentaosid={$zentaosid}";
|
|
$header = array('Cookie: device=desktop; lang=' . $langClient . '; theme=default; zentaosid=' . $zentaosid);
|
|
|
|
$response = common::http($url, null, array(), $header);
|
|
if(empty($response)) return false;
|
|
|
|
$this->lang = json_decode($response);
|
|
file_put_contents($langFile, $response);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check fields tip in form page.
|
|
*
|
|
* @param string $module
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function checkFormTips($module)
|
|
{
|
|
$tips = $this->page->dom->getFormTips();
|
|
if(empty($tips)) return false;
|
|
|
|
foreach($tips as $field => $tip)
|
|
{
|
|
if(strpos($tip, '|') !== false) list($tip, $fieldValue) = explode('|', $tip);
|
|
$field = trim(preg_replace('/Tip$/', '', $field), '[]');
|
|
if(!isset($this->lang->{$module}->{$field})) return false;
|
|
|
|
$field = $this->lang->{$module}->{$field};
|
|
|
|
$checkList = array();
|
|
$checkList[] = sprintf($this->lang->error->notempty, $field);
|
|
if(isset($fieldValue))
|
|
{
|
|
$checkList[] = sprintf($this->lang->error->unique, $field, $fieldValue);
|
|
$checkList[] = sprintf($this->lang->error->repeat, $field, $fieldValue);
|
|
}
|
|
|
|
if(!in_array($tip, $checkList)) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Close the Browser.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function closeBrowser()
|
|
{
|
|
$this->page->closeBrowser();
|
|
}
|
|
}
|