Python Selenium介绍(一)
Selenium是什么
Selenium是一个用于自动化web应用程序测试的工具。它提供了一组工具和库,可以用多种编程语言(如Java、Python、C#等)编写测试脚本,模拟用户在浏览器中的行为,如点击链接、填写表单、提交数据等。Selenium可以在各种浏览器上运行,包括Chrome、Firefox、Safari等,它还可以与其他测试框架和工具集成,帮助开发人员和测试人员自动化执行各种测试任务,提高测试效率和质量。
官网:https://www.selenium.dev/
Seleium安装
安装第三方库
# 换源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 安装我这个版本
pip install selenium==4.6.0
# 安装默认最新版本
pip install selenium
这儿的版本没有过多的要求,能用就行
配置浏览器驱动
Selenium目前支持的浏览器
下载地址:https://www.selenium.dev/zh-cn/documentation/webdriver/troubleshooting/errors/driver_location/
示例
谷歌浏览器
-
1.确定谷歌浏览器版本
- 打开谷歌浏览器,输入地址
chrome://settings/help
- 查看自己的版本
- 打开谷歌浏览器,输入地址
-
2.选择对应版本号的驱动版本
下载地址:https://chromedriver.storage.googleapis.com/index.html
这里记录下最新版本谷歌驱动器下载地址:https://googlechromelabs.github.io/chrome-for-testing/ -
3.驱动放置位置
- 一般情况下,一些博主推荐存放在python的安装路径:
测试:
- 一般情况下,一些博主推荐存放在python的安装路径:
import time
# 导入selenium包
from selenium import webdriver
# 打开Firefox浏览器
browser = webdriver.Firefox()
# 停留三秒
time.sleep(3)
# 关闭浏览器
browser.quit()
- 可以根据喜好放
直接放在D盘:
测试:
from selenium import webdriver
# 设置Chrome浏览器驱动程序的路径
chrome_driver_path = "D:\\chromedriver.exe"
# 初始化Chrome浏览器
browser = webdriver.Chrome(executable_path=chrome_driver_path)
# 打开百度网页
browser.get("https://www.baidu.com")
# 这里可以编写其他与页面交互的代码
# 关闭浏览器
browser.quit()
当我们看见百度网页后,浏览器就会关闭,这样就说明我们设置完成了
启动Chrome浏览器
# 打开Chome浏览器
browser = webdriver.Chrome()
# 关闭浏览器
browser.quit()
启动Edge浏览器
# 打开Edge浏览器
browser = webdriver.Edge()
# 关闭浏览器
browser.quit()
Selenium的初始化
当我们创建浏览器驱动对象的时候,他会创建一个新的干净的浏览器,来供我们使用
from selenium import webdriver
# 设置Chrome浏览器驱动程序的路径
chrome_driver_path = "D:\\chromedriver.exe"
# 初始化Chrome浏览器
browser = webdriver.Chrome(executable_path=chrome_driver_path)
所以,我们在浏览器上设置的东西,也可以通过代码实现设置好
比如:
浏览器下载文件后,下载的地址设置
浏览器是否加载图片
浏览器是否禁用JS
浏览器是否使用隐私模式
浏览器是否使用缓存
等等…
# -*- coding: utf-8 -*-
# @Author : pan
# @Description : 获取浏览器驱动模块
# @Date : 2024年5月25日17:53:17
'''
# # 无界面化.
# chrome_opt.add_argument('--headless')
# # 配合上面的无界面化.
# chrome_opt.add_argument('--disable-gpu')
# 设置窗口大小, 窗口大小会有影响.
# chrome_opt.add_argument('--window-size=1366,768')
# 不加载图片, 提升速度
# chrome_opt.add_argument('--blink-settings=imagesEnabled=false')
# # 使用沙盒模式运行
# chrome_opt.add_argument("--no-sandbox")
# 远程操控
# chromedriver = webdriver.Remote(_chromedriverUrl, options=chrome_opt)
# 自动接受警告和对话框
# chrome_opt.add_argument('--auto-open-devtools-for-tabs')
# 忽略SSL错误:对于测试环境中自签名证书的站点。
chrome_opt.add_argument('--ignore-certificate-errors')
# chromedriver.set_page_load_timeout(30) # 设置页面加载超时时间
# chromedriver.execute_cdp_cmd("Page.setCacheDisabled", {"cacheDisabled": True}) # 禁用缓存
# 自定义Chrome的数据存储目录,用于持久化Cookies、存储等。
# chrome_opt.add_experimental_option('prefs', {'profile.default_content_settings.popups': 0,
# 'download.default_directory': '/path/to/download'})
# # 创建一个临时目录来存储浏览器会话的数据
# user_data_dir = "/path/to/temp/dir" # 替换为你希望存储临时数据的路径
# if os.path.exists(user_data_dir):
# shutil.rmtree(user_data_dir) # 如果目录已存在,则删除它
# os.makedirs(user_data_dir) # 创建新的临时目录
#
# chrome_opt.add_argument(f"user-data-dir={user_data_dir}")
# 设置代理
# chrome_opt.add_argument('--proxy-server=http://ip:port')
# chrome_opt.add_argument('--proxy-server=http://127.0.0.1:8888')
# 启动无痕模式
# chrome_opt.add_argument('--incognito')
# 禁用扩展
# chrome_opt.add_argument('--disable-extensions')
# 禁用JS
# chrome_opt.add_argument('--disable-javascript')
# 用户代理设置:模拟不同的浏览器或设备访问。
# chrome_opt.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')
'''
import time
import json
import os
from dataclasses import dataclass, asdict
from selenium import webdriver
@dataclass
class WebDriveConf:
"""
浏览器驱动配置
"""
chromedriver_url: str = 'D:\\chromedriver.exe' # 浏览器驱动路径
user_data_dir: str = 'D:\\webDriverTempDir' # 存储临时数据的路径
is_use_cache: int = 0 # 是否使用缓存
is_load_page: int = 1 # 是否加载页面
is_load_img: int = 0 # 是否加载图片
is_ignore_certificate: int = 1 # 是否忽略证书
is_incognito: int = 1 # 是否启动无痕模式
def to_dict(self) -> dict:
"""
返回配置信息的 JSON 格式表示
Returns: dict: 配置信息的 JSON 格式表示
"""
return asdict(self)
def read_json_config(self, file_path: str) -> dict:
"""
从 JSON 文件中读取配置信息并返回字典
Args: file_path (str): JSON 文件路径
Returns: dict: 包含配置信息的字典
"""
# 检查文件是否存在
if not os.path.exists(file_path):
# 如果文件不存在,则创建一个包含默认配置信息的 JSON 文件
with open(file_path, "w") as file:
json.dump(self.to_dict(), file, indent=4)
# 读取配置文件
with open(file_path, "r") as file:
config_dict = json.load(file)
return config_dict
def write_json_config(self, config_dict: dict, file_path: str):
"""
将配置信息写入 JSON 文件
Args: config_dict (dict): 包含配置信息的字典
file_path (str): JSON 文件路径
"""
with open(file_path, "w") as file:
json.dump(config_dict, file, indent=4)
class ChromeWebDriver:
def __init__(self, conf: WebDriveConf):
self.conf = conf
self.chrome_opt = webdriver.ChromeOptions()
self.chrome_opt.add_argument('--user-data-dir=' + self.conf.user_data_dir)
# 判断是否使用缓存 (如果不使用缓存,则删除缓存文件)
if not self.conf.is_use_cache:
if os.path.exists(self.conf.user_data_dir):
# 删除这个文件夹
import shutil
shutil.rmtree(self.conf.user_data_dir)
# 判断是否有文件夹
if not os.path.exists(self.conf.user_data_dir):
os.makedirs(self.conf.user_data_dir)
# 无界面化
if not self.conf.is_load_page:
self.chrome_opt.add_argument('--headless')
# 是否加载图片
if not self.conf.is_load_img:
self.chrome_opt.add_argument('--blink-settings=imagesEnabled=false')
# 是否忽略证书
if self.conf.is_ignore_certificate:
self.chrome_opt.add_argument('--ignore-certificate-errors')
# 启动无痕模式
if self.conf.is_incognito:
self.chrome_opt.add_argument('--incognito')
# 创建 Chrome WebDriver 实例
self.chromedriver = webdriver.Chrome(executable_path=self.conf.chromedriver_url, options=self.chrome_opt)
if __name__ == '__main__':
# 创建 WebDriveConf 实例并解包配置信息
web_driver_conf = WebDriveConf(**WebDriveConf().read_json_config("web_driver_conf.json"))
# 创建 ChromeWebDriver 实例
chrome_web_driver = ChromeWebDriver(web_driver_conf)
# 打开网页
chrome_web_driver.chromedriver.get("https://www.bilibili.com/?spm_id_from=333.788.0.0")
time.sleep(10)
chrome_web_driver.chromedriver.quit()