Selenium 使用 selenium,testng,gradle 和 jenkins 构建一个运行与多浏览器的 WEB 自动化框架

dy20082250 · 2017年12月17日 · 最后由 dy20082250 回复于 2017年12月18日 · 2164 次阅读

1,首先是对于 selenium 的封装,毕竟直接使用 selenium 的 api 对于后期脚本的维护以及测试脚本的稳定性控制都是坑
封装的策略非常粗暴,如下:

public void sendkeys(WebElement we, String key){
       for(int i = 1; i <= RETRY_TIME; i++){
           try{
               we.sendKeys(key);
               break;
           }
           catch(Exception e){
               LogUtil.warn("Sendkeys to WebElement Failed, Retry (" + i + "/" + RETRY_TIME + ") Times After " + RETRY_WAIT + "Seconds");
               SysUtil.sleep(RETRY_WAIT);
               if(i == RETRY_TIME){
                   throw e;
               }
           }
       }
   }

每个动作如果出错,重复尝试 RETRY_TIME,两次之间的间隔是 RETRY_WAIT
这两个参数都是全局的,是配置到配置文件中的。

其他 api 采用类似的方法。

2,testng 的接口监听封装
主要是对于 onTestStart,onTestFailure,onTestSkipped,onTestSuccess 这些函数进行 overwrite

3,测试报告,采用的是记录测试步骤,测试步骤详情和测试步骤结果,并最终汇聚单个测试用例结果的方式

4,元素定位剥离
使用 yaml 的方式按照模块统一管理 xpath,id,name 等等
然后使用 ymal 解析包,进行二次封装,网上这种方式还算是比较流行

5,gradle 控制脚本的运行及其与 jenkins 的结合

使用 gradle clean test -Pbrowser="firefox"这种方式将目标浏览器传入到 java 中
然后 java 使用 System.getProperty 的方式获取用户设定,去构建相应的浏览器 driver

最后在 jenkins master 中创建 job,采用定时触发的机制,使得脚本能够分别运行在 chrome firefox,ie 和 safari 上面

目前这个方法有一个不好的地方在于,我在 jenkins master 中需要分别构建四个 job
我感觉这四个 job 之间的重复性很大,应该是可以合并成一个或者两个 (windows 和 mac)

只是暂时没有想出更好的办法来,大家如果有什么建议,请留言。
如果似懂不懂,似是而非,请免开尊口。

共收到 3 条回复 时间 点赞

欢迎同行来指教。

一个 job 可以试下 selenium grid:
http://jarvi.iteye.com/blog/1571262
http://jarvi.iteye.com/blog/1569302

思路: 在 testng.xml 里把所有测试重复 n 遍 (根据浏览器数量),配置不同的浏览器标志, 然后使用 testng 并发执行, grid 会把所有测试分发到对应的浏览器上。

matt gong 回复

早就听说过 grid,一直没有尝试

谢谢,这次好好试一下。如果过程中存在什么问题

还请多多指教!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册