自动化测试——selenium

news2025/5/25 15:35:37

简介

        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 Service

def 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 time

def main():
    service = Service('msedgedriver.exe')
    option = webdriver.EdgeOptions()
    option.service = service
    driver = webdriver.Edge(options=option)
    driver.get('http://www.baidu.com')
    time.sleep(1)
    #当前网页的html代码
    print(driver.page_source)    
    #当前网页的标题
    print(driver.title)
    #当前网页的URL
    print(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 time

def main():
    service = Service('msedgedriver.exe')
    option = webdriver.EdgeOptions()
    option.service = service
    driver = 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 time

def main():
    service = Service('msedgedriver.exe')
    option = webdriver.EdgeOptions()
    option.service = service
    driver = 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秒

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux——进程通信

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

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

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

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

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

Sklearn入门之数据预处理preprocessing

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

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

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

数字电子技术基础(四十七)——使用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 直…

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

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

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

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

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

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

Linux——消息队列

目录 一、消息队列的定义 二、相关函数 2.1 msgget 函数 2.2 msgsnd 函数 2.3 msgrcv 函数 2.4 msgctl 函数 三、消息队列的操作 3.1 创建消息队列 3.2 获取消息队列并发送消息 3.3 从消息队列接收消息recv 四、 删除消息队列 4.1 ipcrm 4.2 msgctl函数 一、消息…

领慧立芯LHE7909可兼容替代TI的ADS1299

LHE7909是一款由领慧立芯(Legendsemi)推出的24位高精度Δ-Σ模数转换器(ADC),主要面向医疗电子和生物电势测量应用,如脑电图(EEG)、心电图(ECG)等设备。以下是…

MongoDB简单用法

图片中 MongoDB Compass 中显示了默认的三个数据库: adminconfiglocal 如果在 .env 文件中配置的是: MONGODB_URImongodb://admin:passwordlocalhost:27017/ MONGODB_NAMERAGSAAS💡 一、为什么 Compass 里没有 RAGSAAS 数据库?…

uniapp-商城-26-vuex 使用流程

为了能在所有的页面都实现状态管理,我们按照前面讲的页面进行状态获取,然后再进行页面设置和布局,那就是重复工作,vuex 就会解决这样的问题,如同类、高度提炼的接口来帮助我们实现这些重复工作的管理。避免一直在造一样的轮子。 https://vuex.vuejs.org/zh/#%E4%BB%80%E4…