当前位置: 首页 > article >正文

自动化测试——selenium

简介

        Selenium 是一个广泛使用的自动化测试工具,主要用于 Web 应用程序的自动化测试。它能实现的功能是网页的自动化操作,例如自动抢票刷课等。同时你应该也见到过有些网站在打开之后并没有直接加载出网站的所有内容,比如一些图片等等,这可能就是网站在构造时使用了AJAX技术,实现了不刷新的和后端交互式的Web页面。这种页面我们使用简单的requests、urllib等并不能加载出来网页的所有内容,因为与传统的网页相比较,这些网站的资源例如图片、视频是藏在js的脚本中,因此之前学过的beautifulsoup和xpath提取url的方法基本上没有用武之地,re(正则表达式)在面对这种问题时也没有那么得心应手。Selenium可以为我们实现动态爬虫,让我们直接从html文件中提取数据即可,而不需要再逆向js来获得数据。

selenium和request获取网页的代码的区别

        

        在网页中我们点击右键,就会发现页面上的选项有查看页面源代码和检测两个选项,查看页面源代码会显示给我们当前url对应的真正的代码,它会跳转到一个新的界面,这是我们使用requests向url发送请求时得到的代码。而如果点击检测,这会打开浏览器自带的抓包工具,在这里显示的代码通常不是存储在服务器端,而是通过服务器发来的源码通过js脚本加载的界面,这里的标签直接存储了图片、视频等的路径在获得这个代码以后我们就可以用之前的方法来提取想要的属性了,而这篇文章的动态爬虫就会教你怎么获得这些代码。

配置

安装python的Selenium包

在终端输入

pip install selenium

如果下载过慢或者直接超时报错,我们可以向ai询问一下国内的镜像源。

pip install selenium -i https://mirrors.aliyun.com/pypi/simple/

这是python的一个包,使用它可以让我们的python代码操控浏览器。

安装浏览器驱动

在本篇中,我将使用edge浏览器,大家也可以自己去查找chrome,Firefox等浏览器的驱动,代码只有初始化的时候略有不同,其余代码一致。

在设置中找到自己的浏览器版本,根据浏览器的版本下载驱动,下载好以后是一个exe文件打开后会显示successful。

python使用selenium基本语法

创建webdriver类

from selenium import webdriver
from selenium.webdriver.edge.service import Servicedef main():option = webdriver.EdgeOptions()option.service = Service('msedgedriver.exe')driver = webdriver.Edge(options=option)
main()

        在使用不同的浏览器时,只需要把Edge改成Chrome...即可。在设置浏览器的驱动选项时,Service里面传入的参数是下载的浏览器驱动的位置,可以传入全局路径,或者把文件放入当前的目录中,或者把文件的路径设置成全局变量。

webdriver查看当前界面的属性

        在某个页面中常见的属性有url,title,html代码等,接下来我们以百度的网页为例获取一下该界面的这些属性。

        我们使用get来控制webdriver发送请求,前往新的界面。

在进入浏览器以后,会提示我们浏览器正在被自动化测试软件控制。这就代表我们已经成功了。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
import timedef main():service = Service('msedgedriver.exe')option = webdriver.EdgeOptions()option.service = servicedriver = webdriver.Edge(options=option)driver.get('http://www.baidu.com')time.sleep(1)#当前网页的html代码print(driver.page_source)    #当前网页的标题print(driver.title)#当前网页的URLprint(driver.current_url)
main()

直接运行代码就可以直接查看里面的属性了。

        学到这里,我们已经可以使用webdriver的get方法访问网页,如果网页的有些资源是动态加载的,我们已经可以获取动态加载的元素了。如果你只想解决在前面的爬虫中遇到的一些问题,那么到这里就可以结束了,但是如果你对网页自动化感兴趣或者不局限于只爬取一个网页,那么我们接下来继续介绍它的一些更多的功能。

webdriver类控制屏幕

最大化窗口:

driver.maximize_window()

最小化窗口:

driver.minimize_window()

设置窗口大小:

driver.set_window_size(1000, 700)  #设置窗口大小为1000x700像素

全屏模式:

driver.fullscreen_window()

webdriver定位标签

        在模拟用户操作浏览器的过程中,我们常常会为了和页面交互而在input标签中输入或者点击按钮,但是在网页中一般输入框和按键又比较繁多,那么我们应该先找到我们想要的按键,才能对它进行操作。

        我们能想到的寻找标签的方式:

1.通过标签的名字来查找:

我们继续以百度的界面为例。

