目录


本文链接: https://www.cnblogs.com/hchengmx/p/10745116.html

1. selenium1.0的产生

为什么要有selenium?

因为一位ThoughtWorks的工程师,因为要重复操纵某些元素,设计出来selenium1.0, 此时selenium 1.0 = Selenium IDE + Selenium Grid + Selenium RC, 其中Selenium RC = Client Libraries + Selenium Serve, Selenium Clinet用于编写测试脚本, Selenium Server用来控制浏览器行为;

这时候的工作流程为(以Java为例):

  1. Selenium Client用Java来写Selenium代码;
Selenium user = new DefaultSelenium( " localhost " , SeleniumServer.DEFAULT_PORT, " *iexplore " , " http://localhost:8080 " );
user.start(); //启动浏览器
user.open( " /helloworld " );
user.click( " //a[contains(@href, 'user.do?id=0')] " );
  1. Selenium Server将编写的Java代码转换成一段浏览器能看懂的JS代码
  2. 浏览器根据JS实现相关操作

这样做有两个好处:

  1. 可以用一套代码来驱动所有的浏览器;
  2. 通过设置代理的方式突破了JS的安全机制(不允许访问跨域请求),

这样做的不好的点:

  1. 代码执行的效率很大程度上决定于Selenium Server转换的JS的代码的质量;
  2. 浏览器也对JS有很多的限制;

2. webdriver的产生

  1. 2006年, Webdriver是由Google工程师开发的,WebDriver是通过原生浏览器支持或者浏览器拓展来控制浏览器, 取代了嵌入web的JavaScript(此处提到了JavaScript的沙箱机制,突破JavaScript的安全模型),除了来自浏览器厂商的支持外(也就是直接控制浏览器进行直接沟通), WebDriver还利用操作系统级别的调用, (什么操作系统级别的调用?) , 模拟用户输入。

3. selenium和webdriver的合并

  1. 2009年, Selenium和WebDriver合并,也就是现在用的Selenium2. Webdriver也就有了一个清晰的API,也就是Webdriver API。此时 selenium 2.0 = Selenium 1.0 + Webdriver, 还是兼容selenium 1.0的, 这个时候不同浏览器的驱动方式不同, chrome用的是chromedriver, 其他有的是用selenium RC, 有的是用第三方开发的driver;

    所以这个时候, 针对不同的浏览器, 导入的包是不一样的, 可能是selenium包,也有可能的webdriver包

from selenium import selenium,

from selenium import webdriver

4. selenium3.0的产生

selenium 3.0 = selenium 2.0 - selenium RC

selenium3.0是selenium2.0的优化, 最大的变化是 产生了协议 The WebDriver Wire Protocol这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等等等。

所以: 当我们用代码

Chromedriver driver= new Chromedriver();
driver.get("http://www.google.com");

时,系统完成了以下的操作:

  1. 确定请求的浏览器是否存在?还有版本是否匹配。
  2. 启动一个Web Service,这个Service使用了Selenium定义的The WebDriver Wire Protocol协议,这个协议对于不同浏览器是通用的,所以这也就是同一套代码可以在不同浏览器中运用的运行。
  3. 向浏览器发送一个get请求,请求完成浏览器的跳转;

参考引用:

  1. Selenium体系结构的疑惑及解答

  2. Selenium1.0的介绍

  3. selenium3.0的一些重要变化

  4. Selenium 1.0入门手册

  5. 不要再问我跨域的问题了

  6. webdriver官方协议文档

  7. selenium和webdriver区别

本文希望对您有所帮助,如何问题可联系我的个人微信

Selenium的发展历史及原理的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. 秒懂Vuejs、Angular、React原理和前端发展历史

    「前端程序发展的历史」 「 不学自知,不问自晓,古今行事,未之有也 」 我们都知道现在流行的框架:Vue.Js.AngularJs.ReactJs,已经逐渐应用到各个项目和实际应用中,它们都是MVVM ...

  3. Web开发技术发展历史

    Web开发技术发展历史   来自:天码营 原文:http://www.tianmaying.com/tutorial/web-history Web的诞生 提到Web,不得不提一个词就是"互 ...

  4. python 学习之电脑的发展历史

    电脑的发展历史 电脑的学名叫计算机,电脑是用来做计算的.在古时候,人们最早使用的计算工具可能是手指,英文单词“digit”既有“数字”的意思,又有“手指“的意思.古人用石头打猎,所以还有可能是石头来辅 ...

  5. 【转载】Web开发技术发展历史-版本1

    原文在这里. Web开发技术发展历史 Web的诞生 提到Web,不得不提一个词就是“互联网”.Web是World Wide Web的简称,中文译为万维网.“万维网”和我们经常说的“互联网”是两个联系极 ...

  6. attention发展历史及其相应论文

    这个论文讲述了attention机制的发展历史以及在发展过程的变体-注意力机制(Attention Mechanism)在自然语言处理中的应用 上面那个论文提到attention在CNN中应用,有一个 ...

  7. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  8. .net版本发展历史

    最近装上了VS2013,发现好多新特性.新功能,公司办公还在使用VS2005.VS2008,不过用着也很顺手,在最新版Visual Studio中,微软加入了git源码管理工具,和之前的TFS大体上类 ...

  9. 软件项目发展历史<人月神话>这本书好

    几乎是计算机软件开发的发展历史     人月神话,增加人手并不一定能提高开发速度. 原因在于,有些任务是无法分解的,存在先后顺序.无法同步进行. 增加人手,增加的是沟通成本,相互牵制.可以分解的任务就 ...

随机推荐

  1. bzoj4476 [Jsoi2015]送礼物

    化简式子 $M>=m+ans*(r-l+k)$ 发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$, 右面都确定了,但最大值仍 ...

  2. 虚拟机console基础环境部署——系统基础环境

    1. 概述2. 工具类安装2.1 安装vim2.2 安装tree2.3 安装expect2.4 安装lsof3. 编译环境类安装 1. 概述 本系列博客是在最小化安装CentOS6.5的基础上,通过配 ...

  3. 发送email

    package com.rjj.d; import java.security.GeneralSecurityException; import java.util.Date; import java ...

  4. Asp.Net Core 轻松学-正确使用分布式缓存

    前言     本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了.上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存,那么本篇文章就来了解一下如何使用分 ...

  5. 通过XDocument方式把List写入Xml文件

    List<Person> list=new List<Person>{ new Person(){Name="张三",Age=50,Address=&quo ...

  6. Java集合 - List介绍及源码解析

    (源码版本为 JDK 8) 集合类在java.util包中,类型大体可以分为3种:Set.List.Map. JAVA 集合关系(简图) (图片来源网络) List集合和Set集合都是继承Collec ...

  7. Chrome内核浏览器打开网页报 错误代码: ERR_TIMED_OUT

    升级win10之后如果出现chrome内核的浏览器网页总是打不开 打开很慢  而ie和edge是可以正常访问的 用这个方法可以  我弄了几天终于 搞好了我直接转载过来了近期,工程师收到大量反馈360浏 ...

  8. ASP.NET Core 身份验证(一)

    前言 这篇文章我想带领大家了解一下 ASP.NET Core 中如何进行的身份验证,在开始之前强烈建议还没看过我写的 Identity 系列文章的同学先看一下. Identity 入门系列文章: Id ...

  9. 利用requirejs实现vue的模块化开发

    通常vue都是搭配webpack+vue-cli使用的 如果不在nodejs环境下开发web应用呢? 这里提出一个解决方案: 1.加载requirejs,并且指定main函数 <script d ...

  10. javascript 字符串转换数字的方法大总结

    方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有 ...