Selenium性能优化:一文带你快速上手!

这篇具有很好参考价值的文章主要介绍了Selenium性能优化:一文带你快速上手!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python selenium 优化,🎃🎃妙用Selenium,selenium,性能优化,测试工具

提升 Selenium 性能:实用优化技巧与最佳实践

前言

在自动化测试领域(做爬虫、自动化办公也不是不行😁😁),Selenium 是一个极为强大且广泛使用的工具。

学会使用工具是开始,学会优化该工具的使用才属于是真正的学会使用这个工具。面对日益复杂的网页结构和动态内容,仅仅掌握 Selenium 的基础操作已经过时啦!!!为了充分发挥 Selenium 的作用,必须深入了解并应用各种性能优化技巧。

本文将为大家展示一系列实用的 Selenium 性能优化技巧,从 无头模式显式等待时间 的设置,每一项都是为了提高自动化脚本的效率和稳定性。我们将探讨如何通过精细调整浏览器设置、减少不必要的资源加载以及合理设置等待策略,来优化测试流程和提升性能。无论你是 Selenium 的新手还是有经验的开发者,这些技巧都将为你的 Selenium 水平带来不少提升,并帮助你更高效地完成自动化任务。

强调一下,

  • 真正的性能瓶颈更多地在于网络延迟、页面渲染时间或脚本本身的效率。

知识点📖📖

模块 链接 作用
selenium https://www.selenium.dev/zh-cn/documentation/ 支持 web 浏览器自动化的一系列工具和库的综合项目

如果有看不懂的地方,可以结合我以前的文章一起看。

  • 【Selenium】控制当前已经打开的 chrome浏览器窗口

  • 【Selenium】控制当前已经打开的 chrome浏览器窗口(高级版)

  • Python模块psutil:系统进程管理与Selenium效率提升的完美结合

  • Selenium 自动化高级操作与解决疑难杂症,如无法连接、使用代理等

具体实现

下面,我分别从优势作用应用场景注意事项 为大家介绍以下的这些性能优化的操作。

这些优势可以根据具体的自动化任务和需求来选择性能优化选项,以提高任务执行效率和可靠性。

初始化浏览器

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager


def init_driver(options=None) -> webdriver.Chrome:
    """
    初始化浏览器驱动.

    Args:
        options(Options): chrome配置选项

    Returns:
        driver(WebDriver): 浏览器驱动对象

    """
    return webdriver.Chrome(
        service=ChromeService(ChromeDriverManager().install()),
        options=options
    )


显式等待时间

优势:确保任务在特定条件满足时执行,提高任务的稳定性和可靠性。
作用:适用于等待页面的特定条件满足,如元素可见或可点击。
应用场景:处理动态加载的页面内容。
注意事项:在需要等待特定条件满足时使用显式等待。设置合理的等待时间,以避免任务失败或效率低下。

示例代码

if __name__ == '__main__':
    driver = init_driver()
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.presence_of_element_located((By.ID, 'frica')))


无头模式

优势:减少内存占用和CPU消耗,提高性能,适合在后台运行自动化任务。
作用:运行Chrome 浏览器而不显示GUI界面。
应用场景:适用于不需要交互的界面测试。
注意事项:无头模式下无法可视化查看浏览器操作,需要注意页面的尺寸,以预防元素不可见。

示例代码

if __name__ == '__main__':
    options = Options()
    options.add_argument("--headless")
    driver = init_driver(options=options)
    driver.get('https://www.baidu.com')
    print(driver.title)
    # 百度一下,你就知道


无沙盒模式

优势:解决在某些环境中的权限问题,适用于对安全性要求不高的任务。
作用:禁用Chrome 的沙盒安全模式。
应用场景:在Docker等容器环境中运行。
注意事项:无沙盒模式可能降低安全性。在受信任的网站上使用此选项,不要在不信任的网站上执行代码。

示例代码

if __name__ == '__main__':
    options = Options()
    options.add_argument("--headless")
    driver = init_driver(options=options)


指定页面加载策略

优势:根据任务需求选择加载策略,可以提高页面加载速度或等待主要资源加载完成。
作用:定义Selenium 何时开始执行命令。
应用场景:加速测试或处理特殊页面
注意事项:根据任务需求选择适当的页面加载策略。

示例代码

  • none 表示不等待页面加载,
  • normal 表示等待页面加载完成,
  • eager 表示等待主要资源加载完成。
if __name__ == '__main__':
    options = Options()
    options.page_load_strategy = 'none'
    driver = init_driver(options=options)


