一、Selenium WebDriver运行原理
Selenium是一种用于Web应用程序自动化测试的开源工具,它支持多种浏览器,如Chrome,Firefox,IE,Safari等。WebDriver是Selenium的一个子项目,是Selenium的一个核心组件,它是一种用于自动化Web应用程序的应用程序编程接口(API),它允许程序员在不同的浏览器上编写自动化测试脚本。因此,Selenium是一种Web自动化测试工具,而WebDriver是Selenium中用于实现自动测试的核心技术。
Selenium WebDriver的运行原理是:
-
客户端发送一个请求到WebDriver服务器,要求操作浏览器。
-
WebDriver服务器接收到请求后,会将请求发送给浏览器驱动程序。
-
浏览器驱动程序将请求转换成适合当前浏览器的命令。
-
浏览器根据命令来执行相应的动作,比如打开网页、填写表单等。
-
浏览器将执行结果反馈给浏览器驱动程序。
-
浏览器驱动程序将结果反馈给WebDriver服务器。
-
WebDriver服务器将结果返回给客户端。
实际上就是启动webdriver,创建一个浏览器驱动,如:
driver = webdriver.Chrome()
基于这个驱动会启动一个浏览器对象,同时会生成一个session来管理浏览器,此时webdriver成为一个代理,其作用是代码通过webdriver下发给浏览器,浏览器将响应传给webdriver,webdriver再转给代码。
二、源码分析
此处以chrome举例
driver = webdriver.Chrome()实际对应的是这个类:
该类创建的对象实际上是:
from selenium.webdriver.chrome.webdriver import WebDriver
driver = WebDriver()
该类下初始化时有一个参数executable_path=DEFAULT_EXECUTABLE_PATH,其中DEFAULT_EXECUTABLE_PATH = “chromedriver”
因此实际上创建对象应该是:
driver = WebDriver(executable_path="chromedriver")
此时浏览器就可以启动了
访问网址
从上图可以看出,访问网址的get方法实际是使用excecute来运行,传入封装的Command类里的GET命令,以及所要访问的网址。
因此可以写成:
driver.execute('get', {'url': 'http://www.jd.com'})
元素定位
传入的by和value值由不同定位方式决定,以By.ID为例,则by的值为By.CSS_SELECTOR,value值为’[id=“%s”]’ % value
因此,代码可以写成:
el = driver.execute("findElement", {
'using': "css selector",
'value': '[id="key"]'
})['value']
那么其中为什么最后要加上[‘value’]呢,原因是不加上的话,我们运行得来的是:
得到是一个字典,因此我们需要取出value的值(element)
元素输入
self._execute(Command.SEND_KEYS_TO_ELEMENT, {'text': "".join(keys_to_typing(value)), 'value': keys_to_typing(value)})
的作用是将文本字符串value输入到被选中的元素中,其中keys_to_typing(value)是一个函数,用于将文本转换成selenium能够识别的字符串格式。
因此可以写成:
# el为定位到的元素
el._execute("sendKeysToElement", {
'text': "sendkeys_value",
'value': "sendkeys_value"})
元素点击
元素点击就比较简单了,直接传Command类的命令就可以了
# el为定位到的元素
el._execute("clickElement")
其它的操作方法也是类似,就不一一列举了