【学习笔记】初识 Selenium

学习说明:

本贴的学习目的是实现Selenium浏览器控制的初级入门,学习效果为实现控制浏览器进行百度搜索。

第一部分:认识Selenium

Selenium是一个基于标准的 WebDriver 语法规范的模拟浏览器操作的工具,由 Google 维护源代码,目前支持大部分主流的编程语言,包括:Java、Python、C#、PHP、Ruby、JavaScript等;且支持全部主流的浏览器。

指路:

Selenium 工具集:

Selenium IDE (集成开发环境) 是一个创建测试脚本的原型工具。它是一个浏览器插件,实现简单的浏览器操作的录制与回放功能,可以录制用户的基本操作,生成测试用例。随后可以运行这些测试用例在浏览器里回放,可将测试用例转换为其他语言的自动化脚本。

Selenium WebDriver是selenium 家族的核心工具,WebDriver支持多种不同的语言编写自动化测试脚本。分为Client Libraries(编写测试脚本)和Selenium Server(控制浏览器行为)

Selenium Grid能让你并行的运行你的脚本、是用于运行在不同的机器、不同的浏览器并行测试的工具,使得 WebDriver 能提升针对大型的测试脚本或者需要运行在多环境的测试脚本的处理能力,目的在于加快脚本运行的速度,从而减少脚本运行的总时间。

第二部分:环境搭建

说明:本次学习的环境信息如下:

类型 名称 版本 备注
操作系统 Windows Windows 11 专业版64位23H2
语言 Python 3.12.3-amd64
IDE Pycharm 20241-14494
浏览器 Microsoft Edge 123.0.2420.81

一、安装 Selenium 工具包

由于Python 默认有 pip Python 包管理工具,可以通过 pip 非常方便的联网安装 Selenium。

启动命令行工具:Win+R | 输入 cmd | 回车

或者在Pycharm的终端内运行

pip install -U selenium            # 该命令效果为自动下载安装最新版Selenium工具包
pip install selenium==3.4.3     # 该命令效果为下载安装指定版本(3.4.3)Selenium工具包
pip uninstall selenium             # 该命令效果为卸载当前的Selenium工具包

我们也可以使用非官方的国内镜像来进行安装:

pip install --index https://mirrors.ustc.edu.cn/pypi/web/simple/ selenium  # 清华镜像源

注意:如果你挂载着网络代理可能会安装失败。

当然,如果你的电脑处于非接入互联网的环境,也可以先下载 Selenium 的 Python 安装包,再进行手动安装。

官方下载地址

下载后,解压该压缩包,然后用命令行进入该压缩包的根目录,输入命令进行安装

python setup.py install

安装后,我们可以在cmd里使用pip show selenium来查看是否安装成功。

二、安装WebDriver浏览器驱动

1、WebDriver驱动下载

我们首先查看浏览器的版本:

image.png

再去对应的官网下载对应版本的WebDriver:

GoogleChrome

Microsoft Edge

image.png

注意:浏览器版本与WebDriver驱动器版本要互相对应,否则无法运行。

2、WebDriver环境配置

下载好的压缩包要解压放在python的安装路径里,我们可以在cmd里用py -0p命令查看安装路径。

放好后我们将WebDriver的路径放在系统环境变量的Path内,完成环境变量的配置。

第三部分、基础用法

一、基本语句

# 导入Selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time

# 初始化并打开Edge浏览器
driver = webdriver.Edge()

# 访问百度
driver.get(r'https://www.baidu.com/')

# 用Xpath寻找输入框
input_element = driver.find_element(By.XPATH,'//*[@id="kw"]')

# 向输入框中输入文本
input_element.send_keys('摸鱼派')

# 用Xpath寻找搜索按钮
click_button = driver.find_element(By.XPATH,'//*[@id="su"]')

# 单击按钮
click_button.click()

# 暂停三秒,等待搜索结果
time.sleep(3)

# 点击搜索结果第一项
fishpi = driver.find_element(By.XPATH,'//*[@id="1"]/div/div[1]/h3/a/em')

# 单击按钮
fishpi.click()

# 暂停五秒
time.sleep(5)

