上一篇文章介绍了Selenium1.0的历史及工作原理, 现在,接着上一次的内容说2.0的由来及设计架构。

就在Selenium1.0处于开发阶段的同时,另一款浏览器自动化框架WebDriver也正在ThoughtWorks公司的酝酿之中。WebDriver项目的初衷是把端对端测试与底层测试工具隔离开。通常情况下,这种隔离手段通过适配器(Adapter)模式完成。WebDriver正是来源于该方法在许多项目上的不断实践应用,最初是HtmlUnit的封装,工具发布后很快开始支持Internet Explorer和Firefox。WebDriver的最初代码在2007年初发布。

在WebDriver最初发布时,与Selenium RC存在显著差异,尽管它们都属于浏览器自动化的API工具。对于用户来说,最明显的区别在于Selenium RC提供基于字典的API,所有方法都在一个类中开放,而WebDriver的API更面向对象。此外,WebDriver仅支持Java,而Selenium RC提供广泛的语言支持。技术差异也很明显:Selenium Core(RC的基础)基本上是JavaScript应用,运行在浏览器的安全沙箱之内。WebDriver则尝试原生绑定到浏览器中,绕开了浏览器的安全模型,代价就是框架自身的开发投入显著增加。

在2009年8月,两个项目宣布合并,Selenium WebDriver就是合并的成果。

WebDriver的创建者Simon Stewart早在2009年8月的一份邮件中解释了项目合并的原因:

为何把两个项目合并?部分原因是WebDriver解决了Selenium存在的缺点(比如,能够绕过JS沙箱。我们有出色的API),部分原因是 Selenium解决了WebDriver存在的问题(例如支持广泛的浏览器),部分原因是因为Selenium的主要贡献者和我都觉得合并项目是为用户提供最优秀框架的最佳途径。

目前,WebDriver支持的语言绑定包括Java、C#、Python和Ruby。它支持Chrome、Firefox、Opera和移动端Android、iPhone浏览器。此外,还有其他关联项目,不在同一源代码库中维护,但是和主项目(Selenium WebDriver)紧密合作,例如提供Perl绑定支持、BlackBerry浏览器支持,以及“无头”WebKit——用于持续集成的测试其无法正常显示的情况。最初的Selenium RC机制仍然维持,帮助WebDriver在浏览器不受支持的情况下提供支持。

在两个项目合并中出现了哪些架构方面的问题?学到了哪些经验和教训?Simon Stewart在《The Architecture of Open Source Applications》一文中做了详细的描述,本文参考了以下内容:

http://www.aosabook.org/en/selenium.html

http://www.infoq.com/cn/news/2011/07/selenium-arch-2

处理复杂性

软件是模块构造起来的。这些模块很复杂,作为API的设计人员们,可以选择如何处理这种复杂性。极端情况下,可能会传播这种复杂性,这意味着API的每一位用户都需要牵涉其中。另一个极端情况是承担尽可能多的复杂性并将其隔离在某个地方。这个地方对于许多想一探究竟的API用户来说黑暗而恐怖。折中方案则是API的用户,如果无须深入了解实现细节,那么只需面对当前所遇到的复杂性即可。

WebDriver的开发人员更倾向于发现并在少数地方隔离这些复杂性,而不是传播它。这么做的原因之一是为用户着想。看看bug列表就会知道,他们特别善于发现问题和缺陷,但是因为许多用户不是开发人员,复杂的API不会受欢迎。开发人员试图让API正确地引导大家。例如,考虑下面来自早期Selenium API的方法,每一个都用于设置输入元素的值:

•       type

•       typeKeys

•       typeKeysNative

•       keydown

•       keypress

•       keyup

•       keydownNative

•       keypressNative

•       keyupNative

•       attachFile

下面是WebDriver API中的等价方法:

•       sendKeys

如前所述,这凸显了RC和WebDriver之间的主要思想差异——WebDriver在努力模拟用户,而RC在较低层次提供的API让用户难以或者无法使用。typeKeys和typeKeysNative之间的区别在于前者总是使用合成事件(synthetic event),而后者则尝试利用AWT Robot输入键值。令人失望的是,AWT Robot发送按键事件给具有焦点的任意窗口,也就是说可能不是浏览器。相比之下,WebDriver的原生事件,直接把事件发送给窗口处理函数,避免了浏览器窗口必须具有焦点的要求。

