AChecker + Selenium2对需要登录的页面进行自动化可访问性测试

前言:这段时间还算比较空闲,我准备把过去做过的有些形形色色,甚至有些奇怪的研究总结一下,也许刚好有人用的着也不一定,不枉为之抓耳挠腮的时光和浪费的电力。

 

名词解释:

网站可访问性测试:国内基本没有什么开展,简单又不太科学地说,就是让盲人,色弱,聋哑人也可以访问的网站。网站只有符合很多的编码和布局标准,屏幕阅读器才能很好地帮助残疾人访问这个网站。在美国,可访问性是立法了的,政府或者政府资助的网站,必须符合一定的可访问性标准,即所谓的508 section。

AChecker:一个php的,开源的,在线可访问性检查工具。和所有其他的在线可访问性检查工具一样,它没办法检查需要登录的页面。但是好在它开源,我们可以修改它的源代码来达到目的,这就是本文的主旨.

AChecker源码可以从这里获取:http://www.atutor.ca/achecker/download.php

 

部署Achecker

首先的首先,你需要下载AChecker的源码进行部署,这个就不具体讲了,我是部署在WampServer上的,地址是localhost:8080

 

1,首先,我们需要用Selenium2来对你需要测试的网站进行登录(这一步的代码就省略了),然后获取登录后页面的cookie

//这里省略登录操作代码若干行
//...

String url = "the_page_url_which_can_access_after_login";
String cookie = ExtractCookie(url);
public String ExtractCookie(String url)
        {
            //get the cookie which contains login information
            string cookie = "Cookie: ";
            foreach (OpenQA.Selenium.Cookie c in driver.Manage().Cookies.AllCookies)
            {
                if (url.Contains(c.Domain))
                {
                    cookie += c.Name + "=" + c.Value + "; ";
                }
            }
            // cookie += "domain=limeade.info; expires=Sun, 10-Jan-2016 08:43:06 GMT; path=/";
            return cookie;
        }

 

2, 对AChecker源代码修改。我们需要对AChecker提供的RESTful Api进行一些修改,增加一个参数,用于传递cookie。找到checkacc.php文件,做如下修改(粗体标出)

//前面省略N行
// 。。。

$uri = trim(urldecode($_REQUEST['uri']));
$web_service_id = trim($_REQUEST['id']);
$guide = trim(strtolower($_REQUEST['guide']));
$output = trim(strtolower($_REQUEST['output']));
$offset = intval($_REQUEST['offset']);
$cookie = trim(urldecode($_REQUEST['cookie']));

// initialize defaults for the ones not set or not set right but with default values
if ($output <> 'html' && $output <> 'rest') 
    $output = DEFAULT_WEB_SERVICE_OUTPUT;
// end of initialization

// validate parameters
if ($uri == '')
{
    $errors[] = 'AC_ERROR_EMPTY_URI';
}
else
{
    if (Utility::getValidURI($uri) === false) $errors[] = 'AC_ERROR_INVALID_URI';
}

if ($web_service_id == '')
{
    $errors[] = 'AC_ERROR_EMPTY_WEB_SERVICE_ID';
}
else
{ // validate web service id
    $usersDAO = new UsersDAO();
    $user_row = $usersDAO->getUserByWebServiceID($web_service_id);

    if (!$user_row) $errors[] = 'AC_ERROR_INVALID_WEB_SERVICE_ID';
    
    $user_id = $user_row['user_id'];
}

// return errors
if (is_array($errors))
{
    if ($output == 'rest') {
        header('Content-type: text/xml');
        echo RESTWebServiceOutput::generateErrorRpt($errors);
    } else {
        echo HTMLRpt::generateErrorRpt($errors);
    }
    
    exit;
}

// generate guidelines
$guides = explode(',',$guide);

$guidelinesDAO = new GuidelinesDAO();
foreach ($guides as $abbr)
{
    if ($abbr == '') continue;

    $row = $guidelinesDAO->getEnabledGuidelinesByAbbr($abbr);

    if ($row[0]['guideline_id'] <> '') $gids[] = $row[0]['guideline_id'];
}

// set to default guideline if no input guidelines
if (!is_array($gids)) $gids[] = DEFAULT_GUIDELINE;

// retrieve user link ID
$userLinksDAO = new UserLinksDAO();
$user_link_id = $userLinksDAO->getUserLinkID($user_id, $uri, $gids);

// set new session id
$userLinksDAO->setLastSessionID($user_link_id, Utility::getSessionID());

// validating uri content
// Create a stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>$cookie
  )
);
$context = @stream_context_create($opts);
$validate_content = @file_get_contents($uri, false, $context);

if (isset($validate_content))

//后面省略N行
// 。。。

 

3,调用修改后的API,去请求一个需要登录的网页,进行可访问性测试 --

//request string
    string request = "http://localhost:8080/checkacc.php" +
        "?uri=" + HttpUtility.UrlEncode(url) +
        "&id=" + HttpUtility.UrlEncode("3ed23fc9d02d24fe4aa72cf63202076dae7a12fd") +
        "&output=html" +
        "&guide=" + "508,WCAG2-AA" +
        "&cookie=" + HttpUtility.UrlEncode(cookie);

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(request);
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
    StreamReader reader = new StreamReader(resp.GetResponseStream());
    String html = reader.ReadToEnd();

这里稍微解释一下RESTful API中各个参数

uri : 就是你要进行可访问性测试的页面

id : web service服务id,需要在你自己部署的AChecker上注册一个用户,然后在profile页面就会给你一个id

output:测试结果的返回方式,html或者xml

guide:根据哪个标准进行测试,这里选了508和WCAG2-AA这2个可访问性标准。

cookie:就是我们自己加的参数。

 

最后结果放在了String html中,把它保存到.htm文件中就能看到测试结果了。

posted @ 2015-12-27 18:34  Binhua Liu  阅读(2311)  评论(0编辑  收藏  举报