注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

淘尽网 官方博客

淘尽网http://www.tao3w.com做最好的比价网站

 
 
 

日志

 
 
关于我

淘尽网 http://www.tao3w.com 做最好的比价网站,做最好的数据抓取专家。

网易考拉推荐

Selenium 常见问题小结  

2012-05-04 13:27:48|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Selenium 具体使用中常见的一些问题:

一、将录制的脚本转成PHPUNIT在服务器端运行总失败。

开始要作如下工作:

1. 在setUp()函数中添加语句:每次脚本运行,都将清空数据库的语句

`/home/www/selenium-php/yuezhan/rebuilddb.sh`;注意:用倒斜杠,数字1左边的键 //根据项目需要而修改;

2.  将默认的浏览器代码修改:

将$this->setBrowser(“*chrome”);

改成 $this->setBrowser(“*firefox”);

可以不用修改代码的方法:

Selenium工具→Options→Options→选择Formats选项卡→选择PHP-PHPUNIT→将Environment里的浏览器改成firefox即可,这样子录制的脚本转化成PHP后,也就不用修改此部分代码了。

3. 在第2点的基础上,在上面添加两句代码:

$this->setHost(“192.168.8.24″);

$this->setPort(4445);          //此句可以不加,根据自己服务器端口而定

4. 录制的脚本中如有上传图片的路径。

也要根据服务器所在的环境作修改。如在同一环境下可不作修改。不在同一环境下,要将图片路径修改成服务器环境中图片所在的路径下。

5. 录制的脚本一定要从登录开始录制。在没有解决COOIKE之前,必须这么做。

运行脚本时,

常见问题1:报错:ERROR: There was an unexpected Alert! [ajax错误].

错误原因:AJAX错误,没有找到ALERT提示的框架,因而报异常错误

解决方法一:$this->click(“css=input[type=submit]“);这是一个“下一步”按钮。

进入的页面中,有AJAX。

可以此句前面添加:setSpeed(1000)让其执行速度变慢1秒。

 

具体php代码:

$this->setSpeed(“1000″)        //从下一句开始,执行速度放慢

$this->click(“css=input[type=submit]“);

$this->waitForPageToLoad(“30000″);

$this->type(“name=player[player1][name]“, “元一”);

$this->setSpeed(“0″)          //恢复到正常执行速度

 

根本的解决方法:

       $this->waitForCondition(“selenium.browserbot.getUserWindow().jQuery.active == 0″, “3000″);       //此处3000,即限定的超时时间timeout。

$this->click(“css=input[type=submit]“);

 

解释waitForCondition用法:

waitForCondition(JavaScriptSnippet,time)

在限定时间内,等待一段JavaScript 代码返回true 值,超时则停止等待

其中”selenium.browserbot.getUserWindow().jQuery.active == 0″这是一段javascript语句,

意思:检查得到的窗体里AJAX的活动数量为0时,则为0即无AJAX活动了,则为真,为真就可以继续向下运行。 反之,在限定的timeout 3秒时间内,活动数仍不为0,则会报错。

常见的框架:

jQuery   : “jQuery.active”

Prototype: “Ajax.activeRequestCount”

Dojo    : “dojo.io.XMLHTTPTransport.inFlight.length

我们用的是jQuery框架,即写成jQuery.actiive

3000是限时3秒。

 

不正确的解决方法:

for ($second = 0; ; $second++)

{   if ($second >= 60) $this->fail(“timeout”);

try {

if ($this->isElementPresent(“css=input[type=submit]“)) break;

}

catch (Exception $e) {}

sleep(1);

}

此处用的方法:waitForElementPresent(locator,variableName)验证指定元素在页面上。

此方法解决AJAX错误时无效。其检验元素的方法,可解决javascript的问题。常见问题4中会详解。

 

常见问题2:服务器连接不上。

解决方法:目前我们服务器上同时只能边接两台机器。所以,这儿的解决方法,只能限于两台哦。

 

常见问题3:超时timeout

错误原因:在服务器上跑,页面加载时间有时会变的慢

解决方法一:页面加载时间修改一下。延长页面加载时间

原语句:  $this->waitForPageToLoad(“30000″);

可更改为: $this->waitForPageToLoad(“60000″);

解决方法二:将运行速度放慢,在页面加载时间前一句加如下语句

$this->setSpeed(“1000″)     //运行速度放慢

当然,页面加载完之后,可以提交接钮语句之后,加如下语句,将运行速度恢复到正常。

$this->setSpeed(“0″)          //恢复到正常执行速度

 

常见问题4登录时,没有发现某个元素。[error] Element id=username not found

如,我们虎扑网站,当前状态为未登录。先点击进入论坛页面。然后点击“登录”,

录制的脚本,在回放中,会错误。没有该元素。

例如录制脚本:

Comand       Target              Value

open          /

click               link=登录

type              id=username          admin

type          id=password          admin

………………

clickAndWait   link=退出

转成PHPUNIT后代码为:

$this->open(“/”);

$this->click(“link=登录”);