WebDriver设计

WebDriver的API被定位为“基于对象的”。接口被明确定义并努力坚持只包含一个角色或者责任,而不是将每一个可能的HTML标记模块化为单独的类,只有一个WebElement接口。通过这种方式,开发人员使用支持自动补全的IDE即可被提示下一步工作。其结果类似于下面的代码片段(Java语言):

WebDriver driver = new FirefoxDriver();

driver.<user hits space>

此时,包含13个方法的短列表显示出来,用户选择其中一个:

driver.findElement(<user hits space>)

大多数IDE现在显示预期参数的类型提示,在这个例子中是“By”。By包含许多预定义的静态工厂方法,用户可以快速地完成刚才的代码:

driver.findElement(By.id("some_id"));

基于角色的接口

WebDriver广泛使用了基于角色的接口。例如,有一个JavascriptExecutor接口提供了在当前页面环境中执行任意Javascript语句块的功能。WebDriver实例对该接口的成功映射可以提示你利用该方法完成自己的工作。

处理大量的组合

假设X种浏览器和Y种语言,我们很容易就会掉进X×Y种实现中,将会面临维护成本的大量攀升。

减少WebDriver支持的编程语言种类是降低成本的途径之一,但是基于两种原因不想这样做。首先,从一种语言切换到另一种时人们会承受认知负荷,因此对用户来说如果测试框架(WebDriver)能够允许他们采用在日常开发中使用的编程语言来编写测试,那么这是巨大的优势。其次,在单一项目中混合多种语言可能会让团队很不方便,而且公司的编码规范和需求通常要求技术单一纯正性,因此,减少支持语言的种类不是可选项。

减少支持浏览器的数量也不是一种选择——当项目组决定在WebDriver中淘汰对Firefox 2的支持时,就遇到了强烈的抗议,而事实上当时,Firefox 2只占了浏览器市场份额不到1%。

唯一的选择是努力使所有浏览器对语言的绑定看起来相同:它们应该提供统一的接口,可以轻松地通过各种语言解决。更重要的是,希望语言绑定本身尽可能的易于编写,这意味着需要尽可能的使它们保持简洁。在底层driver中放入了尽可能多的逻辑来支持这种设计:放弃放入dirver的每一块功能都意味着需要通过支持的每一种语言实现,而这代表了大量的工作量。

WebDriver设计中的缺陷

通过这种方式发布功能的缺陷在于除非有人知道某个特定的接口存在,否则他们可能不会意识到WebDriver支持这种功能,在API的可发掘性上存在缺憾。当然在WebDriver刚发布的时候,我们会投入大量时间来指导人们找到合适的接口。现在我们已经花费大量精力来编写文档,随着API获得广泛应用,用户会越来越容易的找到所需的文档。

从实现者的观点来看,紧密绑定浏览器也是一种设计缺陷,虽然无法避免。支持新浏览器时需要投入巨大的努力,经常需要数次尝试才能找到正确方法。具体的例子就是,Chrome驱动经过了四次完全重写,IE驱动也有三种关键重写。紧密绑定浏览器的优点在于它提供了更多控制权。

下一篇文章我会把WebDriver的创建者Simon Stewart介绍的余下内容翻译完,包括以下内容:

1. 布局及JavaScript

2. 特别介绍Remote和Firefox driver

3. IE driver

4. Selenium RC

5. 回顾

6. 展望未来

未完待续,请阅读后面的文章:
Selenium 2.0的由来及设计架构(二)
Selenium 2.0的由来及设计架构(三)
本文是译文,原文请参考:http://www.aosabook.org/en/selenium.html

