selenium

作者: 上山走18398 | 来源:发表于2019-11-12 21:53 被阅读0次

    Selenium 文档

    目录:

    • Introduction

      • Web应用自动化测试
      • 自动化测试和非自动化测试对比
      • Selenium简介
      • Selenium project 简述
      • Selenium的工具套件(suite)
      • 选择适合的Selenium工具
      • 支持的浏览器和平台(Platforms)
      • 扩展性和延伸性
      • 文档中有什么
      • 编写文档的团队介绍
    • Selenium-IDE

    • Selenium WebDriver

    • WebDriver:advanced Usage

    • Selenium 1(Selenium RC)

    • Test Design Considerations

    • Selenium-Grid

    • User-Extensions

    Introduction

    Web应用自动化测试

    现今,越来越多的软件应用程序都是web端的应用程序运行在互联网浏览器中。公司和一些组织都在有效地测试这些应用程序。在高交互快速响应的世代,许多公司都在使用灵活,动态的表单方法,自动化测试对于软件工程来说需求越来越旺盛。
    自动化测试着使用一些工具来测试这些需要被重复测试的application
    
    自动化测试的优势有哪些?一些相关的重复性测试和快速的执行一些测试。有很多商业化或者开源的自动化工具,Selenium 可能是使用最为广泛地开源解决办法。文档说明告诉你Selenium的特色,使用经验,社区论坛
    
    自动化测试如何提高长项目周期中团队的软件测试进程,具体的优势表现如下
    自动化测试支持:
    1. 频繁地回归性测试
    2. 快速地回馈结果给开发者(如把把所有接口,快速跑一遍)
    3. 虚拟无限制的迭代测试用例
    4. 支持极端或者动态的开发策略
    5. 严格遵守测试用例文档
    6. 自定义缺陷报告
    7. 找到手工测试中漏掉的bug
    
    //主要还是回归性测试,冒烟测试,以及快速反馈(如通过报告体现,或者邮箱通知)
    

    要不要进行自动化测试呢?

    自动化一直都有利于项目么?我们何时进行自动化地跑测试用例呢?
    
    根据经验而得,自动化测试并不总是那么方便。
    有时,手工测试会更加地准确。比如,application 的UI接口 要考虑到某天突然改变,那相应的自动化测试用例也需要改变
    再比如,项目周期短变动大,来不及组织自动化测试代码(此时,应该考虑是否可以封装一些高复用的function),此时手工测试会更加高效
    tight deadline ,没有可复用的自动化接口可用,那只能提高手动测试的次数
    

    Selenium简介

    web自动化测试工具
    Selenium有很多工具,学的工具多了,选择就多了。
    比如有多种方法定位UI elements ,还有对比期望和实际结果,还有最重要的是可以在多个浏览器平台执行测试用例
    //可以测试兼容性
    

    Selenium project 简史

    在2004出现,出现的原因么:可能就是想从一些枯燥重复的手工测试解脱 出来,
    把时间放在重点问题上,而不是每一次代码改动都要回归一些重复性的测试
    牛逼的他(代码能力),开发出了一个JavaScript库,可以驱动页面的交互,使他可以自动地在多个浏览器重跑他的用例,这就是Selenium的核心啦,
    这些核心就是Remote Control(RC)和 Selenium IDE的基础
    Selenium RC 是创新的(解决了兼容test的问题),因为没有谁会允许你随便的一种语言就可以控制它的浏览器
    //同源策略--端口 协议
    
    Selenium是一个能力巨大的工具,但是它也有缺点(缺点有时候会被无限放大),他是JavaScript写的,基于自动化引擎和浏览器对于JavaScript的安全限制,很多,很多当初没想到问题也在一一暴露出来,更糟的是,现在的Webapp功能越来越丰富,浏览器对于他的限制也会越来越严重
    
    2006的时候,一个plucky(勇敢的)人 开始搞WebDriver。Google也在大量的使用Selenium,不过由于产品之间的限制,也是的工作难以高效,
    既然产品之间的限制,就开始直接和底层交互,使用native方法,直接和浏览器交互,这样就可以避免JavaScript 环境沙箱的限制
    WebDriver 就是为了解决Selenium的痛点
    
    回到2008年,中国申奥成功,美国次贷危机爆发,国际经济变得不景气,笼罩着深深萧条景象。WebDriver和Selenium却迎来了发展合并,他们两家为什么合并呢?WebDriver的编写者的一封书信:
    
    大意就是,我们都有不足,但又可以互相弥补,让我们更加的健壮
    WebDriver:能绕过JS的sandbox,我们有丰富的APi,方法之间的互不干扰???
    //js的沙箱限制是什么
    Selenium:支持多个浏览器
    //remote control的支持 ,解决同源策略
    

    Selenium`s Tool Suite

    Selenium 2

    很有特色,很有聚合力的工具包
    就是一些APi的调用
    
    WebDriver API 和Selenium1的底层技术支持,
    Selenium 2 始终在后台运行着Selenium1的RC接口----这是面试点吧
    

    Selenium 1

    Selenium RC 就是Selenium project中最主要的东西,也是再未何必之前,最有效力的工具
    

    Selenium IDE

    Selenium IDE(Integrated Development Environment)就是用来录制脚本原型的,是Firefox的一个插件,简单易用,有录制功能,录制用户的操作,然后生成一个脚本
    

    Selenium——Grid

    可以分布式的运行,就是可以在多个环境下运行
    parallel 平行地
    不同的tests可以在同一时间运行
    主要就是把它分布到不同的远程机器上
    
    这样做有什么好处呢?
    1. test suite很多很多,或者一个很复杂运行很慢的suite,就可以分布开来
    2. 比如你要把你的test suite运行在多个环境中(比如不同的浏览器),并要在同一时间段运行,你也可以采用分布式
    

    选择你的Selenium 工具

    IDE,简单易上手
    选择一门语言调用WebDriver的API
    
    Selenium-WebDriver API 是Selenium的未来方向,
    Selenium 1 提供后台能力
    

    Selenium 支持的浏览器和平台

    WebDriver 和Selenium-RC
    
    Selenium-WebDriver:
    Google Chrome
    Internet Explorer 7,9.。。
    Firefox
    Safari
    Opera
    HtmlUnit
    phantomjs
    Android(with Selendroid or appium)
    IOS(with ios-driver or appium)
    
    Selenium 1.0 和 Selenium-RC
    .......
    

    延展性

    customization
    开源 修改
    

    接下来文档中述说的东西

    chapter:
    Selenium IDE
    
    Selenium 2
    
    Selenium 1
        通过Selenium RC API开展自动化
        安装配置Selenium RC
        
        
        
    Test Design Considerations
    
    Selenium-Grid
    

    Selenium IDE

    ....省略 安装下载
    Firefox
    

    Selenium WebDriver

    介绍WebDriver

    Selenium 2 的特色:就是集成了 WebDriver的API
    Webdriver 设计的初衷就是为了解决Selenium-RC API的限制缺陷,并且提供一个更加简洁明了的程序接口(更加的见名知意的API)
    更加地支持动态页面,如动态元素改变,然而页面并没有变化的时候
    

    WebDriver 如何driver 浏览器和Selenium-RC的区别

    Selenium-WebDriver 直接调用浏览器 通过使用浏览器的native支持来实现自动化
    
    不同的浏览器对这些直接调用的支持响应是不一样的,取决你使用的浏览器
    
    “browser driver” --支持automation
    
    WebDriver实现的和Selenium—RC非常的类似
    
    Selenium-RC的也是使用相同的方式,它注入JavaScript脚本到浏览器(通过js操作浏览器)当浏览器加载好然后页面调用Selenium-CoreJS代码驱动AUT
    WebDriver 不使用这个技术,
    它是直接调用浏览器通过内置的 对自动化的支持-----这是面点
    

    WebDriver 和 Selenium-Server

    Selenium Server 何时启动(这也是C/S架构??)
    取决于你需要如何使用Selenium-WebDriver
    如果你一直一台机器上跑测试用例(浏览器和测试用例都在一台机器上)
    你的自动化测试中只用到了WebDriver API ,这就不需要Selenium-Server
    
    WebDriver会直接运行浏览器
    
    以下是同时使用Selenium-Server和Selenium—WebDriver:
    
    1. 使用Selenium-Grid(分布式),部署你的测试用例到不同机器上或者虚拟机上
    2. 你需要连接远程服务器,可能是他有一个特定版本的浏览器,而你的机器上没有这个版本的浏览器
    3. 你没有使用java、pythondeng然后又想使用HTMLUnit Driver
    

    安装 Selenium-WebDriver project

    java 
    
    使用Maven (会自动绑定Selenium 2.0 java client libray)和它的依赖库
    
    
    python 
    
    pip install selenium
    

    Selenium1.0 进行迁移

    Selenium-WebDriver API 例子

    WebDriver是一个工具,一些列的API
    比Selenium-RC(1.0)的APi更加简洁
    相当于一个客户端请求???
    
    要调用哪个浏览器,就要下载响应的driver(因为每个浏览器对automation的支持不一样),否则无法运行浏览器
    //这也是面试点
    
    没有和任何测试框架绑定(和单元测试集成),所有可用有很好支持性
    
    只是一个python库,调用其API即可
    把各浏览器的driver集成进去
    

    Selenium-WebDriver API 命令和操作

    WebDriver调用会另外写一个说明
    
    1. get调用URL
    2. 定位UI元素(这块是面试点)
    css 版本不同可能会有不同路径,css可能不work
    
    Xpath 高级操作 native
    但是有些不支持 原生的Xpath(native Xpath),Selenium提供会有自己的实现方法,但这样会有不可预期的行为出现,除非你知道这些Xpath 引擎的不同
    
    
    在WebDriver中使用xpath时的经验法则是,您不应该期望能够匹配这些隐式属性。
    //意思是,一些默认的属性可能无法匹配到?
    
     Note that this will only return the visible text displayed on the page.
     //隐式的属性存在很多的不确定性
    

    Driver Specifics and Tradeoffs

    Selenium-WebDriver`s Drivers

    WebDriver 就是一系列key interface 来写你的test case,但是它还有其他的功能
    
    
    HTmlUnit Driver
    
    一个java实现的没有GUI的浏览器,这个就需要Selenium Server 啦(高级面试点)
    
    很少使用到,以后再补充
    ----------=====--------
    

    Alternative Back-Ends: Mixing WebDriver and RC Technologies

    把WebDriver和RC结合起来
    
    WebDriver-Backed Selenium-RC
    java版本:
    WebDriver 可以实现 Selenium-RC 的API
    可以通过WebDriver调用Selenium-RC API
    这是后端兼容性的体现
    这样就可以让存在的test suites(已经使用Selenium-RC API)可以使用WebDriver
    这样可以实现1到2的迁移
    也可以同时使用这两种API
    
    Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl)
    
    WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getWrappedDriver()
    
    selenium.stop()
    
    pros:
    1. 允许WebDriver和selenium api同时存在
    2. 提供简单的迁移从Selenium RC API 到 WebDriver
    3. 不需要脱机的运行 Selenium RC Server
    
    cons
    不能实现每个方法
    很多方法不能使用
    很多方法会变慢因为底层实现不一样了
    

    Backing WebDriver with Selenium

    WebDriver 不像Selenium-RC一样可以支持很多浏览器
    所有为了获得这种支持可以使用此条命令:
    SeleneseCommandExecutor
    
    Safari:
    
    但此种方式有很多限制,然后由于使用Selenium Core,就会有JavaScript的沙箱限制
    

    脱机运行Selenium Server 通过使用RemoteDrivers

    WebDriver: Advanced Usage

    显示等待和隐式等待不可混用,否则会造成不可预知的错误
    

    Explicit Waits

    显式等待,设定等待时间,超时报错 或者在设定的时间内返回结果
    WebDriverwait 默认没500ms就检查一遍是否出现,ExpectedCondition function 返回Boolean值true或者no-null object
    
    理解:设定一个超时时间,在设定的时间内有可能1s或者2s就找到不必设定确定的时间点(sleep), 默认就会没500ms就查找一次,直到找到(设定时间内),否则报错
    

    Implicit wait

    隐式等待:在规定时间内轮询DOM树,直到找到元素
    设置为0,就代表生命周期为WebDriver对象实例的生命周期
    

    RemoteWebDrive

    Browser Startup Manipulation(开始操作浏览器)

    重新存储内存
    改变Firefox 文件
    运行浏览器插件
    
    
    使用代理
    
        Capabablities object
    

    Selenium 1(Selenium RC)

    Introduction

    在Selenium2出现前,1代是最有效的工具,现今它仍然在运作当中,提供了一些 Selenium 2 中无法实现的功能
    //这些功能是什么呢?
    支持多语言编码,支持几乎所有的浏览器
    

    How Selenium RC works

    RC 组成部分(components)

    Selenium RC components:

    1. Selenium Server: 运行或者关闭浏览器,翻译和运行 Selenese 命令(接收程序传递的命令)
    充当HTTP代理,验证和解析http 信息(Web服务器端和代码客户端)
    
    
    2. 客户端(客户端库接口),通过编写代码(各种编程语言),来连接 Selenium RC Server
    
    ------------------------
    Selenium Core
    
        Application under test
    ------------------------
                |
                |
    ------------------------
            Remote Control Server
    ------------------------
                |
                |
    ------------------------
        machine boundary
        模拟客户端
        python Ruby java...
    -------------------------
    
    模拟客户端连接Server,传入Selenium Command,Server把这些命令传入浏览器(通过Selenium-Core JavaScript commands),
    然后浏览器使用它自己js解析器,来解析执行这行Selenium命令
    

    Selenium Server

    Server端收到你请求的这些Selenium命令,解析他,然后提供给你这些test的结果
    
    RC server 捆绑了Selenium Core 然后把它注入集成到浏览器中。
    Selenium Core 注入浏览器是发生在当你的测试代码(客户端API)发出请求时。(给浏览器添加一些JS脚本)
    
    Selenium-Core就是一堆JavaScript程序,一系列JS的方法,这些方法解释和执行Selenese命令通过浏览器内置的JavaScript解释器 (这可能是面试点)
    
    Server 从客户端接收到Selenese命令
    ===也就是客户端Request(post/get)
    这样说明你可以使用任何语言,只要他能实现Request请求
    

    Client Libraries

    客户端请求,就是把一些Selenium 命令发给服务器
    
    调用客户端的API,写下你想搭配的Selenese命令,然后发给服务器(application under test --AUT)
    接收服务端返回的结果
    
    安装
    安装Selenium,这种说法是不恰当的(misnomer)
    
    安装 RC server :Java 
    Client API
    
    比如使用python
    

    Adding Some Spice to Your Tests

    为何需要使用RC(可能是面试点)
    IDE不支持迭代和一些标准的条件语句,你需要加入JS作为Selenese的参数,还有一些异常的捕获,运行啊
    
    verification power
    
    还可以执行JS代码
    

    Server options

    改变Server的行为
    
    ............
    
    代理设置
    
    多窗口
    
    
    此章节并未过多查看
    

    Specifying the Firefox profile

    Firefox不会同时运行两个实例
    ......
    
    何时要用到profile
    

    Specifying the Path to a Specific Browser

    Selenium RC Architecture

    理解点
    
    Selenium RC 背后实现的逻辑,它是如何工作的,为什么要使用代理
    //面试点
    
    The same origin policy(同源策略)
    同源策略是限制Selenium的一个主要因素
    出于安全的考虑:比如某个站点的脚本不能控制另外一个站点内容
    同源策略表明浏览器加载任何代码,生命周期都只能在同一个域名内的网站。不能操作另一个网站
    //比如在baidu的域名内的脚本不能对Google网站进行任何操作,
    //为什么不能呢,可以的话我访问一个网站,这个网站的js脚本来读取我另一个银行网站的账号密码并保存的话,后果不堪设想
    
    这就是XSS (Cross-site Scripting)
    
    
    处于对同源策略的考虑,并运用这种策略
    Selenium-Core(开始利用JavaScript实现一些不可能的事情),当然Selenium也是只能在同样的URL下做一些事情
    //same origin
    
    自从Selenium-Core的出现就被同源策略的问题困扰着,
    通过Selenium Server作为代理,以此来解决问题
    就是告诉浏览器,浏览器正工作在一个伪装的站点上工作,Server提供了这个伪装的站点
    

    Proxy Injection

    使用此方法避免同源策略的问题
    在这种模式下, Server端其实对于浏览器端是充当着客户端的角色,对浏览器发起请求。
    HTTP Proxy:
    1. proxy就是中间方,充当着一个web server的作用,传递AUT到浏览器,代理使得Selenium Server有着对AUT所访问的URL有欺骗的能力
    2. 浏览器修改配置文件(设置localhost:4444作为http代理)然后运行。这就是为什么HTTP请求,会先发送到Selenium Server端,然后浏览器端返回也经过他,而不是真正的Server端
    //通过代理,使得每一次访问都是来自localhost:4444这个端口,所以满足 host 域名 协议相同的同源策略(面试点)
    
    然后使得AUT是在一个虚构的URL下工作(嵌入Selenium-Core和一系列的测试,然后传送他们,就像他们来自同一个源)
    

    从你写client端代码到自动化的实现流程:

    1. 客户端和RC server 建立连接
    
    
    2. RC server 运行调用浏览器(或者已经使用过的)--URL,然后注入Selenium-Core中JS代码到已经打开的浏览器中
    
    //Selenium-Core是操作浏览器的基础
    但是这些jS脚本的源是你的localhost(这样就不能操控其他的domain),浏览器出于同源策略会阻止脚本的运行,
    除非你把他注入到页面所在的远程服务器
    
    
    
    3. client 开始发送 Selenese命令到server端 
    //在没有使用代理前,你发送这些命令,Sele-Core是无法跨域操控的
    //selenium-Core会解析你从客户端发来的命令,然后调用相应的JS代码操作页面---问题来了,是否可以直接操作页面呢
    //就比如你点击页面元素,web服务器监听你的请求,然后做出相应的返回---也就是改变浏览器呈现的页面
    //那浏览器就要判断你的这个改变是否满足同源(通过代理就是的selenium-Core就像是Web服务器返回的响应一样),是的化,允许操作,不是的话,拒绝XSS-----面试点?
    
    
    4. 然后server端解析这些命令,然后触发相应的js代码,js对浏览器进行操作。
    Selenese-Core指导浏览器的第一个动作,通常是打开AUT的首页面(访问url)
    
    
    5. 浏览器接收到open的Request请求并访问站点内容--这些都是RC server请求的来获得的
    
    
    6. RC server 和 Web服务器进行交互请求页面信息一旦获得页面,他发送这些页面到浏览器伪装成同源(都是从同一个代理端口返回的),
    使得这些页面看起来像从Selenium-Core所在服务器来的 (这就是允许Selenium-Core执行同源策略)
    //浏览器看到所有返回的页面都是来自同一个端口(满足同源),就可以调用js操作
    
    
    7. 浏览器收到web 页面然后渲染他(已经打开的浏览器) 
    
    //浏览器检测是从localhost:4444端口发起的请求,并从这个端口返回页面信息,满足同源从而渲染他
    //浏览器认为selenium-Core 和 web 服务器是同源地,允许web服务器对页面进行操作(比如我像web服务器,请求信息,web服务器返回信息,并通过浏览器渲染出来)
    
    理解:client API 连接 --》 RC server --》 注入Selenium-Core(通过这个来操作浏览器)_就要使得Core中js脚本像是从Web服务器来的---》 浏览器 《---- RC server《--》webserver
    

    Heightened Privileges Browsers

    和Proxy Injection差不多
    但不同的是使用特殊的mode启动浏览器---Heightened Privilege 特权模式?
    (可以XSS,填充文件上传,或者其他)
    还可不通过RC server 直接读取客户端的请求
    

    ...................................

    Test Design Considerations

    什么部分,需要被测试呢?
    取决于你的project,用户的期望,时间限制,领导安排等
    
    领导决定,你来执行
    

    测试静态元素

    一般测试:
    1. page title--验证link 跳转
    2. 验证期望的图片是否出现(homepage)
    3. 页面页脚这些东西是否存在(版权信息,公司信息等)
    4. heading test 是否是<h1>tag等
    
    这些东西,主要还是提高效率
    

    测试links

    link页面跳转是否正常
    

    Function tests

    基于用户的操作
    Typical tests can be for login, registration to the site, user account operations, account settings changes, complex data retrieval operations, among others.
    

    测试动态元素

    测试Ajax

    Only a portion of the page, or strictly the element itself is reloaded.
    

    Validating Result

    assert 和 Verify的区别
    
    assert ,不一样即停止
    
    verify,不停止 但定位更复杂
    

    定位元素

    1. id name 最好
    2. xpath 花费时间长:浏览器需要运行它自己的xpath进程,尤其IE7对Xpath的支持最不好
    3. link text 也很方便
    如果text经常改变,定位<a>tag也不错
    
    但是Xpath确实最能保证定位到元素的方法
    
    可以在xpath中结合使用id、 name,内置函数也很丰富,也能定位元素属性等
    
    定位ajax 
    使用 waitFor()
    
    安全操作:操作元素之前,检查元素是否存在
    
    也可以只判断元素是否存在
    
    
    可以将所有的定位器存储在一个地方,以便当元素路径发生修改时进行修改
    
    元素定位封装到一py文件中
    方便管理
    
    页面对象设计模式
    

    相关文章

      网友评论

          本文标题:selenium

          本文链接:https://www.haomeiwen.com/subject/nkkcictx.html