当前位置:   article > 正文

Selenium篇1-简介及原理_1.selenium原理

1.selenium原理

想必大家对selenium都很熟悉,但是有哪些测试工程师能对其原理了如指掌呢!只有学懂了原理,才能更加深入的学习。今天的博客我们一起来学习一下selenium的原理!

1、简介

官网链接:https://www.selenium.dev/documentation/en/
Selenium是一个用于web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作,支持的浏览器包括包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括测试浏览器的兼容性(测试应用程序在不同浏览器 or 不同的操作系统上的兼容性)

  • 1、既然可以跑在不同的浏览器上和操作系统上,那么可以用来做兼容性测试;
  • 2、可以用来做回归测试,或者一定程度上的冒烟测试;

2、Selenium三个版本之间的区别

2.1 Selenium1.0

  • ① Selenium IDE:是一个嵌入在Firefox浏览器中的一个插件,可以实现简单的浏览器操作的录制与回放功能;
  • ② Selenium Grid :是一个自动化测试辅助工具。利用Gird可以很方便地实现在多台机器上或异构环境中运行测试用例;
  • ③ Selenium RC(Remote Control) : 是Selenium家族的核心部分,支持多种不同语言编写的自动化测试脚本。把Selenium RC的服务器作为代理服务器去访问应用,即达到测试的目的。
    RC主要分为两部分,Client Libraries 和 Selenium Server 两部分。Client Libraries 主要用于编写测试脚本,负责控制Selenium Server的库。Selenium Server负责控制浏览器的行为。

特征:Selenium1.0:这个时候的selenium,使用的是JavaScript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript,Javascript可以获取并调用DOM的任何元素,自如的进行操作。
但是这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。

2.2 Selenium2.0

  • 1、这个时候出现了WebDriver,这个版本的Selenium是利用浏览器原生的API,封装成了一套更加面向对象的Selenium WebDriver API,可以直接操作浏览器页面里的元素,甚至操作浏览器的本身。由于使用的是浏览器原生的API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。
  • 2、然后带来的副作用是,不同浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商,而不同的实现。
  •                                Selenium2.0 = Selenium1.0 + WebDriver
    
    • 1

2.3 Selenium3.0

  • 1、Selenium2.0有了WebDriver后,已经完全替代了Selenium RC的功能,但是当时2.0为了向下兼容,当时未启用Selenium RC。
  • 2、Selenium3.0就在Selenium的基础上完全弃用了Selenium RC。
  •                                Selenium3.0 = Selenium2.0 - Selenium RC
    
    • 1

3、Selenium原理

3.1 怎么去看懂原理?

  • 1、看官方文档(一定一定要去看官方文档,最详细,最明白易懂)
  • 2、看源码,你会发现看懂了会有成就感

3.2 看一下浏览器的启动日志

# 导入selenium之前要安装包:终端命令输入 pip install selenium
from selenium import webdriver
import logging
logging.basicConfig(level=logging.DEBUG)  # 打印Debug日志
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')  # 南钢bass平台的url

输出如下-----------------
1、DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:53695/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}}
2、DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1:53695
3、DEBUG:urllib3.connectionpool:http://127.0.0.1:53695 "POST /session HTTP/1.1" 200 720
4、DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
5、DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:53695/session/fe78275c988e19763c3fdd367e971f36/url {"url": "https://www.baidu.com"}
6、DEBUG:urllib3.connectionpool:http://127.0.0.1:53695 "POST /session/fe78275c988e19763c3fdd367e971f36/url HTTP/1.1" 200 14
7、DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3.3 根据打印出来的日志思考问题?

  • 1、第一行:为什么会出现127.0.0.1:53258这个本地服务呢?这行日志是什么意思?
    解:可以去查看源码,这个本地服务是Chromedriver.exe驱动程序的,这个日志是像服务发送了一个post请求,url = ‘http://127.0.0.1:53695/session ’,入参为后面的一串json字符串。
  • 2、第五行:fe78275c988e19763c3fdd367e971f36这串随机字符串代表什么呢?这个日志代表什么呢?
    解:很明显这串随机字符串是用来鉴权的,怎么来的呢,肯定是由第一行的请求响应参数里面的sessionID,这个日志很明显也是打开百度网页的一个POST请求。

到这里想必大家应该很明白了原理了,那么我们也可以不使用selenium打开浏览器,直接请求接口调用浏览器。
如下:

‘’‘1、先进入驱动所在的目录,手动启动chromedirver.exe,命令 chromedriver.exe -port=12345’‘’
‘’‘2、打卡浏览器,获取session’‘’
url_driver = 'http://localhost:'+12345+'/session'
data_driver = {"capabilities":
                           {"firstMatch": [{}],
                            "alwaysMatch": {
                                "browserName": "chrome", "platformName": "any", "goog:chromeOptions": {
                                    "extensions": [], "args": []
                                }
                            }
                            },
                       "desiredCapabilities": {
                           "browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {
                               "extensions": [], "args": []
                           }
                       }
                       }
response = requests.post(url=url_driver,json=data_driver)
sessionId = jsonpath.jsonpath(response.json(), '$..sessionId')[0]  # 通过jsonpath来获取sessionId
‘’‘3、进入百度’‘’
# 拿到上面获取的session来请求百度
url_demo = 'http://localhost:'+12345+'/session/'+sessionId+'/url'
# 请求百度页面的接口参数
data_demo = {
      "url": 'https://www.baidu.com'
        }
response_demo = requests.post(url=url_demo,json=data_demo)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

好了!!浏览器也打开了,百度页面打开了,其他定位元素以及元素操作等都是通过调用API来实现的

3.4 原理图

图片来自官网
在这里插入图片描述

  • 1、webdriver所有的操作都是间接通过Driver(浏览器驱动)来操作浏览器;
  • 2、浏览器返回的信息也是通过Driver(浏览器驱动)给到WebDriver;

3.5 总结

  • 1、selenium client(python等语言编写的自动化测试脚本)初始化一个service服务,通过Webdriver启动浏览器驱动程序chromedriver.exe
  • 2、通过RemoteWebDriver向浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得sessionid,如果再次对浏览器操作需携带此id
  • 3、打开浏览器,绑定特定的端口,把启动后的浏览器作为webdriver的remote server
  • 4、打开浏览器后,所有的selenium的操作(访问地址,查找元素等)均通过RemoteConnection链接到remote server,然后使用execute方法调用_request方法通过urlib3向remote server发送请求
  • 5、浏览器通过请求的内容执行对应动作
  • 6、浏览器再把执行的动作结果通过浏览器驱动程序返回给测试脚本

后续有关Selenium的内容会在后续博客一一介绍,包含元素定位,元素操作,等待方式等等!

以上内容有误处,麻烦与在下面评论,多多指教,相互学习。谢谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/89754?site
推荐阅读
相关标签
  

闽ICP备14008679号