前言
由于团队里面自动化测试能力比较薄弱,明年打算赋能培训UI自动化测试,选择selenium4+python语言作为切入点吧,之前一直用的selenium3.14版本,最近发现已经更新到了4,索性直接用最新的selenium4.
Selenium Webdriver原理详解:
WebDriver提供了一种浏览器交互方式。那就是利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。Selenium WebDriver按浏览器厂商的不同,提供不同的实现,例如Chrome有专门的ChromeDriver,Firefox有geckoDriver等等。
WebDriver Wire协议是通用的,例如ChromeDriver初始化成功之后,默认会从http://localhost:46350开始,而Firefox从http://localhost:7055开始。后续我们调用WebDriver的任何API,都需要借助一个ComandExecutor发送一个命令,实际上是一个HTTP request给监听端口上的Web Service。在我们的HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串操作浏览器。
具体过程如下:
(1)实例化WebDriver,Selenium首先会确认浏览器的native component是否存在可用而且版本匹配。
(2)最新的Selenium4已经支持了WebDriver W3C协议,详见:https://w3c.github.io/webdriver/
Method | URI Template | Command |
POST | /session | New Session |
DELETE | /session/{session id} | Delete Session |
GET | /status | Status |
GET | /session/{session id}/timeouts | Get Timeouts |
POST | /session/{session id}/timeouts | Set Timeouts |
POST | /session/{session id}/url | Navigate To |
GET | /session/{session id}/url | Get Current URL |
POST | /session/{session id}/back | Back |
POST | /session/{session id}/forward | Forward |
POST | /session/{session id}/refresh | Refresh |
GET | /session/{session id}/title | Get Title |
GET | /session/{session id}/window | Get Window Handle |
DELETE | /session/{session id}/window | Close Window |
POST | /session/{session id}/window | Switch To Window |
GET | /session/{session id}/window/handles | Get Window Handles |
POST | /session/{session id}/frame | Switch To Frame |
POST | /session/{session id}/frame/parent | Switch To Parent Frame |
GET | /session/{session id}/window/rect | Get Window Rect |
POST | /session/{session id}/window/rect | Set Window Rect |
POST | /session/{session id}/window/maximize | Maximize Window |
POST | /session/{session id}/window/minimize | Minimize Window |
POST | /session/{session id}/window/fullscreen | Fullscreen Window |
GET | /session/{session id}/element/active | Get Active Element |
POST | /session/{session id}/element | Find Element |
POST | /session/{session id}/elements | Find Elements |
POST | /session/{session id}/element/{element id}/element | Find Element From Element |
POST | /session/{session id}/element/{element id}/elements | Find Elements From Element |
GET | /session/{session id}/element/{element id}/selected | Is Element Selected |
GET | /session/{session id}/element/{element id}/attribute/{name} | Get Element Attribute |
GET | /session/{session id}/element/{element id}/property/{name} | Get Element Property |
GET | /session/{session id}/element/{element id}/css/{property name} | Get Element CSS Value |
GET | /session/{session id}/element/{element id}/text | Get Element Text |
GET | /session/{session id}/element/{element id}/name | Get Element Tag Name |
GET | /session/{session id}/element/{element id}/rect | Get Element Rect |
GET | /session/{session id}/element/{element id}/enabled | Is Element Enabled |
POST | /session/{session id}/element/{element id}/click | Element Click |
POST | /session/{session id}/element/{element id}/clear | Element Clear |
POST | /session/{session id}/element/{element id}/value | Element Send Keys |
GET | /session/{session id}/source | Get Page Source |
POST | /session/{session id}/execute/sync | Execute Script |
POST | /session/{session id}/execute/async | Execute Async Script |
GET | /session/{session id}/cookie | Get All Cookies |
GET | /session/{session id}/cookie/{name} | Get Named Cookie |
POST | /session/{session id}/cookie | Add Cookie |
DELETE | /session/{session id}/cookie/{name} | Delete Cookie |
DELETE | /session/{session id}/cookie | Delete All Cookies |
POST | /session/{session id}/actions | Perform Actions |
DELETE | /session/{session id}/actions | Release Actions |
POST | /session/{session id}/alert/dismiss | Dismiss Alert |
POST | /session/{session id}/alert/accept | Accept Alert |
GET | /session/{session id}/alert/text | Get Alert Text |
POST | /session/{session id}/alert/text | Send Alert Text |
GET | /session/{session id}/screenshot | Take Screenshot |
GET | /session/{session id}/element/{element id}/screenshot | Take Element Screenshot |
Selenium3 之前发送请求需要:
实际发送的URL都是相对路径,后缀多以/session/:sessionId开头,这也意味着WebDriver每次启动浏览器都会分配一个独立的sessionId,多线程并行的时候彼此之间不会有冲突和干扰。比如我们要访问某一个网站,请求地址为:http://localhost:46350/wd/hub/session/sessionId/url,请求json内容:{"url":"http://www.qq.com"}。比如查找一个classname为test的元素,请求地址后缀为/session/sessionId/element,json内容{"using":"class_name","value":"test"},相比Selenium4主要是增加了json编解码的开销。
(3)收到并执行了这个操作之后,也会回复一个Http Response。内容也是Json,会返回找到的element的各种细节,比如text、CSS selector、tag name、class name等等。比如:
Selenium4 最新特性解读
底层协议试用W3C
在Selenium 3中,JSON Wire Protocol是测试代码和Web 浏览器之间的主要通信模式。ChromeDriver、GeckoDriver等主流浏览器驱动都遵循W3C标准。这导致Selenium 4根据W3C协议对请求进行编码和解码。
在底层,Selenium 4使用WebDriver W3C协议。这消除了Selenium 3中JSON Wire Protocol所需的编码和解码开销。这一重大的架构变化将导致Selenium 4的跨浏览器测试(即跨不同版本和类型的浏览器的测试)更加稳定。
Selenium IDE
Selenium 4中的IDE不仅仅是一个基本的播放和记录测试工具。与Firefox一起,它可用于Chrome浏览器(作为 Chrome扩展程序)。
Selenium 4 IDE中的SIDE Runner工具允许您在本地Selenium Grid和基于云的Selenium Grid上并行运行 Selenium测试。而导出功能使测试能够以Selenium支持的语言(如 Python、C#、Java 等)导出录制的测试。
评价: 原理是它会录制一个元素的多个定位方式,直到能定位元素为止,当然IDE也具有扩展性和可用性等限制,大部分测试人员做自动化测试不会用这个,鸡肋。
Selenium Grid
如果你是Selenium 3用户,就会明白每次要在分布式服务器上执行自动化测试时启动Hub和Node.jar 是多么痛苦。分布式测试执行都将随着Selenium Grid发生质的变化。
在Selenium Grid 4中,Hub和Node打包在一个jar文件中。Selenium Grid 4具有更具可扩展性和可追溯性的基础架构,支持四个进程——路由器、会话映射、分发服务器和节点。改进了GUI和对Docker的内置支持。
评价: 高阶用法,一般自动化测试人员没怎么使用改功能,但是值得研究。
Chrome 开发者工具
集成到了chrome的dev tools里面,需要翻墙(公司有要求不能翻墙的慎用)
新特性: 使用Selenium 4,测试工程师可以通过在代码中模拟地理位置来测试为全球受众构建的Web 产品。同时,还可以检查产品在不同网络条件(例如 3G、4G 等)下的表现。
相对定位器
这个没啥用,就是支持A元素相邻B元素的定位方式,问题这样会更不稳定,还是倾向于测试人员使用稳定的xpath定位
其他特性
- TakeElementScreenshot API可以捕获页面上特定WebElement的屏幕截图。
- newWindow API的引入有助于简化新窗口(WindowType.WINDOW)或选项卡(WindowType.TAB) 的创建。
- 优化和加速调试过程。
本文暂时没有评论,来添加一个吧(●'◡'●)