阅读Selenium源码——从FirefoxDriver类实现说起

摘要:在Selenium的使用过程中,驱动浏览器始终是最为重要的一环,因此,从此处入手更容易理解Selenium的架构和原理。此篇文章将以Firefox浏览器为例,浅析Selenium的驱动模式,以期裨益。


一、入门


Selenium启动firefox主要有两种方式:

1.启动本机Firefox的WebDriver,执行默认配置;

2.启动远程WebDriver,进一步操控Firefox动作,此为Selenium Grid的启动方式;


本质上来讲,两种启动方式并无太大区别,本机亦可被视为远程的一种特殊情况。为了简便,本文便以第一种启动方式为例,探究Selenium的启动机制。


在利用Selenium搭建自动化测试框架的过程中,通常采用下面这种形式:

 WebDriver driver = new FirefoxDriver(); 

这是最简便的一种方式,所有的设置都来自于Selenium默认的配置。当然,如果你的Firefox不是安装在默认路径下,你可能需要下面这样的设置:

System.setProperty("webdriver.firefox.bin","E:/Program Files/Mozilla Firefox/firefox.exe");//指定firefox的安装路径
WebDriver driver = new FirefoxDriver();

如果你在启动脚本的过程中发现firefox总是打开欢迎或者向导等页面,你也可能需要进行下面的设置:

FirefoxProfile profiles = new FirefoxProfile();
profiles.setPreference("browser.startup.homepage", "about:blank");
profiles.setPreference("startup.homepage_welcome_url", "about:blank");
profiles.setPreference("startup.homepage_welcome_url.additional", "about:blank");
WebDriver driver = new FirefoxDriver(profiles);


如果你还有其他的问题和需要,可以点击这里


二、初窥


在FirefoxDriver类中,继承了RemoteWebDriver类,Selenium的核心基类,在下面具体说明。

FirefoxDriver的结构

FirefoxDriver具有九个构造函数,为了简单,我们从最底层的构造函数开始

 public FirefoxDriver(FirefoxBinary binary, FirefoxProfile profile,
      Capabilities desiredCapabilities, Capabilities requiredCapabilities) {
    this(createCommandExecutor(populateProfile(profile, desiredCapabilities), binary, profile),
         populateProfile(profile, desiredCapabilities), requiredCapabilities);
    this.binary = binary;
  }

四个参数,


FirefoxBinary binary  firefox的二进制文件。FirefoxBinary类通过调用Executable类去查找Windows/Mac/UNIX系统中的 firefox二进制文件。点击查看细节


FirefoxProfile profile   firefox的配置文件。


Capabilities desiredCapabilities    用来描述用户请求Session的特征。


Capabilities requiredCapabilities  与上一个类似,但是这部分Selenium并未赋予实际功能,一般为空。

两个重要函数,


createCommandExecutor(populateProfile(profile, desiredCapabilities), binary, profile)    创建一个与server或者本地建立http连接并接受command的executor,这里默认连接本地。

populateProfile(profile, desiredCapabilities)    从desiredCapabilities中加载关于浏览器设置的信息到profile。


三、发展


在完成步骤二后,调用父类RemoteWebDriver的构造函数。

1.加载日志和profile,这个工作由init(desiredCapabilities, requiredCapabilities )函数完成;

2.startClient()操作,这个函数默认没有任何操作,需要在子类中具体实现,然而FirefoxDriver类并没有重写这个函数

3.startSession(desiredCapabilities, requiredCapabilities),启动session,程序的最终目标,经过前面的各种设置之后启动符合条件的session。


四、尾声

一般来讲,我们都会用WebDriver类型的对象来进行下一步的定位和页面流转。因为RemoteWebDriver实现了WebDriver接口,FirefoxDriver又是RemoteWebDriver的子类。因此,为了避免FirefoxDriver类中过多操作、函数、变量的冗杂,只采用最基础的类型。在这里我只简单介绍了FirefoxDriver类的实现过程,并没有过多的涉及其内部具体方法。你可以点击这里来了解更多。

















  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值