开源应用架构之​Selenium WebDriver(上)

matlab stewart matlab stewart matlab stewart matlab stewart matlab stewart matlab stewart matlab stewart matlab stewart matlab stewart 立即下载

前不久,InfoQ向大家推荐了几本有关软件架构的新书,引起了国内读者的广泛兴趣。​其中一本是《开源应用架构(The Architecture of Open Source Applications)》,来自知名开源项目的各位作者对软件的设计进行了说明。通过对这些成功的系统架构进行概览,让软件工程师可以彻底了解最佳实践和陷阱。InfoQ中文站响应读者的需求,整理了该书有关知名开源软件架构的精彩内容,供国内开发社区借鉴。本期介绍的是著名浏览器自动化工具Selenium WebDriver的软件架构,第一部分主要分享了Selenium WebDriver的演变历史和架构观点。

Selenium是一个浏览器自动化工具,通常用来编写​Web应用的端到端测试。浏览器自动化工具​准确执行你所期望的行为:自动化浏览器的某个控件,从而可以自动重复执行任务。这听起来像是一个很容易解决的问题,但是正如我们即将看到的那样,其实Selenium成功的背后凝聚了大量的工作。

介绍Selenium WebDriver软件架构的技术专家是​来自Google的Simon Stewart,他是Selenium的核心贡献者和Selenium WebDriver的创建者。

Simon Stewart首先谈起了Selenium的组成部分:

在介绍Selenium架构之前,最好先了解一下该项目的各个相关组成部分是如何结合在一起的。从较高的层次看,Selenium由三种工具组成。第一个工具Selenium IDE,是Firefox的扩展插件,支持用户录制和回访测试。录制/回访模式​存在局限性,对许多用户来说并不适合,因此第二个工具——Selenium WebDriver提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序。最后一个工具——Selenium Grid帮助工程师使用Selenium API控制分布在一系列机器上的浏览器实例,支持并发运行更多测试。在项目内部,它们分别被称为“IDE”、“WebDriver”和“Grid”。 

​追根溯源,Selenium和WebDriver最初是两个独立的项目,Simon Stewart​解释了发展的历史:

Jason Huggins在2004年发起了Selenium项目,当时他在ThoughtWorks公司开发内部的时间和费用(Time and Expenses)系统,该应用使用了大量的JavaScript。虽然Internet Explorer在当时是主流浏览器,但是ThoughtWorks还使用一些其他浏览器(特别是Mozilla系列),当员工在自己的浏览器中无法正常运行T&E系统时就会提交bug报告。当时的开源测试工具要么关注单一浏览器(通常是IE),要么是模拟浏览器(如HttpUnit)。购买商业工具授权的成本会耗尽这个小型内部项目的有限预算,所以它们都不是可行的测试选项。​

在自动化困难的情况下,通常会依靠手动测试。​当开发团队规模很小或者构建发布非常频繁时,这种方式不太适用。同时,让人手动执行原本可以自动化的脚本也是一种对人力的浪费。沉闷重复的任务越无聊,人们工作就会越慢而且比机器犯更多错误。手动测试也不是一种选择。​  

幸运的是,所有被测试的浏览器都支持Javascript。Jason和他所在的团队有理由采用Javascript编写一种测试工具来验证应用的行为。他们受到FIT​(Framework for Integrated Test)的启发,使用基于表格的语法替代了原始的Javascript​,这种做法支持那些编程经验有限的人在HTML文件中使用关键字驱动的方式来编写测试。该工具,最初称为“Selenium”,后来称为“Selenium Core”,在2004年基于Apache 2授权发布。​

Selenium的表格格式类似于FIT的​ActionFixture。表格的每一行分为三列。第一列给出了要执行的命令名称,第二列通常包含元素标记符,第三列包含一个可选值。例如,如下格式表示了如何在名称为“q”的元素中输入字符串“Selenium WebDriver”:

type   name=q   Selenium WebDriver