虽然我们轻而易举的发现了这个input标签,但是这个网页中有不少的input标签,所以这个方法很显然是不太可行的。

2.类似于第一个,我们还可以通过标签的name属性,标签的class属性来查找,但是这同样不能让我们定位到某一个专属的标签。

3.在html中我们知道id选择器是唯一的,于是我们可以通过这种方法来定位标签。

通过By类,我们选择By.ID。然后输入id的名字就可以了。

在源代码中,输入栏和搜索按钮的id分别是kw和su。接下来我直接给出源码:

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
import timedef main():service = Service('msedgedriver.exe')option = webdriver.EdgeOptions()option.service = servicedriver = webdriver.Edge(options=option)driver.get('http://www.baidu.com')time.sleep(1)input_kw = driver.find_element(By.ID,'kw')input_kw.send_keys('123')time.sleep(1)print('成功输入')button = driver.find_element(By.ID,'su')button.click()time.sleep(1)driver.close()main()

可以看到它成功给了我们输入了send的内容同时点击了搜索。

4.Xpath方法定位,如果你会一点爬虫,那么这个词你应该并不会感到陌生,我们可以手动的寻找输入某个标签的xpath路径,同样的如果你不是傻子,可以直接从网页上复制,直接使用或者稍作修改。

可以看到这里能复制完整的Xpath路径。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
import timedef main():service = Service('msedgedriver.exe')option = webdriver.EdgeOptions()option.service = servicedriver = webdriver.Edge(options=option)driver.get('http://www.baidu.com')time.sleep(1)input_kw = driver.find_element(By.XPATH,'/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input')input_kw.send_keys('123')time.sleep(1)print('成功输入')button = driver.find_element(By.XPATH,'/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input')button.click()time.sleep(1)driver.close()main()

修改一下之前代码的find_element里面的参数,运行代码以后,我们发现代码还是可以正常使用的,虽然这种方法也可以,但是我还是更习惯使用id,因为id更加简单方便一些。

selenium的其它小技巧

无头浏览模式

如果你要写动态爬虫爬取一些网站的信息,但是网站的内容你并不想呈现出来,或者网页加载的时候损耗比较大,那么你可以设置开启无头浏览模式,这种模式下,你不会打开浏览器,而是在后台偷偷地进行数据搜集地工作。

我们只需要添加一行option.add_argument("--headless")即可。

等待机制

Selenium 提供了多种等待机制来处理动态内容,包括隐式等待(Implicit Wait)和显式等待(Explicit Wait)。

        隐式等待:设置一个全局的等待时间,Selenium 会在查找元素时等待指定的时间。如果在指定时间内找到元素,则继续执行;否则抛出异常。

driver.implicitly_wait(10)  # 等待10秒

        显式等待:针对特定的元素设置等待条件,直到条件满足或超时。显式等待更加灵活,适用于处理复杂的动态内容。

相关文章:

自动化测试——selenium

简介 Selenium 是一个广泛使用的自动化测试工具,主要用于 Web 应用程序的自动化测试。它能实现的功能是网页的自动化操作,例如自动抢票刷课等。同时你应该也见到过有些网站在打开之后并没有直接加载出网站的所有内容,比如一些图片等等&#x…...

java和python实现mqtt

说明: MQTT 异步通信系统功能文档 系统概述 本系统基于 MQTT 协议实现异步通信,包含三个核心组件: Broker(消息代理):负责消息的路由和转发。 Client(主客户端):定时发…...

5.9 《GPT-4调试+测试金字塔:构建高可靠系统的5大实战策略》

5.4 测试与调试:构建企业级质量的保障体系 关键词:测试金字塔模型、GPT-4调试助手、LangChain调试模式、异步任务验证 测试策略设计(测试金字塔实践) #mermaid-svg-RblGbJVMnCIShiCW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…...

Linux——进程通信

我们知道,进程具有独立性,各进程之间互不干扰,但我们为什么还要让其联系,建立通信呢?比如:数据传输,资源共享,通知某个事件,或控制某个进程。因此,让进程间建…...

学习笔记十三—— 理解 Rust 闭包:从语法到 impl Fn vs Box<dyn Fn>

🧠 理解 Rust 闭包:从语法到 impl Fn vs Box 📚 目录 闭包是什么?和普通函数有什么不同?闭包的语法长什么样?闭包“捕获变量”是什么意思?闭包和所有权的关系Fn、FnMut、FnOnce 三种闭包类型的…...