$this->type(“id=username”, “admin”);

$this->type(“id=password”, “admin”);

…………

$this->click(“link=退出”);

回放时,到了用户名那一句,就会报无法找到元素的错误。

 

错误原因:登录时,会弹跳出一个登录对话框。此对话框即是Javascript语句写 的。

解决方法:用waitForElementPresent  方法,其方法是检查页面上的元素是否存在。

登录之后的语句,都是JAVASCRIPT语句执行之后出现的。建议检验最后一个可输入元素。

例如录制脚本:

Comand              Target           Value

open                /

click                      link=登录

waitForElementPresent id=password           //此句为添加的辅助代码,检查元素

type                     id=username       adminuser

type                 id=password        adminpwd

………………

clickAndWait         link=退出

转成PHPUNIT后代码为:

$this->open(“/”);

$this->click(“link=登录”);

 for ($second = 0; ; $second++)

{

         if ($second >= 60) $this->fail(“timeout”);    //超过60秒,则报超时错误

          try {

                    if ($this->isElementPresent(“id=password”)) break; //检查用户名这个元素

                  }

         catch (Exception $e) {}

         sleep(1);   

  }

$this->type(“id=username”, “adminuser”);

$this->type(“id=password”, “adminpwd”);

…………

$this->click(“link=退出”);

 

上述中selenium中的waitForElementPresent id=password 这一句,转化成PHPUNIT代码后,即是for循环代码那一段。

在PHPUNIT中也可以直接添加该段代码。且完全可以将for循环代码这一段替换成:

 $this->waitForElementPresent(“id=password”);

   这样单独的一句。完全可以只写这一句,也可以达到检查这个元素的效果。

 

解释waitForElementPresent用法:

waitForElementPresent(locator) 等待指定元素出现在页面上。

 

常见问题5:录制时必须从登录开始录制,那么有没有什么办法可以解决呢。

解决方法:如下PHPUNIT代码:

  <?php

`/home/www/selenium-php/yuezhan/rebuilddb.sh`;   //数据库初始化

 

class HCYZ_LoginTest extends PHPUnit_Extensions_SeleniumTestCase

{

private static $YZLoginCookie;   //定义了一个私有的静态变量,变量名为YZLoginCookie

 

protected function setUp()

{

$this->setHost(“192.168.8.24″);

$this->setPort(4445);

$this->setBrowser(“*firefox”);

$this->setBrowserUrl(“http://kangying.yuezhanerqi.test.hc.sf/”);

}

 

public function testLogin()           //这个类就是测试登录。

{

$this->open(“backend_test.php/om_match”);         //打开后台URL

$this->type(“name=backend_user[username]“, “康莹”);

$this->type(“name=backend_user[password]“, “kangying”);

$this->click(“css=input.button”);

$this->waitForPageToLoad(“30000″);

self::$YZLoginCookie = $this->getCookieByName(“symfony”);  //下面详细解释。

}

 

public function testOmMatch()         //这个类就是测试约战二期的。

{

$this->open(“backend_test.php/om_match”);    //要注意这儿要先打开约战二期的URL

$this->createCookie(“symfony=”.self::$YZLoginCookie, “path=/”);     //下面详细解释

$this->open(“backend_test.php/om_match”);    //注意,创建完COOKIE要再打开下URL

}

}

解释下面两句:

1.   self::$YZLoginCookie = $this->getCookieByName(“symfony”);

Symfony这个参数是SESSION名。

getCookieByName  这是一个取得Cookie值的方法。

并将取的到值放到YZLoginCookie变量中。

因为YZLoginCookie变量是私有的。

在PHPUNIT中,私有变量的引用就这么写:self::$变量名

这个我们不要太懂。就记住,定义变量时用的是private,那么用这个变量时,前面加Self::(注意:这儿的两个冒号,必须是半角状态下的冒号)就可以了。

 

2.   $this->createCookie(“symfony=”.self::$YZLoginCookie, “path=/”);

