Selenium自动化工具工作原理

摘要:
http://blog.csdn.net/five3/article/details/6790925原作者信息如下。有关更多信息,请访问原作者的博客:作者:hyddd来源:http://www.cnblogs.com/hyddd/这篇文章的版权归作者所有。欢迎您转载、推导或用于商业目的,但必须注明本文来源(包括链接)===========================================

http://blog.csdn.net/five3/article/details/6790925

原文作者信息如下,需要更多信息请去原作者博客查看:

作者:hyddd
出处:http://www.cnblogs.com/hyddd/
本文版权归作者所有,欢迎转载,演绎或用于商业目的,但是必须说明本文出处(包含链接)。


==============================================================================================


Selenium简介》 中讲过,Selenium RC支持多种语言编写测试案例,如:C#,Python。在工作中,我倾向于是用Python这类动态语言编写测试案例,因为这样的测试案例无需编 译:>,试想如果你有1000个测试案例,每个都要编译,那会给编译服务器很大的压力,而且案例修改后,还得重新编译才能运行:<。但在本系 列的文章中,我还是打算使用C#编写示范例子。

Selenium RC下载:http://seleniumhq.org/download/

Selenium自动化工具工作原理第1张

写Selenium RC的测试案例

     上一篇《Selenium IDE的使用》中,提到了Selenium IDE可以把录制的脚本转为其他语言的脚本,所以我继续用上一篇的脚本为例子,下面是把脚本语言转换为C#后的代码:

  1. using System;  
  2. using System.Text;  
  3. using System.Text.RegularExpressions;  
  4. using System.Threading;  
  5. using NUnit.Framework;  
  6. using Selenium;  
  7.   
  8. namespace SeleniumTests  
  9. {  
  10.     [TestFixture]  
  11.     public class NewTest  
  12.     {  
  13.         private ISelenium selenium;  
  14.         private StringBuilder verificationErrors;  
  15.           
  16.         [SetUp]  
  17.         public void SetupTest()  
  18.         {  
  19.             selenium = new DefaultSelenium("localhost", 4444, "*chrome""http://change-this-to-the-site-you-are-testing/");  
  20.             selenium.Start();  
  21.             verificationErrors = new StringBuilder();  
  22.         }  
  23.           
  24.         [TearDown]  
  25.         public void TeardownTest()  
  26.         {  
  27.             try  
  28.             {  
  29.                 selenium.Stop();  
  30.             }  
  31.             catch (Exception)  
  32.             {  
  33.                 // Ignore errors if unable to close the browser  
  34.             }  
  35.             Assert.AreEqual("", verificationErrors.ToString());  
  36.         }  
  37.           
  38.         [Test]  
  39.         public void TheNewTest()  
  40.         {  
  41.             selenium.Open("/");  
  42.             selenium.Type("kw""hyddd");  
  43.             selenium.Click("sb");  
  44.             selenium.WaitForPageToLoad("30000");  
  45.             try  
  46.             {  
  47.                 Assert.IsTrue(selenium.IsTextPresent("hyddd - 博客园"));  
  48.             }  
  49.             catch (AssertionException e)  
  50.             {  
  51.                 verificationErrors.Append(e.Message);  
  52.             }  
  53.             selenium.Click("//table[@id='1']/tbody/tr/td/a/font");  
  54.         }  
  55.     }  
  56. }  



在这里,转换后的脚本使用了NUnit测试框架,为了简化,我用VS的Test Project代替(当然你也可以用Console Application建立测试工程的),步骤如下:
1.建立Test Project

Selenium自动化工具工作原理第2张

2.导入DLL引用

    把selenium-dotnet-client-driver-1.0-beta-2目录中的ThoughtWorks.Selenium.Core.dllThoughtWorks.Selenium.IntegrationTests.dllThoughtWorks.Selenium.UnitTests.dll加入项目:

Selenium自动化工具工作原理第3张