【免费参会合集】2025年生物制药行业展会会议表格整理

全文精心整理, 建议今年参会前都好好收藏着,记得点赞! 医药人非常吃资源,资源从何而来?作为一名从事医药行业的工作者,可以很负责任的告诉诸位,其中非常重要的一个渠道就是会议会展! 建议所有医…...

腾讯云开发+MCP:旅游规划攻略

1.登录注册好之后进入腾讯云开发 2.创建环境 4.创建好环境之后点击去开发 5.进入控制台后,选择AI,找到MCP 6.点击创建MCP Server 使用腾讯云开发创建MCP目前需要云开发入门版99/月,我没开通,所以没办法往下进行。...

银河麒麟系统 达梦8 安装 dlask 框架后端环境

适配的一套环境为 dmPython2.5.8 dmSQLAlchemy1.4.39 Flask2.0.3 Flask-Cors3.0.10 Flask-SQLAlchemy2.5.1 SQLAlchemy1.4.54 Werkzeug2.2.2其中 # sqlalchemy-dm1.4.39 通过dmdbms目录内文件进行源码安装 (MindSpore) [ma-user python]$pwd /home/syl/dmdbms/drivers/python…...

Cribl (实验) vpc-flow 数据抽样

先看文档: Firewall Logs: VPC Flow Logs, Cisco ASA, Etc. | Cribl Docs Firewall Logs: VPC Flow Logs, Cisco ASA, Etc. Recipe for Sampling Firewall Logs Firewall logs are another source of important operational (and security) data. Typical examples include Ama…...

Sklearn入门之数据预处理preprocessing

、 Sklearn全称:Scipy-toolkit Learn是 一个基于scipy实现的的开源机器学习库。它提供了大量的算法和工具,用于数据挖掘和数据分析,包括分类、回归、聚类等多种任务。本文我将带你了解并入门Sklearn下的preprocessing在机器学习中的基本用法。 获取方式…...

我想自己组装一台服务器,微调大模型通义千问2.5 Omni 72B,但是我是个人购买,资金非常有限,最省的方案

目录 🧠 首先我们要搞清楚几个核心点: 🎯 目标:微调 Qwen2.5-Omni-72B 🚨 现实问题:作为个人用户,72B 模型几乎无法负担全量微调 💸 全量微调硬件需求: ✅ 最省的个人方案:不组 72B,只训练 Qwen2.5-Omni-7B 或 14B 💡 推荐方案 A:个人桌面级多卡训练服…...

家用打印机性价比排名及推荐

文章目录 品牌性价比一、核心参数对比与场景适配二、技术类型深度解析三、不同场景选择 相关文章 品牌 性价比 一、核心参数对比与场景适配 兄弟T436W 优势: 微压电技术,打印头寿命长,堵头率低。 支持A4无边距和5G WiFi,适合照片…...

KWDB(Knowledge Worker Database)基础概念与原理完整指南

KWDB(Knowledge Worker Database)基础概念与原理完整指南—目录 前言一、背景1.1 知识工作者的痛点1.2 技术演进推动 二、定义与定位2.1 什么是KWDB?2.2 KWDB与传统数据库的对比与传统关系型数据库(如MySQL)的对比与分…...

数字电子技术基础(四十七)——使用Mutlisim软件来模拟74LS85芯片

目录 1 使用74LS85N芯片完成四位二进制数的比较 1.1原理介绍 1.2 器件选择 1.3 运行电路 2 使用74LS85N完成更多位的二进制比较 1 使用74LS85N芯片完成四位二进制数的比较 1.1原理介绍 对于74LS85 是一款 4 位数值比较器集成电路,用于比较两个 4 位二进制数&…...

关于STM32创建工程文件启动文件选择

注意启动文件只要选择这几个 而不是要把所有都选上...

LLC电路工作在容性区的风险

在t0时刻之前,Q6Q7导通,回路如下所示,此时A点电压是低压,B点电压是高压 在t0时刻时,谐振电流相位发生变换,在t1时刻,Q5,Q8导通,对于Q8MOS管来说,B点电压在Q6Q…...

Linux Kernel 6

clone 系统调用(The clone system call) 在 Linux 中,使用 clone() 系统调用来创建新的线程或进程。fork() 系统调用和 pthread_create() 函数都基于 clone() 的实现。 clone() 系统调用允许调用者决定哪些资源应该与父进程共享&#xff0c…...

【开源项目】Excel手撕AI算法深入理解(四):AlphaFold、Autoencoder

