事件的起因就是一直会用selenium但没有去探究过底层的实现原理,结果面试被问就答不上来了,被建议回去多看看底层实现。selenium是怎么样打开浏览器的?selenium是怎么执行对应操作的?这不,就来总结了!
文章目录
一、selenium是什么?
1.selenium 介绍
Selenium是ThroughtWorks公司一个强大的开源Web功能测试工具系列,支持多平台、多浏览器、多语言去实现自动化测试,Selenium2将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),所以就像真正的用户在操作一样。
我们使用Selenium实现自动化测试,主要需要3个东西
- 测试脚本
- 浏览器驱动, 这个驱动是根据不同的浏览器开发的,不同的浏览器使用不同的webdriver驱动程序且需要对应相应的浏览器版本
- 浏览器,目前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(