# 关闭浏览器
driver.close()

初始化语句:

# driver = webdriver.Browser('url')
driver = webdriver.Edge('C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe')  

# 也可以这样用:
path = r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
driver = webdriver.Edge(path)

因为我们配过环境变量了,所以可以直接初始化,无需填写'浏览器所在位置路径':

#driver = webdriver.浏览器类型()
driver = webdriver.Edge()

get语句:

get语句用来访问网址。

# driver.get('url')
driver.get(r'https://www.baidu.com/')

输入语句:

是键盘事件,用来控制向页面元素中输入文字:

# input_element.send_keys('value')
input_element.send_keys('摸鱼派')

单击语句:

是鼠标事件,用来单击页面元素:

# button.click()
click_button.click()

暂停语句:

time事件,用来让程序睡一会:

#time.sleep(number)
time.sleep(5)

关闭浏览器:

# 关闭WebDriver当前正在访问的窗口。close() 方法既不需要任何参数,也无任何返回值。
driver.close()

# quit()方法用于关闭程序已打开的所有窗口。该方法也不需要任何参数,也无任何返回值。
driver.quit()

close()和quit()的区别:

关闭当前所有的浏览器窗口,关闭浏览器驱动进程,销毁driver操作,则需要使用quit方法。
当浏览器打开了多个窗口,只想要关闭当前鼠标聚焦的窗口(句柄),则需要使用close方法。

二、页面定位

Selenium在网页中有8种不同的定位方式用来找到页面中的元素:

# 通过 ID 定位
element = driver.find_element(By.ID, "element_id")

# 通过 Name 定位
element = driver.find_element(By.NAME, "element_name")

# 通过 Class Name 定位
element = driver.find_element(By.CLASS_NAME, "class_name")

# 通过 Tag Name 定位
element = driver.find_element(By.TAG_NAME, "div")

# 通过 Link Text 定位
element = driver.find_element(By.LINK_TEXT, "Link Text")

# 通过 Partial Link Text 定位
element = driver.find_element(By.PARTIAL_LINK_TEXT, "Partial Link Text")

# 通过 CSS Selector 定位
element = driver.find_element(By.CSS_SELECTOR, "css_selector")

# 通过 XPath 定位
element = driver.find_element(By.XPATH, "xpath")

# 查找多个元素
elements = driver.find_elements(By.CLASS_NAME, "class_name")

注意:网上大部分Selenium教程采用旧版本语法,目前旧语法已被弃用,不推荐使用,请注意甄别。

8种方式各有优缺点,我推荐使用Xpath进行定位:

image.png

在页面用指针找到对应元素后可直接右键复制Xpath,而且程序不容易认错

三、练习

本次习题为:

  1. 登录你的鱼排账号
  2. 在聊天室发送一条消息

欢迎大家来评论区交作业。

下面附上参考答案:

# 导入Selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time

# 初始化并打开Edge浏览器
driver = webdriver.Edge()

# 访问百度
driver.get('https://fishpi.cn/login?goto=https%3A%2F%2Ffishpi.cn%2F')
# 暂停3秒
time.sleep(3)
# 输入用户名和密码
name = driver.find_element(By.XPATH,'//*[@id="nameOrEmail"]')
name.send_keys('Tnine')
password = driver.find_element(By.XPATH,'//*[@id="loginPassword"]')
password.send_keys('密码当然不会告诉你们啦')
# 点击登录按钮
login_button = driver.find_element(By.XPATH,'/html/body/div[3]/div/div[1]/div/button[1]')
login_button.click()
time.sleep(3)
# 进入聊天室
ChatRoom = driver.find_element(By.PARTIAL_LINK_TEXT,"聊天室")
ChatRoom.click()
time.sleep(6)
# 输入消息并发送
text = driver.find_element(By.XPATH,'//*[@id="chatContent"]/div[2]/div[3]/pre')
text.send_keys('test')
send = driver.find_element(By.XPATH,'/html/body/div[3]/div/div[1]/div[1]/div/div/div[2]/div[3]/button[3]')
send.click()

# 关闭浏览器
driver.quit()