开源应用架构之SeleniumWebDriver
前不久,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代码存放在每种语言的独立顶级文件夹中。这种方式符合开源开发人员的期望,立刻吸引了社区的广泛参与。
分享到:
相关推荐
基于改进粒子群算法的DG储能选址定容优化模型:解决电力系统时序性问题的可靠程序解决方案,基于改进粒子群算法的DG储能选址定容模型优化解决电力系统问题,DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题。下面我将对程序进行详细分析。 首先,程序开始时加载了一些数据文件,包括gfjl、fljl、fhjl1、cjgs和fhbl。这些文件可能包含了电力系统的各种参数和数据。 接下来是一些参数的设置,包括三种蓄电池的参数矩阵、迭代次数、种群大小、速度更新参数、惯性权重、储能动作策略和限制条件等。 然后,程序进行了一些初始化操作,包括初始化种群、速度和适应度等。 接下来是主要的迭代过程。程序使用粒子群算法的思想,通过更新粒子的位置和速度来寻找最优解。在每次迭代中,程序计算了每个粒子的适应度,并更新个体最佳位置和全局最佳位置。 在每次迭代中,程序还进行了一些额外的计算,如潮流计算、储能约束等。这些计算可能涉及到电力系统的潮流计算、功率平衡等知识点。 最后,程序输
数学建模相关主题资源2
内容概要:本文详细介绍了一系列用于科学研究、工程项目和技术开发中至关重要的实验程序编写与文档报告撰写的资源和工具。从代码托管平台(GitHub/GitLab/Kaggle/CodeOcean)到云端计算环境(Colab),以及多种类型的编辑器(LaTeX/Microsoft Word/Overleaf/Typora),还有涵盖整个研究周期的各种辅助工具:如可视化工具(Tableau)、数据分析平台(R/Pandas)、项目管理工具(Trello/Jira)、数据管理和伦理审核支持(Figshare/IRB等),最后提供了典型报告的具体结构指导及其范本实例链接(arXiv/PubMed)。这为实验流程中的各个环节提供了系统的解决方案,极大地提高了工作的效率。 适合人群:高校学生、科研工作者、工程技术人员以及从事学术写作的人员,无论是新手入门还是有一定经验的人士都能从中受益。 使用场景及目标:帮助读者高效地准备并开展实验研究活动;促进团队间协作交流;规范研究报告的形式;提高对所收集资料的安全性和隐私保护意识;确保遵循国际公认的伦理准则进行实验。
四轮毂驱动电动汽车稳定性控制策略:基于滑模与模糊神经网络的转矩分配与仿真研究,四轮毂驱动电动汽车稳定性控制:基于滑模与模糊神经网络的转矩分配策略及联合仿真验证,四轮毂驱动电动汽车稳定性控制,分布式驱动转矩分配。 上层基于滑模,模糊神经网络控制器决策横摆力矩,下层基于动态载荷分配,最优分配,平均分配均可做。 simulink与carsim联合仿真。 ,四轮毂驱动;电动汽车稳定性控制;分布式驱动;转矩分配;滑模控制;模糊神经网络控制器;横摆力矩;动态载荷分配;最优分配;平均分配;Simulink仿真;Carsim仿真,四驱电动稳定性控制:滑模与模糊神经网络决策的转矩分配研究
本资源提供了一份详细的PyCharm安装教程,涵盖下载、安装、配置、激活及使用步骤,适合新手快速搭建Python开发环境。
毕业设计
原版宋体.ttf,原版宋体安装文件,安装方式,直接右键安装。
利用Xilinx FPGA内嵌的软核处理器MicroBlaze,加上自主编写的AXI_IIC控制器,实现对IMX327传感器IIC总线的控制,同时辅以UART调试串口,实现系统状态的实时监控与调试。
在 GEE(Google Earth Engine)中,XEE 包是一个用于处理和分析地理空间数据的工具。以下是对 GEE 中 XEE 包的具体介绍: 主要特性 地理数据处理:提供强大的函数和工具,用于处理遥感影像和其他地理空间数据。 高效计算:利用云计算能力,支持大规模数据集的快速处理。 可视化:内置可视化工具,方便用户查看和分析数据。 集成性:可以与其他 GEE API 和工具无缝集成,支持多种数据源。 适用场景 环境监测:用于监测森林砍伐、城市扩展、水体变化等环境问题。 农业分析:分析作物生长、土地利用变化等农业相关数据。 气候研究:研究气候变化对生态系统和人类活动的影响。
毕业设计
整个文件的代码
名字微控制器_STM32_DFU_引导加载程序_dapboo_1740989527.zip
详细介绍及样例数据:https://blog.csdn.net/T0620514/article/details/145991332
anaconda配置pytorch环境
立体仓库控制组态王6.55与三菱PLC联机仿真程序:视频教程与IO表接线图CAD详解,9仓位立体仓库控制系统优化方案:组态王6.55与三菱PLC联机仿真程序视频教程及IO表接线图CAD详解,9仓位立体仓库控制组态王6.55和三菱PLC联机仿真程序+视频+带io表接线图CAD ,关键词:立体仓库;控制组态王6.55;三菱PLC;联机仿真程序;视频;io表接线图;CAD,立体仓库控制组态王与三菱PLC联机仿真程序资源包
基于Maxwwell设计的经典外转子永磁同步电机案例:直流母线24V,大功率与高效率驱动设计,基于Maxwell设计的经典永磁同步电机案例:200W功率,外转子结构,直流母线电压与电机参数详解,基于maxwwell设计的经典200W,2200RPM 外转子,直流母线24V,42极36槽,定子外径81.5 轴向长度15 ,0.86Nm, 永磁同步电机(PMSM)设计案例,该案例可用于生产,或者学习用 ,经典设计案例; 200W; 2200RPM外转子; 直流母线24V; 42极36槽; 定子外径81.5; 轴向长度15; 永磁同步电机(PMSM); 生产学习用。,经典200W永磁同步电机设计案例:Maxwell外转子,高效率2200RPM直流母线系统
C# Modbus RTU协议主站设计工程源码详解:支持多从站访问与多线程实现,带注释开源dll文件,C# Modbus RTU协议主站设计工程源码解析:多线程实现访问多个从站功能的开源dll文件,C# Modbus RTU协议主站设计工程源码带注释,开源dll文件,支持访问多个从站,多线程实现 ,C#; Modbus RTU协议; 主站设计; 工程源码; 注释; 开源dll; 多从站访问; 多线程实现,《C# Modbus RTU主站源码:多线程支持访问多从站开源DLL文件详解》
MATLAB Simulink下的四旋翼无人机PID控制仿真模型研究,MATLAB Simulink下的四旋翼无人机PID控制仿真模型研究,MATLAB Simulink 四旋翼仿真模型 四轴无人机PID控制 ,MATLAB; Simulink; 四旋翼仿真模型; 四轴无人机; PID控制,MATLAB Simulink四旋翼仿真模型中四轴无人机的PID控制研究
复现文献中COMSOL模拟天然气水合物两相渗流的研究,COMSOL模拟天然气水合物两相渗流:文献复现与分析,comsol天然气水合物两相渗流,文献复现 ,comsol; 天然气水合物; 两相渗流; 文献复现,复现文献:comsol模拟天然气水合物两相渗流研究