【自动化测试】selenium的底层实现是怎么样的?

本文详细介绍了selenium的工作原理,包括selenium是什么,如何打开浏览器,以及如何执行各种操作。selenium通过WebDriver API与浏览器交互,启动浏览器驱动,建立HTTP接口与远程WebDriver服务器连接,通过发送POST请求执行命令来控制浏览器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事件的起因就是一直会用selenium但没有去探究过底层的实现原理,结果面试被问就答不上来了,被建议回去多看看底层实现。selenium是怎么样打开浏览器的?selenium是怎么执行对应操作的?这不,就来总结了!

一、selenium是什么?

1.selenium 介绍

Selenium是ThroughtWorks公司一个强大的开源Web功能测试工具系列,支持多平台、多浏览器、多语言去实现自动化测试,Selenium2将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),所以就像真正的用户在操作一样。

我们使用Selenium实现自动化测试,主要需要3个东西

  1. 测试脚本
  2. 浏览器驱动, 这个驱动是根据不同的浏览器开发的,不同的浏览器使用不同的webdriver驱动程序且需要对应相应的浏览器版本
  3. 浏览器,目前selenium支持市面上大多数浏览器,如:火狐,谷歌,IE等

二、selenium打开浏览器的过程?

首先,当我们输入最简单的获取浏览器的driver时,通常会写下这样的代码,这里我使用的是火狐浏览器:

from selenium import webdriver
driver = webdriver.Firefox()

1. WebDriver类

这里让我们来探究下WebDriver的相应源码,按住CTRL后点击Firefox() 就可以进入。
首先来看init初始化方法,它的作用就是 启动一个新的Firefox本地会话
(源码比较长,就不全部放出来了,大家可以自己打开对应着看)
这里展现了init方法中的各个参数

def __init__(self, firefox_profile=None, firefox_binary=None,
                 timeout=30, capabilities=None, proxy=None,
                 executable_path="geckodriver", options=None,
                 service_log_path="geckodriver.log", firefox_options=None,
                 service_args=None, desired_capabilities=None, log_path=None,
                 keep_alive=True):

				.....(此处省略)
				
        if capabilities.get("marionette"):
            capabilities.pop("marionette")
            self.service = Service(  # 这里是实例化一个service的对象
                executable_path,
                service_args=service_args,
                log_path=service_log_path)
            self.service.start()    # 执行了这个对象的start()方法

            capabilities.update(options.to_capabilities())

            executor = FirefoxRemoteConnection(    # 执行了连接的方法
                remote_server_addr=self.service.service_url)
            RemoteWebDriver.__init__(		# 对RemoteWebDriver进行初始化
                self,
                command_executor=executor,
                desired_capabilities=capabilities,
                keep_alive=True)
		
			.....

2. 打开浏览器驱动程序

可以看到,首先时实例化了一个Service的对象,并且执行了这个对象的start()方法。
首先来看Service类:

    def __init__(self, executable_path, port=0, service_args=None,
                 log_path="geckodriver.log", env=None):
        """Creates a new instance of the GeckoDriver remote service proxy.

        GeckoDriver provides a HTTP interface speaking the W3C WebDriver
        protocol to Marionette.
        ...
        """

通过查看Service类中的的init方法的注释,可以发现,初始化Service对象就是创建了一个新的远程代理实例,这个实例提供了一个使用W3C webdriver 的HTTP协议的接口

创建好这样的实例后,就调用了这个实例的start()方法启动服务:

    def start(self):
        """
        Starts the Service.

        :Exceptions:
         - WebDriverException : Raised either when it can't start the service
           or when it can't connect to the service
        """
        try:
            cmd = [self.path]
            cmd.extend(self.command_line_args())
            self.process = subprocess.Popen(cmd, env=self.env,
                                            close_fds=platform.system() != 'Windows',
                                            stdout=self.log_file,
                                            stderr=self.log_file,
                                            stdin=PIPE)
        except TypeError:
            raise
        except OSError as err:
            if err.errno == errno.ENOENT:
                raise WebDriverException(
              
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值