        createCookie() 这个就是创建Cookie的方法

它的参数是刚刚self::$YZLoginCookie变量中的值。将其创建好的Cookie存放到path=/ 这个路径下

 

常见问题6: 运行PHPUNIT代码时报类似如下错:

Failed asserting that <boolean:false> is true.

错误原因:此处错误存在于断言检查中。检查出来返回的值是失败的。

解决方法:

1. 检查断言语句是没有放错位置。应将语句放置要检查代码的上一行

2. 主要检查引号中里面的语句有无错误。

比如:$this->waitForElementPresent(“必须填写”);

这里面与页面中有出入。应为:$this->waitForElementPresent(“必需填写”);

再比如:$this->waitForElementPresent(“css=input[typ=button");

这里应该为: $this->waitForElementPresent("css=input[type=button]“);

少了右边的中括号,还有type的e

先看有没有少写了括号或中括号;再来检查单词有无编写错误。以及有无错别字的错误。

 

常见问题7: 运行PHPUNIT代码时报类似如下错:

Parse error: syntax error, unexpected T_IF in /home/www/selenium-php/zhaomu.php on line 44

错误原因:第44行。提示有代码错误。

解决方法:

检查第44行以及44附近的行。

先看有没有少写了分号;然后看编写或复制代码时,有无加了代码行的编号(即代码前的数字);最后检查单词有无编写错误。

 

常见问题8:运行PHPUNIT代码时报类似如下错:

PHPUnit_Framework_Exception: Response from Selenium RC server for testComplete().

ERROR: There were no alerts.

错误原因:PHPUNIT中框架异常出错。

它找的错误原因,没有Alert。

这里alert是一个提示信息,一般出现在当前窗体中以弹层方式显示的确认对话框。

解决方法:在确认对话框提示代码的上一行,添加一段等待审核提示信息即可。

方法一、可以直接在selenium中,在弹出提示框代码的上一行。

例如录制脚本:

Comand             Target                       Value

open                /backend_test.php/om_match

click                    link=招募

………………

click                css=input[type=button]

  waitForAlertPresent                         //此句添加断言,等待警告/提示框

assertAlert           请等待信息审核

………………

保存,转成PHPUNIT后代码为:

$this->open(“/backend_test.php/om_match “);

$this->click(“link=招募”);

……………………

$this->click(“css=input[type=button]“);

             for ($second = 0; ; $second++)

    {

        if ($second >= 60) $this->fail(“timeout”);

        try

            {

               if ($this->isAlertPresent()) break;   //检查Alert警告/提示框

              }

        catch (Exception $e) {}

        sleep(1);

    }

$this->assertEquals(“请等待信息审核”, $this->getAlert());

上述中selenium中的waitForAlertPresent 这一句,转化成PHPUNIT代码后,即是for循环代码那一段。

方法二、在PHPUNIT中也可以直接添加该段代码。且完全可以将for循环代码这一段替换成: $this-> waitForAlertPresent ();这样单独的一句。

完全可以只写这一句,也可以达到检查这个元素的效果。

***注意:参数为空

 

解释waitForAlertPresent用法:

waitForAlertPresent ( ) 等待警告/提示出现。注意,参数为空

 

如何在自动化测试中生成代码覆盖报告?

解决方法:

在PHPUNIT测代码中加入如下两个语句:

protected $coverageScriptUrl = ‘http://www.liangle.com/phpunit_coverage.php’;

和$this->open(“/phpunit_coverage.php?PHPUNIT_SELENIUM_TEST_ID=yz”);

 

将代码加哪到呢?

如下例子:

如我录制好代码,转换成phpunit代码。命名为liangle-ccov.php

现在我们为liangle-ccov.php添加完测试代码之后为:

<?php

class Example extends PHPUnit_Extensions_SeleniumTestCase

{

protected $coverageScriptUrl = ‘http://www.liangle.com/phpunit_coverage.php’; //加入第一句,下面会详细解释。

 

protected function setUp()

{

$this->setHost(“192.168.8.24″);

$this->setPort(4445);

$this->setBrowser(“*firefox”);

$this->setBrowserUrl(“http://www.liangle.com/”);

}

 

public function testMyTestCase()         //这个类测试 我的测试集

{

$this->open(“/phpunit_coverage.php?PHPUNIT_SELENIUM_TEST_ID=yz”);  //加入第二句

$this->open(“/backend_test.php”);

$this->type(“name=backend_user[username]“, “康莹”);

$this->type(“name=backend_user[password]“, “kangying”);

$this->click(“css=input.button”);

$this->waitForPageToLoad(“30000″);

}

}

?>

添加完之后,保存,退出。

 

解释:

1.  protected $coverageScriptUrl = ‘http://www.liangle.com/phpunit_coverage.php’;

    定义一个受保护的变量,变量名为 coverageScriptUrl,用以存放 代码测试的接口路径,

 

2.  $this->open(“/phpunit_coverage.php?PHPUNIT_SELENIUM_TEST_ID=yz”);

此句含义为:打开测试路径。

PHPUNIT_SELENIUM_TEST_ID=yz  即时识别哪个项目的ID,后面yz可省略不写,此处可为空。 yz即约战,有便于识别哪个项目。

 

如何操作?

和平时运行phpunit用例脚本一样。

原本我们执行:phpunit liangle-ccov.php

现在这么执行:phpunit53 –coverage-html llcov liangle-ccov.php

 

其中: phpunit53       为版本号,这儿用的是5.3.版本,就这么写吧。

–coverage-html   为生成代码覆盖报告 的命令开关

llcov            为存放报告文件的文件夹名

liangle-ccov.php   为执行的用例脚本名称

 

如何查看代码测试的 代码覆盖报告?

直接地址栏输入访问地址,

地址的构成:40环境下访问地址+存放生成文件的文件夹名+index.html

则输入地址:http://www.liangle.com/llcov/index.html

 

(备注:http://www.liangle.com 为40环境下的访问地址,这需要系统部 部署好测试环境)

如有其他学习中遇到问题,如何解决,有待我们继续更新……


  评论这张
 
阅读(1777)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017