1、selenium工作流程
2、selenium工作原理(1)客户端和服务端之间实际是通过http协议进行通信,服务端的接口文档可参考:
https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelement(2)客户端按照服务端接口要求传入请求方式、请求url和请求数据,然后发送http请求,服务端收到请求后驱动浏览器执行命令;
(3)selenium实际已封装好各种操作接口的请求函数,用户只需通过指定的方法传入数据即可,
如get、click、find_element实际都是封装了整个http请求过程的方法;
即测试人员仅需根据功能需求调用对应的方法并传参即可,最终由selenium组装请求信息后发送请求;
(4)可见,完全可以跳过selenium,自己通过requests模块构建请求信息发送给驱动程序,从而驱动浏览器执行相关操作。
3、从selenium源码角度剖析selenium原理
(1)先说明一下以下例子,以python、chrome驱动程序、chrome浏览器展开说明。
(2)通过selenium实现工作流1 1 # 启动chrome浏览器
2 2 driver = webdriver.Chrome()
3 3 # 访问百度网站
4 4 driver.get("http://www.baidu.com")
5 5 # 查找输入框元素
6 6 ele = driver.find_element_by_id("kw")
7 7 # 在输入框中输入“selenium”
8 8 ele.send_keys("selenium")
9 9 # 查找百度一下按钮
10 10 ele = driver.find_element_by_id("su")
11 11 # 点击百度一下按钮
12 12 ele.click()
(3)selenium源码解析① driver = webdriver.Chrome()启动chromedriver驱动程序,启动后可通过http://ip:port访问驱动程序
通过execute方法,构建“创建新会话”接口的请求信息,并发送http请求,返回会话id:
请求方式:POST
请求地址:http://localhost:post/session
请求数据:data = {"desiredCapabilities":{
"browserName": "chrome",
"version":"85.0.4183.83",
"platform":"WINDOWS"}
}
② driver.get("http://www.baidu.com")通过execute方法,按get命令的接口信息构建http请求信息,并发送http请求:
请求方式:POST
请求地址:http://localhost:post/session/$sessionId/url(sessionId为会话id,从①中获取)
请求数据:{"url": "http://www.baidu.com"}
③ driver.find_element_by_id("kw")通过execute方法,按find_element_by_id命令的接口信息构建http请求信息,并发送http请求:
请求方式:POST
请求地址:http://localhost:post/session/$sessionId/element(sessionId为会话id,从①中获取)
请求数据:{"using":"id","value":"kw"}
④ ele.send_keys("selenium")通过execute方法,按send_keys命令的接口信息构建http请求信息,并发送http请求:
请求方式:POST
请求地址:http://localhost:post/session/$sessionId/element/$id/value(sessionId为会话id,从①中获取,id为元素id,从③获取)
请求数据:{"value": ["selenium"]}
⑤ ele.click()通过execute方法,按click命令的接口信息构建http请求信息,并发送http请求:
请求方式:POST
请求地址:http://localhost:post/session/$sessionId/element/$id/click(sessionId为会话id,从①中获取,id为元素id,从③获取)
请求数据:无
4、通过requests模块实操验证selenium实现原理
(1)代码实现1 1 # TODO 访问域名
2 2 base_url = "http://localhost:9515"
3 3
4 4 # TODO 创建会话
5 5 url = base_url "/session"
6 6 data = {
7 7 "desiredCapabilities":{
8 8 "browserName": "chrome",
9 9 "version":"85.0.4183.83",
10 10 "platform":"WINDOWS"
11 11 }
12 12 }
13 13 res = request("POST",url,json=data)
14 14 session_id = res.json()["sessionId"] # 返回会话id
15 15
16 16 sleep(2)
17 17
18 18 # TODO 发送get命令 - 访问某个网站
19 19 url = base_url "/session/{}/url".format(session_id)
20 20 data = {
21 21 "url": "http://www.baidu.com"
22 22 }
23 23 res = request("POST",url,json=data)
24 24
25 25 # TODO 发送find_element命令 - 查找元素
26 26 url = base_url "/session/{}/element".format(session_id)
27 27 data = {
28 28 "using":"id",
29 29 "value":"kw"
30 30 }
31 31 res = request("POST",url,json=data)
32 32 ele = jsonpath(res.json(),"$..ELEMENT")[0] # 返回元素id
33 33
34 34 # TODO 发送send_keys命令 - 输入内容
35 35 url = base_url "/session/{}/element/{}/value".format(session_id,ele)
36 36 data = {
37 37 "value": ["selenium"]
38 38 }
39 39 res = request("POST",url,json=data)
40 40
41 41 # TODO 发送find_element命令 - 查找元素
42 42 url = base_url "/session/{}/element".format(session_id)
43 43 data = {
44 44 "using":"id",
45 45 "value":"su"
46 46 }
47 47 res = request("POST",url,json=data)
48 48 ele = jsonpath(res.json(),"$..ELEMENT")[0] # 返回元素id
49 49
50 50 # TODO 发送click命令 - 元素点击
51 51 url = base_url "/session/{}/element/{}/click".format(session_id,ele)
52 52 res = request("POST",url)
(2)运行结果
来源:https://www.icode9.com/content-1-736251.html