指定浏览器配置文件

优势:保持个性化设置和登录状态。可以确保浏览器设置的一致性,适用于多个任务共享相同配置的情况。
作用:使用特定的Chrome 用户配置文件。
应用场景:持久化测试环境设置。
注意事项:指定配置文件可能有助于保持浏览器设置的一致性,确保配置文件存在且正确。

示例代码

if __name__ == '__main__':
    options = Options()
    # 替换成你本地的路径,
    options.add_argument(r"user-data-dir=F:\selenium\AutomationProfile")
    driver = init_driver(options=options)


禁止弹出拦截

优势:确保所有弹窗内容都能加载,确保任务顺利执行
作用:禁用Chrome 的弹出窗口拦截。
应用场景:测试包含弹出窗口的网页。
注意事项:禁用弹出拦截可能会导致弹出窗口干扰自动化任务。需要确保任务不受弹出窗口的影响。

示例代码

if __name__ == '__main__':
    options = Options()
    # 替换成你本地的路径,
    options.add_argument("--disable-popup-blocking")
    driver = init_driver(options=options)


禁用图片加载

优势:可以加快页面加载速度,减少网络流量消耗,适用于不依赖图片的任务。
作用:阻止网页中的图片加载。
应用场景:测试纯文本页面功能。
注意事项:禁用图片加载可能会加快页面加载速度,确保任务不依赖于图像元素。

示例代码

  • 1:允许加载所有图像。这是默认值,网页上的所有图像都会加载。
  • 2:禁止加载图像。浏览器不会加载网页上的任何图像。
  • 3:按照网页设置加载图像。这将遵循网页上的图像加载设置,如果网页未显式指定加载行为,则将使用默认行为。
if __name__ == '__main__':
    options = Options()
    # 方法一
    options.add_argument("--blink-settings=imagesEnabled=false")
    # 方法二
    prefs = {"profile.managed_default_content_settings.images": 2}
    options.add_experimental_option("prefs", prefs)
    driver = init_driver(options=options)


禁用JavaScript

使用 DevTools Protocol 来禁用 JavaScript

优势:禁用 JavaScript 可以降低网页的复杂性,提高加载速度,适用于不需要JavaScript 的任务。
作用:在页面加载中禁用JavaScript 执行。
应用场景:测试网页在无JavaScript 环境下的兼容性
注意事项:禁用JavaScript 会影响网页的交互性和动态内容加载。确保任务不需要JavaScript

示例代码

  • 这时候应该会发现,交互式元素(例如按钮、表单验证等)无法正常工作。
if __name__ == '__main__':
    options = Options()
    driver = init_driver(options=options)
    # 使用 DevTools Protocol 来禁用 JavaScript
    driver.execute_cdp_cmd("Emulation.setScriptExecutionDisabled", {"value": True})
    # 访问示例网站
    driver.get('https://frica.blog.csdn.net/?type=blog')


禁用插件扩展插件

一般来说,没有这个需要!
默认情况下 Selenium 不会加载浏览器中已安装的扩展;

如果需要在 Selenium 中加载特定的扩展插件,你可以通过 Options 对浏览器的选项来指定扩展的路径或参数。
所以,如果不显式指定扩展或插件,Selenium 创建的浏览器会以默认配置启动,不会加载用户自定义的扩展或插件。

优势:禁用扩展可以提高浏览器性能,减少资源占用,适用于不需要扩展的任务。
作用:禁用Chrome 的所有扩展。
应用场景:保持测试环境的纯净性。
注意事项:无

示例代码

if __name__ == '__main__':
    options = Options()
    options.add_argument("--disable-extensions")
    driver = init_driver(options=options)


禁用GPU硬件加速

优势:在某些情况下,禁用 GPU 硬件加速可以解决兼容性问题,提高稳定性。
作用:禁用ChromeGPU 硬件加速。
应用场景:与无头模式配合使用。
注意事项:禁用GPU 加速可能会影响浏览器性能,通常会增加图形网站的渲染时间。

示例代码

if __name__ == '__main__':
    options = Options()
    options.add_argument("--disable-gpu")
    driver = init_driver(options=options)

代码汇总

结合以前文章的代码来对本文进行总结,nice!!!