因为Selenium过去使用纯JavaScript编写,它的最初设计要求开发人员把准备测试的应用和Selenium Core、测试脚本部署到同一台服务器上以避免触犯浏览器的安全规则和JavaScript沙箱​策略。在实际开发中,这种要求并不总是可行。更糟的是,虽然开发人员的IDE能够帮助他们快速处理代码和浏览庞大的代码库,但是没有针对HTML的相关工具。​人们很快意识到维护一个中等规模的测试集是笨拙而痛苦的过程。​

为了解决这个问题和其他问题,我们编写了HTTP代理,这样所有的HTTP请求都会被Selenium截获。使用代理可以绕过“同源”规则(浏览器不支持Javascript调用任何当前页面所在服务器以外的其他任何东西)的许多限制​,从而缓解了首要弱点。这种设计使得采用多种语言编写Selenium绑定成为可能:它们只需把HTTP请求发送到特定URL。连接方法基于Selenium Core的表格语法​​严格建模,称之为“Selenese”​。因为语言绑定在远程控制浏览器,所以该工具称为“Selenium Remote Control”或者“Selenium RC”。

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

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

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

Simon Stewart在介绍Selenium WebDriver软件架构之前,谈到了架构和项目开发的重要主题。​概括如下:

  • 保持成本低廉。
  • 模拟用户。
  • 证明dirver运行良好......
  • ......但是你无需了解一切细节
  • 降低巴士因素(bus factor)。
  • ​偏爱JavaScript实现。
  • 所有方法调用都是RPC调用。
  • 我们是开源项目。

具体来说:

保持成本低廉​​

在Y平台上支持X浏览器本质上是一种昂贵的​提议,无论是从开发还是维护角度考虑。如果我们能够找到办法维持产品的高品质而又不违背太多其他原则,那么就值得采纳。这种思想最明显的体现在我们尽可能得使用JavaScript编程,你稍后会看到。​

模拟用户​
​WebDriver的设计目的是为了准确模拟用户与Web应用交互的方式。模拟用户输入的常用办法是利用Javascript合并和触发一系列事件(如果真实用户执行相同交互操作,应用会处理同样的事件)。“合成事件”(synthesized events)方法在面对不同浏览器、有时相同浏览器的不同版本时存在不少困难,触发的事件和相关值略有不同。为了不让问题复杂化,大多数浏览器处于安全原因不允许用户通过这种方式与表单元素(如文件输入元素)交互。

WebDriver总是尽可能的使用在操作系统层面​触发事件的方法。​因为这些“原生事件”不是由浏览器生成,所以这种方法​避免了​合成事件导致的安全限制,同时,因为它们是特定于具体操作系统的,​一旦在某个平台上的浏览器运行良好,在另一种浏览器上重用代码相对容易些。困难的是,这种方法​必须满足两点才可行:WebDriver与浏览器紧密绑定,同时开发团队在无需浏览器窗口获得焦点的情况下发送原生事件(因为Selenium测试运行时间较长,最好能支持同时在机器上执行其他任务)。目前,原生事件可用于Linux、Windows平台,不包括Mac OS X。​

不管WebDriver如何模拟用户输入,我们都在努力尽可能地模仿用户行为。​RC刚好相反,它提供的API层次远低于用户操作。​

证明Driver运行良好​​

想让事情十全十美(motherhood and apple pie)​可能过于理想化了,但是我相信编写无法运行的代码是没有意义的。证明driver(指的是WebDriver API的特定实现。例如,Firefox和Internet Explorer各有自己的driver实现)在Selenium项目中运行良好的办法是我们拥有一套广泛的自动化测试用例。这些通常是“集成测试”,需要编译代码并使用浏览器与Web服务器交互,但是我们尽可能地编写“单元测试”,它不像集成测试,无需完全重新编译即可运行。目前,大约有500个集成测试和250个单元测试,涵盖所有浏览器。​我们在修补缺陷和编写新代码时会增加测试,我们的重点正转移到编写更多的​单元测试。​

