你无需了解一切细节
很少有开发人员精通各种语言和技术。因此,我们的架构需要帮助开发人员把他们的才华用于擅长的地方,而无需处理不适合他们的代码片段。
降低巴士因素
在软件开发领域存在一种(非正式的)概念,称为“巴士因素”。它指的是关键开发人员的数量,如果这些人遇到不幸——被大巴撞伤而离开项目,那 么项目无法继续进行。像浏览器自动化这样复杂的技术特别能够证明巴士因素的重要性,因此我们的许多架构决策都希望能够尽可能提高关键开发人员的数量。
偏爱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代码存放在每 种语言的独立文件夹中。这种方式符合开源开发人员的期望,立刻吸引了社区的广泛参与。