编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

【测试基础能力】selenium4入门(selenium测试工具的使用)

wxchong 2024-07-07 00:02:15 开源技术 19 ℃ 0 评论

前言

由于团队里面自动化测试能力比较薄弱,明年打算赋能培训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 浏览器之间的主要通信模式。ChromeDriverGeckoDriver等主流浏览器驱动都遵循W3C标准。这导致Selenium 4根据W3C协议对请求进行编码和解码。

在底层,Selenium 4使用WebDriver W3C协议。这消除了Selenium 3JSON 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用户,就会明白每次要在分布式服务器上执行自动化测试时启动HubNode.jar 是多么痛苦。分布式测试执行都将随着Selenium Grid发生质的变化。

Selenium Grid 4中,HubNode打包在一个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) 的创建。
  • 优化和加速调试过程。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表