并非所有​测试都要运行于每一个浏览器上。其中一些测试用于某些浏览器不支持的特定功能,或者在不同浏览器上处理方式不同的功能。例如,某些测试用于新的HTML5功能,这些功能并非所有浏览器都支持。尽管如此,每一个主流的浏览器都进行了充分的测试。可以想象,在不同平台上针对每种浏览器运行超过500个测试是一种极大的挑战,我们一直在努力面对。​

你无需了解一切细节​​

很少有开发人员精通各种语言和技术。因此,我们的架构需要帮助开发人员把他们的才华用于最擅长的地方,而无需处理不适合他们的代码片段。​

降低巴士因素​

在软件开发领域存在一种(非正式的)​概念,称为“巴士因素”。​它指的是关键开发人员的数量​,如果这些人遇到不幸——被大巴撞伤而离开项目,那么项目就无法继续进行。​像浏览器自动化这样复杂的技术特别能够证明巴士因素的重要性,因此我们的许多架构决策都希望能够尽可能提高关键开发人员的数量。​

偏爱Javascript实现​

WebDiver在没有其他方式控制浏览器的情况下会使用纯Javascript驱动浏览器。这意味着我们添加的所有API都应该倾向于偏爱Javascript实现。举一个具体的例子,HTML5引入了LocalStorage,这是在客户端存储结构化数据的API。它通常在浏览器中使用SQLite实现。比较自然的实现方式是使用类似JDBC的技术为底层的数据存储提供数据库连接。最终,我们决定采用底层Javascript实现的API,因为通常数据库访问API与Javascript实现不太兼容。

所有方法调用都是RPC调用​​

WebDriver控制运行在其它进程中的浏览器。一个很容易忽视的事实是,这意味着所有API调用都是RPC调用,因此框架的性能在于网络延迟上。在正常操作中,​这未必明显——大多数操作系统优化了到本机(localhost)的路由——但是随着浏览器和测试代码之间的网络延迟增加,对于API设计者和使用者来说,原本高效的调用会恶化。​

​这种情况给API的设计带来了一定压力。功能粗糙的较大规模的API可能会通过合并多个调用帮助减低延迟,但是这需要掌握平衡,时刻保持API的可读性和易用性。例如,有时候需要检测某个元素是不是对最终用户可见。我们不仅需要考虑各种CSS属性(可能需要通过查看父元素来推断),也应该检查元素的尺寸。最低限度情况下,API应该分别执行​所有这些检测。WebDriver把这些功能都合并到一个方法isDisplayed中。​

这是开源项目​​

虽然严格意义上说,这不是一种架构观点,但还是要强调Selenium是一个开源项目。上面提到的所有观点联系在一起,表达的意思是:​我们希望尽可能的帮助新的开发人员易于参与项目。降低参与门槛的措施包括尽可能使所需知识浅显、使用的语言种类较少、依赖自动化测试验证。

最初该项目被划分成一系列模块,每一个模块​代表了一种特定的浏览器,其他的模块是通用代码和支持代码。每一个绑定的代码树保存在这些模块下面。这种方法对于类似Java和C#​的语言来说非常有用,但是对于Ruby和Python的开发人员来说很痛苦。这种情况直接导致了有限的参与者,只有一小部分人参与Python和Ruby的绑定工作。为了解决这个问题,在2010年的十月和十一月,项目源代码被重新组织,Ruby和Python代码存放在每种语言的独立顶级文件夹中。这种方式符合开源开发人员的期望,立刻吸引了社区的广泛参与。​


揭秘WebDriver实现原理 揭秘WebDriver实现原理的实现原理 立即下载

相关推荐

前端开源库-chai-webdriverio

前端开源库-chai-webdriverioChai WebDriverio,用于WebDriverio的Chai断言

Selenium WebDriver 自动化测试截图问题

// Selenium Client: selenium-java-2.34.0   在 Selenium WebDriver 测试脚本中添加截图功能,可以使用以下2种方法:  (1) TakesScreenshot (org.openqa.selenium.TakesScreenshot) File srcFile = ((TakesScreenshot) driver)