Selenium 2.0的由来及设计架构(一)相关推荐

  1. Selenium 2.0的由来及设计架构(二)

    布局和Javascript 浏览器自动化工具基本上由三部分构成: · 与DOM交互的方法 · 执行Javascript的机制 · 一些模拟用户输入的办法 本节重点介绍第一部分:提供与DOM交互的机制. ...

  2. Selenium 2.0的由来及设计架构

    本文转自:blog.csdn.net/zzzmmmkkk/article/details/10034213 布局和JavaScript 浏览器自动化工具基本上由三部分构成: · 与DOM交互的方法 · ...

  3. Selenium 2.0的由来及设计架构(三)

    IE Driver IE 是一个很有意思的浏览器,它是由一些协同工作的COM接口构建成的,这一直延伸到Javascript引擎,常见的Javascript变量实际参考了隐含的COM实例.Javascr ...

  4. 基于BPMN2.0的工单系统架构设计(下)

    版权声明: 本文为博主原创文章,未经博主允许不得转载.关注公众号技术汇(ID: jishuhui_2015) 可联系到作者. 在上两篇文章中,介绍了BPMN2.0和工作流定义语言(以下简称WDL),以 ...

  5. 从0开始的微服务架构:(一)重识微服务架构

    2019独角兽企业重金招聘Python工程师标准>>> 导语 虽然已经红了很久,但是"微服务架构"正变得越来越重要,也将继续火下去. 各个公司与技术人员都在分享微 ...

  6. WINCE5.0和WINCE6.0的内存与系统架构

    WINCE5.0和WINCE6.0的内存与系统架构 http://topic.csdn.net/u/20090410/14/75bba2cb-cefc-4ca5-b4f5-4165bbf16006.h ...

  7. Re:从0开始的微服务架构:(一)重识微服务架构--转

    原文地址:http://www.infoq.com/cn/articles/micro-service-architecture-from-zero?utm_source=infoq&utm_ ...

  8. kafka 同步提交 异步_详解Kafka设计架构核心——Kafka副本机制详解

    所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝.副本机制有什么好处呢? 1. 提供数据冗余.即使系统部分组件失效,系统依然 ...

  9. Selenium用户指南 - 第一章 Selenium 2.0 文档修订注解

    From: http://blog.csdn.net/planisnothing/article/details/7234995 Selenium 2.0 文档修订注解 你好,欢迎!文档团队欢迎你,并 ...

最新文章

  1. 与有利集团总公司,同携手•共辉煌
  2. Android开发之ViewPager结合Fragment实现滑动页面的效果(源代码分享)
  3. Java 10- 详解var关键字和示例教程
  4. mysql 索引语法_MySQL 索引:语法及案例剖析
  5. 10G_Ethernet_03 Example Design
  6. 用Unix的设计思想来应对多变的需求
  7. 九度1377缓变序列
  8. 飞书推出“线上办公室” 通过实时语音频道还原办公场景
  9. PTA: 6-4建立学生信息链表(20分)
  10. 测试的目的、时期、分类
  11. 深圳市计算机软件著作权资助,深圳市计算机软件著作权登记资助管理实施细则...
  12. opencv抠出圆形区域_用OpenCV检测圆形区域(包含大量小对象)
  13. 陈艾盐:春燕百集访谈节目第二十六集
  14. scrapy框架爬取斗鱼女主播照片,依据颜值排行榜
  15. 海贝音频384khz_海贝音乐app下载-海贝音乐最新版下载v4.0.1-IT168下载站
  16. Python 屏幕亮度的调节与息屏
  17. 5注册激活_国家医保服务平台APP激活绑定流程
  18. java 堆中的新生代_Java堆内存_Young Gener_Old Generation_新生代和老年代
  19. 英语论文格式修改(两栏)
  20. GP数据库安装以及使用

热门文章

  1. .Net Reactor 5脱壳教程
  2. 实战centos6安装zabbix-2.4版(终极版)
  3. echarts.js 做图表的插件
  4. MySQL主从的一致性校验及修复
  5. tomcat 初始管理用户和密码
  6. 将当前的head推送到远程_git 入门教程之远程仓库
  7. python Pool常用函数用法总结
  8. 非计算机专业想学习Python,有哪些问题需要注意?
  9. 看日本电影再也不怕看不懂了,6行Python代码轻松实现音频转文字
  10. 无法安装到这个磁盘 这台计算机,安装Win7提示无法安装到这个磁盘怎么办