代码释义:

  1. 检查特定的 Chrome 浏览器进程是否运行:通过 check_if_specific_chrome_running 函数,检查系统中是否有一个特定的 Chrome 浏览器进程在运行,这是通过匹配进程名和命令行参数完成的。

  2. 启动 Chrome 浏览器:如果没有发现指定的 Chrome 浏览器进程在运行,start_chrome 函数会启动一个新的 Chrome 浏览器实例,使用了一系列预定义的命令行参数。

  3. 使用 Selenium 连接到 Chrome 浏览器:通过 selenium_conn_browser 函数,使用 Selenium WebDriver 连接到指定端口的 Chrome 浏览器实例。这个函数还提供了选项来禁用 JavaScript 和设置页面加载策略。

  4. 打开特定网站进行测试:在 selenium_conn_browser 函数中,代码打开了指定的网址(例如 CSDN 博客页面)并等待一段时间,以便进行进一步的操作或测试。

总体来说,这个脚本用于自动化地控制和与 Chrome 浏览器进行交互,适用于网页自动化测试或类似的场景。

启动浏览器

不建议在命令中实现无头模式,因为这会导致 Selenium连接失败,具体看这篇文章!
Selenium 自动化高级操作与解决疑难杂症,如无法连接、使用代理等

# -*- coding: utf-8 -*-
# @Author : Frica01
# @Time   : 2023-12-03 21:27
# @Name   : demo.py

import subprocess
import time
from typing import List

import psutil
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


def check_if_specific_chrome_running(process_name, cmdline=None) -> bool:
    """
    检查是否有包含指定名称的进程正在运行。

    Args:
        process_name(str): 要检查的进程名
        cmdline(List[str]): 要检查的命令行参数。默认为None。

    Returns:
        bool: 如果找到匹配的进程则返回True,否则返回False。
    """
    # 遍历所有正在运行的进程
    for proc in psutil.process_iter():
        try:
            # 检查进程名是否包含给定的名称字符串
            if process_name.lower() in proc.name().lower():
                # 获取进程详细信息列表
                p_info = proc.as_dict(attrs=['pid', 'name', 'cmdline'])
                # 如果提供了cmdline,检查它是否在进程的cmdline中
                if cmdline:
                    if all(cmd in p_info['cmdline'] for cmd in cmdline):
                        return True
                # 如果没有提供cmdline,返回True,因为进程名匹配
                else:
                    return True
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass
    return False


def start_chrome(browser_path, commands_list=None) -> None:
    """
    启动浏览器。

    Args:
        browser_path(str): 浏览器安装的路径
        commands_list(List[str]): 启动浏览器的命令行参数,默认为None

    Returns:
        None
    """
    commands = [browser_path]
    commands.extend(commands_list)
    # 启动浏览器
    subprocess.Popen(commands)



if __name__ == '__main__':
    # 设置浏览器的路径和启动参数
    path = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
    port = 9527
    cmd_map = {
        '指定浏览器配置': r'--user-data-dir=F:\selenium',
        '指定远程调试端口': '--remote-debugging-port={}'.format(port),
        # '无头模式': '--headless', # 不建议在命令中实现无头模式,因为这会导致Selenium连接失败
        '无沙盒模式': '--no-sandbox',
        # '指定页面加载策略': '--no-sandbox',
        '禁用弹出拦': '--disable-popup-blocking',
        '禁用图片加载': '--blink-settings=imagesEnabled=false',
        '禁用GPU硬件加速': '--disable-gpu',
        # '禁用js': True,
    }
    if not check_if_specific_chrome_running('chrome', cmdline=list(cmd_map.values())):
        # 打开浏览器
        start_chrome(path, commands_list=list(cmd_map.values()))

连接浏览器

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager


def init_chrome_driver(options=None) -> webdriver.Chrome:
    """
    初始化浏览器驱动.

    Args:
        options(Options): chrome配置选项

    Returns:
        driver(WebDriver): 浏览器驱动对象

    """
    return webdriver.Chrome(
        service=ChromeService(ChromeDriverManager().install()),
        options=options
    )


def selenium_conn_browser(port, disable_js=False, page_load_strategy=False):
    options = Options()
    # 设置页面加载策略
    if page_load_strategy:
        options.page_load_strategy = 'none'
    options.add_experimental_option("debuggerAddress", f"127.0.0.1:{port}")
    driver = init_chrome_driver(options=options)
    # 使用 DevTools Protocol 来禁用 JavaScript
    if disable_js:
        driver.execute_cdp_cmd("Emulation.setScriptExecutionDisabled", {"value": True})
    # 访问示例网站
    driver.get('https://frica.blog.csdn.net/?type=blog')
    time.sleep(20)


if __name__ == '__main__':
    # se连接浏览器
    selenium_conn_browser()

总结