blog.title = "Hello world"; 3786

RotaryStewartPlatform-master_六自由度平台制作教程_

六自由度平台的制作教程,可以参考这个文件制作六自由度平台

Selenium WebDriver实战宝典

webDriver.findElement(By.xpath(".//*[@id='kw']")).clear(); 清空输入框 4.7 设置元素等待 如今大多数Web 应用程序使用AJAX 技术。当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成的,这给元素的定位增加了困难。如果因为在加载...

weixin_39719266的博客 1278

(源码)基于Arduino和VSido协议的Stewart平台机器人.zip

# 基于Arduino和VSido协议的Stewart平台机器人 ## 项目简介 本项目是一个基于Arduino和VSido协议的Stewart平台机器人,使用廉价的伺服电机模拟传统的直线驱动器,实现Stewart平台的运动。该项目展示了如何通过简单的硬件和软件配置,实现一个功能强大的平台机器人。 ## 项目的主要特性和功能 低成本实现使用廉价的伺服电机(每个约600日元)和MDF激光切割部件,整体成本控制在5000日元左右。 易于组装采用Vduino控制板,兼容Arduino,简化了硬件配置和编程。 VSido协议支持实现了VSido协议,支持逆运动学(IK)指令,简化了运动控制。 多功能应用可以用于物理迷宫游戏、手势追踪等多种应用场景。 ## 安装使用步骤 1. 硬件组装 使用激光切割的MDF部件组装Stewart平台的机械结构。 将伺服电机安装到机械结构上,并连接到Vduino控制板。 2. 软件配置

如何用ISBN API快速获取图书信息?Python实战教程(附完整代码)

本文是一篇Python实战教程,详细介绍了如何利用ISBN API高效获取图书元数据。内容涵盖从API服务选择、密钥管理,到使用requests库构建健壮的请求模块,并利用Pydantic进行数据验证与解析。教程还提供了批量查询、缓存优化及集成到Flask Web应用等高级技巧,帮助开发者快速实现图书信息的自动化获取与处理。

p8q9r0的博客 456

webdriver-如何实现截图出现黑屏现象

webdriver截图黑屏原因: 1)、window的远程桌面连接,连接到agent,然后退出远程连接,会被锁屏 2)、window的睡眠时间设置成永不睡眠,否则睡眠后,截图是黑色的 解决方案: 1)、window的远程桌面连接,连接到agent,然后退出远程连接,会被锁屏,所以需要安装tightvnc,通过UltraVNC连接,这样关闭UltraVNC不会影响远程机 2)、Ultr

红茶_wu 4159

Difftest踩坑笔记(一)

Difftest是差分测试框架,有什么用呢?高性能CPU的设计需要做复杂的测试,传统的测试方法运行较慢,而且出了问题很难定位,Difftest就是为了解决这两个问题。

http://www.icfgblog.com/ 4196

Selenium WebDriver运行底层逻辑

WebDriver是Selenium的一个子项目,是Selenium的一个核心组件,它是一种用于自动化Web应用程序的应用程序编程接口(API),它允许程序员在不同的浏览器上编写自动化测试脚本。基于这个驱动会启动一个浏览器对象,同时会生成一个session来管理浏览器,此时webdriver成为一个代理,其作用是代码通过webdriver下发给浏览器,浏览器将响应传给webdriver,webdriver再转给代码。WebDriver服务器接收到请求后,会将请求发送给浏览器驱动程序。

qq_29180433的博客 1108

浙大数值分析lab2

最可怕的一道题,题目是这样的 Root of a Polynomial A polynomial of degree nnn has the common form as p(x)=cnxn+cn−1xn−1+⋯+c1x+c0p(x)=c_n x^n + c_{n-1} x^{n-1} + \cdots + c_1 x + c_0p(x)=c​n​​x​n​​+c​n−1​​x​

