关于Selenium
建议大家看官方文档以看英文版为主,中文翻译有点差强人意
官网 - https://www.selenium.dev/zh-cn/documentation/
Github - https://github.com/SeleniumHQ/selenium
Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。
项目包括:
-
Selenium Webdriver - Selenium的核心,其集合了基于W3C 协议
控制浏览器的指令集,被设计成一个简单和简洁的编程接口便于测试工作者通过其进行自动化测试脚本的开发 - Selenium IDE - 可在Chrome、Firefox和Edge上运行的扩展插件,可录制执行过程,方便调试
- Selenium Grid - 可让自动化测试案例分布运行在不同的测试机上,通过Grid可以加速案例的执行,亦可用作兼容性测试
本章节以Selenium Webdriver展开
Selenium与浏览器交互的工作原理
懒得组织语言了,发现一个博主写得挺好的,所以戳一戳下面这个链接https://blog.csdn.net/vivi_zhai/article/details/123958328
支持语言
- C#
- JavaScript
- Java
- Python
- Ruby
本章节以 python为例展开
环境准备
python环境安装
https://www.python.org/downloads/
安装过程记得勾选add to path(添加环境变量)
安装完成后cmd输入命令python,如果如下图所示则代表环境安装成功,如果没有,需要检查一下环境变量是否配置好了
修改pip的默认源,因为国内有墙的缘故,所以我们下载第三方包的时候需要用到镜像,否则下一个包就需要花很长时间。具体方法如下:
- 进入到C盘的user下当前的账号文件夹内,如C:\Users\WY0121\,在文件夹中新增文件夹命名为pip
- pip中新增文件pip.ini,内容为如下
- 保存
[global]
index-url=http://pypi.douban.com/simple/
[install]
trusted-host=pypi.douban.com
Python IDE安装
- VSCode - 微软开发的开源代码编辑器,不仅可用于开发Python,其支持各大主流语言的开发,插件丰富
- Pycharm - 这个是我个人在使用的(可能一开始就用的它,所以用习惯了),分为两个版本,一个社区版本一个专业版本,下社区版本就够了,满足大部分的开发需求,也有很多实用的插件
下载selenium包
如果是想在全环境下安装,只需要在cmd下执行下面的指令
如果是想在虚拟环境中安装,需要进入虚拟环境再执行指令
pip install -U selenium
安装浏览器驱动
简说一下什么是浏览器驱动,目前市面上比较流行的浏览器有Chrome、Firefox、Edge、IE、Safari,各大浏览器会有对应的驱动来运行浏览器,而selenium的工作原理就是向各个驱动传送指令,驱动根据指令来对浏览器执行相关的操作,如打开浏览器,浏览网址,查找元素等
各浏览器驱动下载地址:
- Chrome: https://chromedriver.chromium.org/downloads
- Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- Firefox: https://github.com/mozilla/geckodriver/releases
- Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/
Chrome驱动安装
以Chrome为例,需要先查看当前电脑的Chrome版本号是多少
打开Chrome -> 设置 -> 关于Chrome
在下载页面中找到对应的版本并下载
Ready to go!!!
如何获取页面元素(Element)信息
- 进入要测试的网址
- f12
- 选择要定位的元素
从红框中我们可以看到搜索框这个元素的ID是
inp-query
,name是search_text
,在脚本开发元素定位中,我们除了可以通过ID和Name来定位一个元素之外,还有很多元素定位的方法,如:
- ID
- Name
- Class Name
- XPATH
- CSS_SELECTOR(CSS选择器)
- TAG_NAME(标签名称)
- LINK_TEXT(链接名称)
脚本开发
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
s = Service(executable_path='D:/drivers/chromedriver.exe') # 指定Chrome驱动的地址,如果不想指定的话可以在windows环境变量中加上驱动的地址,这段代码就可以省略
browser = webdriver.Chrome(service=s) # 如果已驱动地址已加入环境变量中,则用browser = webdriver.Chrome()
browser.get('https://movie.douban.com/') # 进入Url
tbox_search = browser.find_element(By.NAME, 'search_text') # 获取元素
clss_inp_btn = browser.find_elements(By.CLASS_NAME, 'inp-btn') # 获取元素列表,因为一个class下可能会有多个元素
btn_search = clss_inp_btn[0] # 搜索按钮这个元素是inp-btn这个class下的第一个元素
tbox_search.send_keys('周迅') # 搜索框中输入
btn_search.click() # 点击搜索按钮
time.sleep(3) # 这个是方便大家看点击搜索后的效果才加的延迟
browser.quit() # !!!这句一定要加上,如果没加上的话后台会一直运行驱动,占用内存
自动化测试案例
import time
import unittest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
class DouBan(unittest.TestCase): # 创建一个类,继承unittest.TestCase
@classmethod
def setUpClass(cls): # 类方法,在实例化类之后会先执行该方法且只执行一次,一般用于做前期准备初始化一些基础组件
s = Service(executable_path='D:/drivers/chromedriver.exe')
cls.browser = webdriver.Chrome(service=s)
@classmethod
def tearDownClass(cls) -> None: # 类方法,在所有案例执行完后运行一次,且只执行一次
cls.browser.quit()
def setUp(self) -> None: # 每个测试案例执行前都会执行一次
print('######################### TestCase:{} #################################'.format(self._testMethodName))
self.browser.get('https://movie.douban.com/')
def tearDown(self) -> None: # 每个测试案例执行完都会执行一次
print('############################### DONE ########################################\n')
time.sleep(3)
def test_01_search_zhou(self): # 测试案例,开头必须是test,由于unittest是根据用例名称的ascii码先后顺序执行的,所以建议可以添加个序号
tbox_search = self.browser.find_element(By.NAME, 'search_text')
clss_inp_btn = self.browser.find_elements(By.CLASS_NAME, 'inp-btn')
btn_search = clss_inp_btn[0]
tbox_search.send_keys('周迅')
btn_search.click()
now = self.browser.current_url
# 断言
self.assertEqual(now, 'https://search.douban.com/movie/subject_search?search_text=%E5%91%A8%E8%BF%85&cat=1002')
def test_02_chart(self):
btn_chart = self.browser.find_element(By.LINK_TEXT, '排行榜')
btn_chart.click()
now = self.browser.current_url
self.assertEqual(now, 'https://movie.douban.com/chart')
if '__main__' == __name__:
unittest.main(exit=True)
断言除了脚本中的assertEqual之外还有很多断言,如图,具体可参见官方文档