通过本文,我们了解了多种提升 Selenium 性能的技巧,从基本的无头模式到复杂的页面加载策略。这些优化方法不仅能够加速测试过程,还能提高测试的准确性和可靠性。实践表明,正确地应用这些技巧可以显著提高自动化测试的效率。鼓励读者在自己的项目中尝试这些方法,并根据具体情况进行调整,以发挥 Selenium 的最大作用。

总体而言,这篇文章是一份非常全面和实用的 Selenium 性能优化指南。选择性能优化选项时,我们需要根据具体任务的要求和网站的特性来选择对应的选项。在实际使用中,进行充分的测试和调试以确保任务的稳定性和性能提升。

后话

本次分享到此结束,

see you~🎈🎈文章来源地址https://www.toymoban.com/news/detail-764404.html

到了这里,关于Selenium性能优化:一文带你快速上手!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【零基础入门Python】26段简短代码带你快速上手Python

    本文示例代码使用的Python版本为Python 3.6。运行Python代码有两种方式: 一种方式是启动Python,然后在命令窗口下直接输入相应的命令; 另一种方式就是将完整的代码写成.py脚本,如hello.py,然后在对应的路径下通过python hello.py执行。 hello.py脚本中的代码如下: 脚本的执行结果

    2024年02月09日
    浏览(44)
  • 【记录】Python3|Selenium4 极速上手入门(Windows)

    环境:Windows 版本:python3,selenium 4.11.2 写这个是方便自己重装电脑时重新装 Selenium,懒得每次都重新找链接。 Chrome 和 Edge 或其他浏览器任选其一。 首先,终端运行: 官网下载Chrome:https://www.google.cn/intl/zh-CN/chrome/ 安装好Chrome之后查看Chrome版本:chrome://settings/help 如果Chrome版

    2024年02月07日
    浏览(80)
  • 一文带你快速了解Python史上最快Web框架

    【作者主页】: 吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建

    2024年02月05日
    浏览(52)
  • python使用selenium以及selenium-wire做质量与性能检测

    python天生就是适合用来做爬虫,结合selenium真是如虎添翼; 1) 安装库 2)添加驱动,比如 chrome需要下载一个驱动,放到项目目录下或者python安装目录下,根据机器上对应的chrome版本进行下载。我是放在python3.exe的目录 下载地址: CNPM Binaries Mirror selenium功能比较强大,但是仍然

    2024年02月11日
    浏览(59)
  • 带你快速上手HetuEngine

    本文分享自华为云社区《【手把手带你玩转HetuEngine】(一)HetuEngine快速上手》,作者:HetuEngine九级代言。 HetuEngine是华为推出的高性能交互式SQL分析及数据虚拟化引擎。与大数据生态无缝融合,实现海量数据秒级交互式查询;支持跨源跨域统一访问,使能数据湖内、湖间、

    2024年02月12日
    浏览(34)
  • [E2E Test] Python Behave Selenium 一文学会自动化测试

    本文将使用Python Behave与Selenium,和同学们一起认识自动化测试,并附上完整的实践教程。 项目源码已上传:CSDN 郭麻花 Azure Repo python-behave-selenium 1. 什么是E2E Test E2E即End-to-end,意思是从头到尾的系统功能测试。它通过编写自动化测试脚本,完全从用户的角度出发,验证系统功

    2024年02月09日
    浏览(41)
  • Python学习笔记——selenium定位iframe和元素(快速定位)

    在使用selenium过程,发现定位iframe、元素比较困难,所以制作一个辅助小工具。  当前界面没有,调整driver位置 1.Xpath定位  2,.其他定位方式 获取元素、操作失败重复操作,直至操作成功。

    2024年02月13日
    浏览(51)
  • 【Linux】基本指令——带你快速上手Linux

     在介绍Linux基本指令之前,我们需要对 操作系统 这一概念作进一步的认识,这样才能更好的帮助我们去理解指令操作。 先给出结论:  操作系统是一款 做软硬件管理 的 软件 。 应用软件 :Word、Matlab… 操作系统 :Windows、Linux… 设备驱动 :声卡驱动、网卡驱动… 硬件

    2024年02月11日
    浏览(42)
  • 五分钟带你快速上手EFCore操作MySQL

    Entity Framework Core 是一个轻量级、跨平台的 ORM 框架,它允许 .NET 开发人员通过面向对象的方式访问数据库。EF Core 可以与各种关系型数据库进行交互,包括 SQL Server、MySQL、PostgreSQL 和 SQLite 等。 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools Pomelo.EntityFrameworkCore.MySql 注意版

    2024年04月17日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包