项目源码地址:https://github.com/ImagineAILab/ai-by-hand-excel.git 一、AlphaFold AlphaFold 是 DeepMind 开发的突破性 AI 算法,用于预测蛋白质的三维结构。它的出现解决了生物学领域长达 50 年的“蛋白质折叠问题”,被《科学》杂志评为…...

第IV部分有效应用程序的设计模式

第IV部分有效应用程序的设计模式 第IV部分有效应用程序的设计模式第23章:应用程序用户界面的架构设计23.1设计考量23.2示例1:用于非分布式有界上下文的一个基于HTMLAF的、服务器端的UI23.3示例2:用于分布式有界上下文的一个基于数据API的客户端UI23.4要点第24章:CQRS:一种…...

如何编制实施项目管理章程

本文档概述了一个项目管理系统的实施计划,旨在通过统一的业务规范和技术架构,加强集团公司的业务管控,并规范业务管理。系统建设将遵循集团统一模板,确保各单位项目系统建设的标准化和一致性。 实施范围涵盖投资管理、立项管理、设计管理、进度管理等多个方面,支持项目全生…...

排序(java)

一.概念 排序:对一组数据进行从小到大/从大到小的排序 稳定性:即使进行排序相对位置也不受影响如: 如果再排序后 L 在 i 的前面则稳定性差,像图中这样就是稳定性好。 二.常见的排序 三.常见算法的实现 1.插入排序 1.1 直…...

嵌入式C语言进阶(二+)内存管理补充版

C语言内存管理:从小白到大神的完全指南 前言:为什么需要理解内存管理 C语言以其高效性和灵活性著称,但这也意味着程序员需要手动管理内存。与Java、Python等高级语言不同,C语言没有自动垃圾回收机制,内存管理的重担完全落在开发者肩上。理解C语言的内存管理机制不仅能帮…...

【HDFS入门】HDFS副本策略:深入浅出副本机制

目录 1 HDFS副本机制概述 2 HDFS副本放置策略 3 副本策略的优势 4 副本因子配置 5 副本管理流程 6 最佳实践与调优 7 总结 1 HDFS副本机制概述 Hadoop分布式文件系统(HDFS)的核心设计原则之一就是通过数据冗余来保证可靠性,而这一功能正是通过副本策略实现的…...

Excel自定义函数取拼音首字母

1.启动Excel 2003(其它版本请仿照操作),打开相应的工作表; 2.执行“工具 > 宏 > Visual Basic编辑器”命令(或者直接按“AltF11”组合键),进入Visual Basic编辑状态; 3.执行“…...

智能 GitHub Copilot 副驾驶® 更新升级!

智能 GitHub Copilot 副驾驶 迎来重大升级!现在,所有 VS Code 用户都能体验支持 Multi-Context Protocol(MCP)的全新 Agent Mode。此外,微软还推出了智能 GitHub Copilot 副驾驶 Pro 订阅计划,提供更强大的…...

Android ViewPager使用预加载机制导致出现页面穿透问题

​ 缘由 在应用中使用ViewPager,并且设置预加载页面。结果出现了一些异常的现象。 我们有4个页面,分别是4个Fragment,暂且称为FragmentA、FragmentB、FragmentC、FragmentD,ViewPager在MainActivity中,切换时&#x…...

【今日三题】添加字符(暴力枚举) / 数组变换(位运算) / 装箱问题(01背包)

⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 添加字符(暴力枚举)数组变换(位运算)装箱问题(01背包) 添加字符(暴力枚举) 添加字符 当在A的开头或结尾添加字符直到和B长度…...

【AIoT】智能硬件GPIO通信详解(二)

前言 上一篇我们深入解析了智能硬件GPIO通信原理(传送门:【AIoT】智能硬件GPIO通信详解(一))。接下来,我们将结合无人售货机控制场景,通过具体案例进一步剖析物联网底层通信机制的实际应用。 在智能零售领域,无人售货机通过AI技术升级为智能柜,其设备控制的底层通信…...

Python(18)Python中JSON的妙用:详解序列化与反序列化原理及实战案例

目录 一、背景:为什么Python需要JSON?二、核心技术解析:序列化与反序列化2.1 核心概念2.2 类型映射对照表 三、Python操作JSON的四大核心方法3.1 基础方法库3.2 方法详解1. json.dumps()2. json.loads()3. json.dump()4. json.load() 四、实战…...

【Python进阶】字典:高效键值存储的十大核心应用

目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现(10个案例)案例1:基础操作案例2:字典推导式…...