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

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

修改Selenium源码,实现自定义API  

来自尘泥   2012-07-11 17:46:58|  分类: 自动化测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

背景介绍:

在我们的项目中使用了Selenium GridGrid入门参见:http://qa.blog.163.com/blog/static/190147002201231251321911/)来实现WebUI用例的分布式执行。

Grid控制之下可以在不同的测试机上为我们的测试用例分配须要的浏览器,框架如下图所示:

在代码端(测试用例端)会new多个RemoteWebDriver对象,RemoteWebDriver对象所实际映射的浏览器则由Grid Hub统一提供,Grid Hub手底下有多个Grid Node,这些Node是分布在不同测试机上的Java进程,Node可以操纵所在测试机的浏览器。这样,RemoteWebDriver对象所要求的浏览器动作,如:打开页面,点击等,就经由Hub转发至某一个Node,并有Node去操纵一个浏览器完成动作。

修改Selenium源码,实现自定义API - 网易杭州QA - 网易杭州 QA Team
 

但是,Selenium Grid本身提供的功能只能让我们操纵测试机上的浏览器,浏览器其外的动作就不行了。比如说,我需要系统级的截屏,键鼠动作等,Grid就做不了,这样一来,在一定程度上限制了用例的灵活性。因此,我们考虑修改Selenium源码注入一个自定义API来实现对测试机上浏览器以外的动作的实现。具体而言,就是在RemoteWebDriver 加入一个函数( public void neCommand(String myCommand) )用于在Grid Node上执行windows cmd命令(如上图所示),有了cmd控制权,就可以干很多事情了,呵呵:)

运行原理:
Grid模式下,RemoteWebDriver将操作命令发送给Grid HubHub将命令转发给某一个NodeNode再驱动所在测试机去执行cmd命令,再经由cmd执行更多动作。

实现思路:
1.
先在Grid模式下运行一个用例,根据Node节点打印的Log信息找出相关代码所在;
2.
阅读理解相关代码,仿照现有函数实现自定义函数。

具体实现,修改4个类,加入1个类,依次如下:
1.
修改类 org.openqa.selenium.remote.DriverCommand
补充一行命令定义:

修改Selenium源码,实现自定义API - 网易杭州QA - 网易杭州 QA Team
 

2.修改类 org.openqa.selenium.remote.HttpCommandExecutor
这里也是补充一行命令定义:

修改Selenium源码,实现自定义API - 网易杭州QA - 网易杭州 QA Team
 

3.修改类 org.openqa.selenium.remote.RemoteWebDriver
补充一个函数,输入参数:一句cmd命令,它将被转发至Grid Node上去执行:

修改Selenium源码,实现自定义API - 网易杭州QA - 网易杭州 QA Team
 

4.修改类 org.openqa.selenium.remote.server.DriverServlet
补充一个Servlet映射,把第三点中的操作绑定到指定servlet:

修改Selenium源码,实现自定义API - 网易杭州QA - 网易杭州 QA Team
 

5.补充类 org.openqa.selenium.remote.server.handler.interactions.NeCommand
Grid Node
在此(一个Servlet)实现cmd操作:

package org.openqa.selenium.remote.server.handler.interactions;

import org.openqa.selenium.remote.server.JsonParametersAware;

import org.openqa.selenium.remote.server.Session;

import org.openqa.selenium.remote.server.handler.WebDriverHandler;

import org.openqa.selenium.remote.server.rest.ResultType;

import java.io.IOException;

import java.util.Map;


/**

 * 实现自定义命令

 *             - ChenKan

 *             - 2012/06/12

 */

public class NeCommand extends WebDriverHandler implements JsonParametersAware {

    String myCommand;

    public NeCommand(Session session) {

        super(session);

    }

    public ResultType call() throws Exception {

        callExe();

        return ResultType.SUCCESS;

    }


    @Override

    public String toString() {

        return "--- myCommand --- " + myCommand;

    }

    private void callExe() {

        String cmd = myCommand;

        Process p = null;

        try {

            p = Runtime.getRuntime().exec(cmd);

        } catch (IOException e) {

            e.printStackTrace();

        }

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

         p.destroy();

    }


    public void setJsonParameters(Map<String, Object> allParameters) throws Exception {

        myCommand = (String) allParameters.get("myCommand");

        System.out.println("--- myCommand --- " + myCommand);

    }

}

说明:

1.基本上只要理解了Selenium中关于Grid实现的代码就可以照样画葫芦了。
2.基于Selenium源码版本2.20.0
3.Grid Hub
只起消息转发功能,未修改其代码。
4.
已实验验证运行正常。
5.
实现将cmd命令传输至Grid Node,更多的扩展可以依靠完善一个.exe文件实现,无须再改动Selenium

 

  评论这张
 
阅读(2038)| 评论(2)
推荐 转载

历史上的今天

评论

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

页脚

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