yao_zou的博客 4797

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码) 文章目录扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)理论讲解KF和EKF模型对比雅可比矩阵计算计算实例应用实例线性模型CV模型:CA模型非线性模型CTRV模型:CTRV实例(python)small demo抛物线demo飞机高度demoC++实例参考文献 我们上篇提到的卡尔曼滤波是用于线性系统,预测(运动)模型和观测模型是在假设高斯和线性情况下进行的。简单的卡尔曼滤波必须应用在符合高斯分布

O_MMMM_O的博客 10万+

StewartPlatform.zip - 建模和模拟 Stewart 平台-matlab开发

StewartPlatform.zip - 建模和模拟 Stewart 平台-matlab开发 去发现同类优质开源项目:https://gitcode.com/ 简介 本资源提供了使用MATLAB环境中的SimMechanics工具箱,对Stewart平台进行建模和仿真的一系列教程和示例文件。Stewart平台,作为一种六自由度定位系统,广泛应用于需要精确定位和运动控制的场合。 功能特色 建模精...

gitblog_06769的博客 860

别再踩坑了!Vue3 + Vant 手把手教你搞定飞书网页应用免登(SSO),附完整代码和重定向URL配置

本文详细介绍了如何使用Vue3和Vant实现飞书H5应用的免登(SSO)功能,包括飞书后台配置的关键细节、Vue3前端实现的最佳实践以及常见问题排查指南。特别针对重定向URL配置、安全设置和错误处理等常见陷阱提供了解决方案,并附有完整代码示例和性能优化建议。

weixin_29323551的博客 405

开源应用架构之​Selenium WebDriver(中)

Selenium团队最近发布了Selenium 2(又名Selenium WebDriver)​。主要新功能是集成了WebDriver​——曾经是Selenium 1(又名Selenium RC)的竞争对手。Selenium RC在浏览器中运行JavaScript应用,而WebDriver通过原生浏览器支持或者浏览器扩展直接控制浏览器: WebDriver针对各个浏览器而开发,取代了嵌入到被

测试人生 3997

基于EtherCAT的AM402与SV660N、IS620N伺服运动控制实战指南

本文详细介绍了基于EtherCAT总线的汇川AM402 PLC与SV660N、IS620N伺服驱动器构建运动控制系统的完整实战流程。内容涵盖硬件平台搭建、软件组态、关键参数设置、InoProShop编程及调试技巧,旨在帮助工程师快速掌握这一高精度、高响应的工业自动化解决方案。

weixin_29204205的博客 401

5G射频设计中N77&N79的PRX为什么需要3个SRS

首先,我们来逐个拆解一下这个神秘的“

weixin_43199439的博客 1323

开源应用架构之​Selenium WebDriver

这几篇文章有些看不懂,不过先存了,再细细品。 (上) http://www.infoq.com/cn/news/2011/06/selenium-arch 前不久,InfoQ向大家推荐了几本有关软件架构的新书,引起了国内读者的广泛兴趣。​其中一本是《开源应用架构(The Architecture of Open Source Applications)》,来自知名开源项目

vagabond1的专栏 1660

反卷积通俗详细解析与nn.ConvTranspose2d重要参数解释

反卷积的作用 卷积中padding的几个概念 No Padding Half(Same) Padding Full Padding 反卷积 反卷积中的Padding参数 反卷积的stride参数 反卷积总结 参考资料

iioSnail的博客 2万+

开源应用架构之​Selenium WebDriver讲解

WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript。与浏览器的紧密集成支持创建更高级的测试,避免了JavaScript安全模型导致的限制。除了来自浏览器厂商的支持,WebDriver还利用操作系统级的调用模拟用户输入。WebDriver支持Firefox (FirefoxDriver)、IE (InternetExplorerDriver)、Opera (O...

weixin_33860722的博客 129

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 开源应用架构之​Selenium WebDriver(中)
下一篇: 面试经典试题
liubofengpython
博客等级 码龄15年 23粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值