3.把上面自动生成的代码再改一下

  1. using System;  
  2. using System.Text;  
  3. using System.Collections.Generic;  
  4. using Microsoft.VisualStudio.TestTools.UnitTesting;  
  5. using Selenium;  
  6.   
  7. namespace SeleniumTest  
  8. {  
  9.     [TestClass]  
  10.     public class UnitTest1  
  11.     {  
  12.         [TestMethod]  
  13.         public void Test()  
  14.         {  
  15.             //127.0.0.1为Selenium测试服务器位置。  
  16.             //4444为Selenium测试服务器监听端口。  
  17.             //*iexplore为启动浏览器类型,我把它改为了IE浏览器。  
  18.             //http://www.baidu.com为源地址。  
  19.             ISelenium selenium = new DefaultSelenium("127.0.0.1", 4444, "*iexplore""http://www.baidu.com");  
  20.             selenium.Start();  
  21.             selenium.Open("/");  
  22.             selenium.Type("kw""hyddd");  
  23.             selenium.Click("sb");  
  24.             selenium.WaitForPageToLoad("30000");  
  25.             Assert.IsTrue(selenium.IsTextPresent("hyddd - 博客园"));  
  26.             selenium.Click("//table[@id='1']/tbody/tr/td/a/font");  
  27.       selenium.Close();  
  28.             selenium.Stop();  
  29.         }  
  30.     }  
  31. }  



4.启动Selenium测试服务器
    打开cmd进入selenium-server-1.0-beta-2目录,输入“java -jar selenium-server.jar”
(需要先安装JRE),启动Selenium测试服务器。
Selenium自动化工具工作原理第4张

5.运行测试案例
(1).运行测试案例:
Selenium自动化工具工作原理第5张

(2).测试结果:

Selenium自动化工具工作原理第6张
恩,案例Pass了,如果案例失败的话,Error Meesage会说明失败的原因。
(注意:和Firefox一样,IE下也有屏蔽弹出网页功能,修改设置方法:MenuBar->Tools->Popup Blocker->Turn off Popup Blocker,或者在Popup Blocker Settings里面配置。)



   前一篇已经比较详细讲述了如何使用Selenium RC进行Web测试,但到底Selenium RC是什么?或者它由哪几部分组成呢??

一.Selenium RC的组成:

关于这个问题,我拿了官网上的一幅图来说明这个问题。

Selenium自动化工具工作原理第7张 

Selenium RC主要由两部分组成:

(1).Selenium Server:

 Selenium自动化工具工作原理第8张

Selenium Server负责控制浏览器行为,总的来说,Selenium Server主要包括3个部分:LauncherHttp ProxySelenium Core。其中Selenium Core是被Selenium Server嵌入到浏览器页面中的。其实Selenium Core就是一堆JS函数的集合,就是通过这些JS函数,我们才可以实现用程序对浏览器进行操作。

(2).Client Libraries:

写测试案例时用来控制Selenium Server的库。

 Selenium自动化工具工作原理第9张

二.Selenium RC与Testcase的关系

先看下图:

Selenium自动化工具工作原理第10张 

(1).测试案例(Testcase)通过Client Lib的接口向Selenium Server发送Http请求,要求和Selenium Server建立连接。

为什么要通过发送Http请求控制Selenium Server而不采用其他方式呢?从上文可以看出,Selenium Server是一个独立的中间服务器(确切地说是代理服务器),它可以架设在其他机器上!所以测试案例通过发送HTTP请求去控制Selenium Server是很正常的。

(2).Selenium Server的Launcher启动浏览器,把Selenium Core加载入浏览器页面当中,并把浏览器的代理设置为Selenium Server的Http Proxy。

(3).测试案例通过Client Lib的接口向Selenium Server发送Http请求,Selenium Server对请求进行解析,然后通过Http Proxy发送JS命令通知Selenium Core执行操作浏览器的动作。

(4).Selenium Core接收到指令后,执行操作。

(5).浏览器收到新的页面请求信息(因为在(4)中,Selenium Core的操作可能引发新的页面请求),于是发送Http请求,请求新的Web页面。
由于Selenium Server在启动浏览器时做了手脚,所以Selenium Server会接收到所有由它启动的浏览器发送的请求。

(6).Selenium Server接收到浏览器的发送的Http请求后,自己重组Http请求,获取对应的Web页面。

(7).Selenium Server的Http Proxy把接收的Web页面返回给浏览器。

为什么Selenium RC中的Selenium Server需要以这种代理服务器的形式存在呢?下一篇继续介绍:>


继续前一篇的问题,为什么Selenium RC中的Selenium Server需要以这种代理服务器的形式存在?其实,这和浏览器的“同源策略”(The Same Origin Policy)有关。

Selenium Server以代理的形式存在,通过修改WebSite的源信息,从而达到欺骗浏览器的目的,就这样,Selenium RC就轻松绕过了同源策略

一.什么是同源策略

    同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略。

为什么需要同源策略,这里举个例子:
    假设现在没有同源策略,会发生什么事情呢?大家知道,JavaScript可以做很多东西,比如:读取/修改网页中某个值。恩,你现在打开了浏览器,在一 个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问 这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改,后果会非常严重!而同源策略就为了防止这种事情发生, 看下图:

Selenium自动化工具工作原理第11张 

比如说,浏览器的两个tab页中分别打开http://www.baidu.com/index.html和http://www.google.com/index.html,其中,JavaScript1和JavaScript3是属于百度的脚本,而JavaScript2是属于谷歌的脚本,当浏览器的tab1要运行一个脚本时,便会进行同源检查,只有和www.baidu.com源的脚本才能被执行,所谓同源,就是指域名、协议、端口相同。所以,tab1只能执行JavaScript1和JavaScript3脚本,而JavaScript2不能执行,从而防止其他网页对本网页的非法篡改。


二.Selenium Server为什么以这种代理服务器的形式存在
    上面说了同源策略,那同源策略的Selenium Server有什么关系呢??呵呵,上一篇说过,Selenium Core是一堆JS函数的集合,它是我们操作浏览器的基础。当存在同源策略时,便出现一些问题,看下图:

Selenium自动化工具工作原理第12张

因为Selenium Core的JS脚本的“源”是localhost,所以浏览器会阻止Selenium Core的JS脚本在测试页面上执行,这就是为什么在本系列第一篇中说,如果只使用Selenium Core进行测试,需要把Selenium Core安装到远程服务器上。

    为了解决上面这个问题,Selenium RC中的Selenium Server就以代理服务器的形式出现了,下图说明它是如何借助代理的身份蒙骗浏览器的:>

Selenium自动化工具工作原理第13张

Selenium Server以代理的形式存在,通过修改WebSite的源信息,从而达到欺骗浏览器的目的,就这样,Selenium RC就轻松绕过了同源策略。在上图中,浏览器会认为WebSite和Selenium Core来自同一个“源”----代理服务器!

免责声明:文章转载自《Selenium自动化工具工作原理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle手工生成AWR报告方法记录Ubuntu 16.04安装GIMP替代PS下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[Selenium] CSS3 选择器

http://www.cnblogs.com/MasterMonkInTemple/category/564552.html 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。 "CSS" 列指示该属性是在哪个 CSS 版本中定义的。(CSS1、CSS2 还是 CSS3。) 选择器 例子 例子描述 CSS .class .intro 选...

selenium使用等待的几种方式

1.使用java的sleep try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStack...

用selenium 自动爬取某一本小说章节及其内容,并存入数据库中

1 from selenium import webdriver 2 import pymysql 3 from selenium.webdriver.support.ui import WebDriverWait # 等待 4 from selenium.webdriver.support import expected_conditi...

极验验证码破解之selenium

这一篇写完很久了,因为识别率一直很低,没办法拿出来见大家,所以一直隐藏着,今天终于可以拿出来见见阳光了。 哈喽,大家好,我是星星在线,我又来了,今天给大家带来的是极验验证码的selenium破解之法,是不是有点小激动呢,小伙伴们等不了了,让我们赶紧直入主题吧。 虎嗅网注册 这次我们是拿虎嗅开刀,注册账号的时候需要滑动图片到缺口位置,这种验证码我们现在也经常...

selenium之处理alert弹出对话框

在完成某些操作时会弹出对话框来提示,主要分为"警告消息框","确认消息框","提示消息对话"三种类型的对话框。    1.警告消息框(alert)  警告消息框提供了一个"确定"按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说用户必须先关闭该消息框然后才能继续进行操作。   2.确认消息框(confirm)   确认消息框向用户提示一个"是与否"...

Selenium常见的无法定位到元素的原因

1.元素没有加载完成,就进行定位元素 设置等待:导入时间模块使用  time.sleep(5) 2.窗口切换  窗口句柄还处在上一个窗口,导致无法定位新窗口的元素。 3.Frame原因定位不到元素 这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别, 因此需要先定位到相应的f...