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

【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!

这里写目录标题

    • 什么是Selenium?
    • Selenium基础用法详解
      • 环境搭建
      • 编写第一个Selenium脚本
      • 解析脚本
      • 脚本执行结果
      • 常用的元素定位方法
      • 常用的WebDriver方法
      • 等待机制
    • Selenium高级技巧详解
      • 页面元素操作
      • 处理弹窗和警告框
      • 截图和日志记录
      • 多窗口和多标签页操作
    • 一个实战的小demo
      • 步骤一:py文件代码
      • 步骤二:excel文件
    • 总结
    • 相关文章

什么是Selenium?

Selenium是一套用于Web应用程序自动化测试的开源工具。它支持多种浏览器(如Chrome、Firefox、Safari等)和多种编程语言(如Java、Python、C#等),使测试人员可以编写脚本来自动化执行测试用例,提升测试效率。

在这里插入图片描述

Selenium基础用法详解

环境搭建

在开始编写Selenium脚本之前,我们需要搭建开发环境。

  1. 安装Python:从Python官网下载并安装最新版本的Python。

  2. 安装Selenium库

    pip install selenium
    
  3. 确认你的Chrome浏览器版本。你可以在Chrome浏览器中打开 chrome://settings/help 查看版本号。
    在这里插入图片描述

  4. 下载浏览器驱动
    ChromeDriver官网下载地址
    ChromeDriver官网最新版下载地址
    ChromeDriver国内镜像下载地址
    ChromeDriver国内镜像最新版下载地址

windows/mac用户需要将下载的驱动程序路径,添加到系统的环境变量中,方便Selenium识别和调用。
确认环境变量命令:chromedriver
在这里插入图片描述

编写第一个Selenium脚本

让我们通过一个简单的示例,了解如何使用Selenium进行网页自动化操作(代码示例,可以直接运行)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time# 创建一个Chrome浏览器实例
driver = webdriver.Chrome()try:# 打开百度首页driver.get("https://www.baidu.com")# 确保页面加载完成time.sleep(2)# 找到搜索框search_box = driver.find_element(By.NAME, "wd")# 输入搜索关键词search_box.send_keys("Selenium Python")# 提交搜索search_box.send_keys(Keys.RETURN)# 等待页面加载time.sleep(2)# 获取搜索结果的标题results = driver.find_elements(By.CSS_SELECTOR, 'h3')print("搜索结果标题:")for index, result in enumerate(results):print(f"结果 {index + 1}: {result.text}")# 点击第一个搜索结果(如果存在)if results:results[0].click()time.sleep(10)  # 等待页面加载# 打印当前页面的标题print("当前页面标题:", driver.title)time.sleep(10)
finally:# 关闭浏览器driver.quit()

解析脚本

  1. 初始化WebDriver:创建一个Chrome浏览器实例,通过webdriver.Chrome()来指定使用的浏览器驱动。

  2. 打开网站:使用get方法访问xx的首页(https://www.baidu.com

  3. 定位搜索框:通过find_element(By.NAME, "wd")方法找到搜索框元素

  4. 输入搜索关键词:使用send_keys方法将"Selenium Python"输入到搜索框中,在使用send_keys(Keys.RETURN)模拟按下回车键提交搜索。

  5. 获取搜索结果标题:通过find_elements(By.CSS_SELECTOR, 'h3')方法获取所有搜索结果的标题,使用CSS选择器定位到h3标签。

  6. 打印搜索结果标题:遍历搜索结果,使用enumerate函数为每个结果编号,并打印出每个结果的标题。

  7. 点击第一个搜索结果:检查是否有搜索结果,如果存在,就使用results[0].click()点击第一个结果

  8. 打印当前页面标题:在新页面加载完成后,使用driver.title获取并打印当前页面的标题。

  9. 关闭浏览器:使用driver.quit()确保无论程序是否发生异常,都会关闭浏览器实例,释放资源。

这就是我们简单的自动化demo,通常可以用在输入框较多需要构造大批量数据,或者自动化回归测试的时候使用

脚本执行结果

在这里插入图片描述

常用的元素定位方法

Selenium提供了多种方法来定位网页元素,选择合适的方法可以提高脚本的稳定性和可维护性。以下是几种常用的定位方式:

  1. By.ID:通过元素的ID属性定位。
    driver.find_element(By.ID, "element_id")
    
  2. By.NAME:通过元素的名称属性定位。
    driver.find_element(By.NAME, "element_name")
    
  3. By.XPATH:通过XPath表达式定位,适用于复杂的层级结构。
    driver.find_element(By.XPATH, "//div[@class='example']")
    
  4. By.CSS_SELECTOR:通过CSS选择器定位,语法简洁。
    driver.find_element(By.CSS_SELECTOR, ".class > #id")
    
  5. By.CLASS_NAME:通过元素的类名定位。
    driver.find_element(By.CLASS_NAME, "class_name")
    
  6. By.TAG_NAME:通过元素的标签名定位。
    driver.find_element(By.TAG_NAME, "button")
    
  7. By.LINK_TEXTBy.PARTIAL_LINK_TEXT:通过链接文本定位。
    driver.find_element(By.LINK_TEXT, "点击这里")
    driver.find_element(By.PARTIAL_LINK_TEXT, "点击")
    

注意:在正常的情况下,我们通常只会用到id、name和Xpath,但一定要注意获取的元素要是唯一的。

常用的WebDriver方法

掌握一些常用的WebDriver方法,可以大大提升编写脚本的效率和灵活性。
注意:driver是我们之前定义浏览器实例的实例,如下:

driver = webdriver.Chrome()

因为这个driver实例,所以才能调用下面的方法

  • driver.get(url):打开指定URL。
  • driver.find_element(by, value):定位单个元素。
  • driver.find_elements(by, value):定位多个元素。
  • driver.send_keys(keys):向元素输入文本。
  • driver.click():点击元素。
  • driver.get_title():获取当前页面的标题。
  • driver.get_current_url():获取当前页面的URL。
  • driver.back():浏览器后退。
  • driver.forward():浏览器前进。
  • driver.refresh():刷新页面。
  • driver.quit():关闭浏览器。

等待机制

在自动化测试中,页面加载速度不一,合理的等待机制可以提高脚本的稳定性。

  1. 隐式等待

    driver.implicitly_wait(10)  # 最多等待10秒
    

    在查找元素时,如果元素未立即出现,WebDriver会等待指定的时间。

  2. 显式等待

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10)
    element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))
    

    根据特定条件等待元素出现,更加灵活和精准。

  3. 线程等待

    import time
    time.sleep(5)  # 强制等待5秒
    

    不推荐使用,容易导致测试效率低下。

Selenium高级技巧详解

页面元素操作

除了基本的点击和输入,Selenium还支持更多复杂的操作,如下拉菜单选择、拖拽、鼠标悬停等。

  1. 选择下拉菜单中的选项

    from selenium.webdriver.support.ui import Selectselect_element = Select(driver.find_element(By.ID, "dropdown"))
    select_element.select_by_visible_text("选项1")
    # 也可以通过值或索引选择
    # select_element.select_by_value("value1")
    # select_element.select_by_index(1)
    
  2. 鼠标悬停

    from selenium.webdriver.common.action_chains import ActionChainselement = driver.find_element(By.ID, "hover_element")
    ActionChains(driver).move_to_element(element).perform()
    
  3. 拖拽操作

    source = driver.find_element(By.ID, "source")
    target = driver.find_element(By.ID, "target")
    ActionChains(driver).drag_and_drop(source, target).perform()
    

处理弹窗和警告框

Web应用中常常会出现各种弹窗和警告框,Selenium提供了简单的方法来处理它们。

# 切换到警告框
alert = driver.switch_to.alert# 获取警告框文本
alert_text = alert.text
print(alert_text)# 接受警告框
alert.accept()# 取消警告框
alert.dismiss()# 输入文本到警告框(如果有输入框)
alert.send_keys("测试")

截图和日志记录

为了更好地调试和记录测试过程,Selenium支持截图和日志记录功能。

  1. 截图

    driver.save_screenshot("screenshot.png")
    
  2. 获取页面源代码

    page_source = driver.page_source
    
  3. 日志记录

    import logginglogging.basicConfig(level=logging.INFO)
    logger = logging.getLogger(__name__)
    logger.info("这是一个日志信息")
    

多窗口和多标签页操作

在现代Web应用中,可能会涉及到多个窗口或标签页的切换,Selenium同样能够轻松应对。

# 获取当前窗口句柄
main_window = driver.current_window_handle# 打开新窗口或标签页
driver.execute_script("window.open('https://www.example.com')")# 获取所有窗口句柄
windows = driver.window_handles# 切换到新窗口
for window in windows:if window != main_window:driver.switch_to.window(window)break# 在新窗口中执行操作
driver.find_element(By.ID, "new_window_element").click()# 切换回主窗口
driver.switch_to.window(main_window)

一个实战的小demo

这是一个通过读取excel文件获取数据,然后封装方法去执行的简单demo。

步骤一:py文件代码

import time, os  # 导入时间和操作系统模块
import pandas as pd  # 导入pandas库用于数据处理
from selenium import webdriver  # 导入selenium的webdriver模块
from selenium.webdriver.common.by import By  # 导入定位元素的By类
from selenium.webdriver.common.keys import Keys  # 导入键盘操作的Keys类class CodeMoss(object):# 初始化方法def __init__(self):self.url = "https://pc.aihao123.cn/index.html?#/chat"  # 设置要访问的URLself.driver = webdriver.Chrome()  # 创建Chrome浏览器实例# 读取Excel文件中的数据def read_excel(self):path = os.path.dirname(os.path.dirname(__file__))  # 获取当前文件的上级目录data = os.path.join(path, 'selenium代码/codemoss_data.xlsx')  # 拼接Excel文件路径df = pd.read_excel(data, index_col=None, header=None)  # 读取Excel文件test_data = []  # 初始化测试数据列表for row in df.itertuples(index=False):  # 遍历每一行数据test_data.append({"name": row[0], "type": row[1], "element": row[2], "text": row[3], "times": row[4],"procedure": row[5]})  # 将每行数据转换为字典并添加到列表中del test_data[0]  # 删除第一行(通常是表头)return test_data  # 返回测试数据列表# 退出浏览器的方法def out_moss(self):time.sleep(10)  # 等待10秒self.driver.quit()  # 关闭浏览器# 根据XPath点击元素def element_click_xpath(self, Xpath):self.driver.find_element(By.XPATH, str(Xpath)).click()  # 查找并点击指定XPath的元素# 根据ID点击元素def element_click_id(self, id):self.driver.find_element(By.ID, str(id)).click()  # 查找并点击指定ID的元素# 根据XPath输入文本def element_text_xpath(self, Xpath, text):self.driver.find_element(By.XPATH, str(Xpath)).send_keys(text)  # 查找指定XPath的元素并输入文本# 根据ID输入文本def element_text_id(self, id, text):self.driver.find_element(By.ID, str(id)).send_keys(text)  # 查找指定ID的元素并输入文本# 等待指定的时间def element_times(self, times):time.sleep(times)  # 暂停执行指定的时间# 登录操作的方法def login_moss(self):print(self.read_excel())  # 打印读取的Excel数据self.driver.get(self.url)  # 打开指定的URLfor data in self.read_excel():  # 遍历读取的测试数据print(data['procedure'])  # 打印当前操作步骤if data['name'] == "click":  # 如果操作是点击if data['type'] == "xpath":  # 根据类型判断self.element_click_xpath(data['element'])  # 点击XPath元素if data['type'] == "id":self.element_click_id(data['element'])  # 点击ID元素if data['name'] == "text":  # 如果操作是输入文本if data['type'] == "xpath":self.element_text_xpath(data['element'], data['text'])  # 输入XPath元素文本if data['type'] == "id":self.element_text_id(data['element'], data['text'])  # 输入ID元素文本if data['name'] == "times":  # 如果操作是等待self.element_times(data['times'])  # 等待指定时间self.out_moss()  # 执行退出操作if __name__ == '__main__':CodeMoss().login_moss()  # 创建CodeMoss实例并执行登录操作

步骤二:excel文件

这个excel文件跟上面的py文件是在同一个级别。注意文件地址。
在这里插入图片描述
文件内容如下:
在这里插入图片描述

总结

Selenium作为一款强大的自动化测试工具,凭借其灵活性和广泛的支持,已成为众多测试人员的首选。

如果你对Selenium还有更多疑问或想了解更深入的高级技巧,欢迎在评论区留言,我们一起探讨!

相关文章

【OpenAI】(一)获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!!

【VScode】(二)VSCode中的智能AI-GPT编程利器,全面揭秘CodeMoss & ChatGPT中文版

【CodeMoss】(三)集成13种AI大模型(GPT4、o1等)、支持Open API调用、自定义助手、文件上传等强大功能,助您提升工作效率! >>> - CodeMoss & ChatGPT-AI中文版

相关文章:

【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!

这里写目录标题 什么是Selenium?Selenium基础用法详解环境搭建编写第一个Selenium脚本解析脚本脚本执行结果常用的元素定位方法常用的WebDriver方法等待机制 Selenium高级技巧详解页面元素操作处理弹窗和警告框截图和日志记录多窗口和多标签页操作 一个实战的小demo…...

内网服务器添加共享文件夹功能并设置端口映射

参考网址 https://blog.csdn.net/Think88666/article/details/118438465 1.服务器安装smb服务,由于网路安全不允许使用默认端口(445,446),于是修改端口为62445、62446。 2.每台需要共享的电脑都要修改端口映射&#x…...

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...

TypeScript语言的学习路线

TypeScript语言的学习路线 TypeScript(TS)是由Microsoft开发的一种开源编程语言,是JavaScript的超集,提供了严格的类型检查和基于类的面向对象编程特性。随着前端开发的不断进步,TypeScript逐渐成为了现代前端开发的主…...

Python爬虫-汽车之家各车系周销量榜数据

前言 本文是该专栏的第43篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者在文章《Python爬虫-汽车之家各车系月销量榜数据》中,有详细介绍,如何爬取“各车系车型的月销量榜单数据”的方法以及完整代码教学教程。 而本文,笔者同样以汽车之家平台为例,…...

C#格式化输出

上一期: C#格式化输出-CSDN博客 字符串插值 字符串插入功能,使得我们可以更直观地嵌入表达式到字符串中,只需要在字符串前加上$符号即可实现这一点。着中国方法不仅提高了代码的可读性,而且简化了字符串构造的过程。 使用Inse…...

Open FPV VTX开源之默认MAVLink设置

Open FPV VTX开源之默认MAVLink设置 1. 源由2. 准备3. 连接4. 安装5. 配置6. 测试6.1 启动wfb-ng服务6.2 启动wfb-ng监测6.3 启动QGroundControl6.4 观察测试结果 7. 总结8. 参考资料9. 补充9.1 telemetry_tx异常9.2 DEBUG串口部分乱码9.3 PixelPilot软件问题 1. 源由 飞控图传…...

【初识扫盲】逆概率加权

我们正在处理一个存在缺失数据的回归模型,并且希望采用一种非参数的逆概率加权方法来调整估计,以应对这种缺失数据的情况。 首先,我们需要明确问题的背景。我们有样本 { ( Y i , X i , r i ) : i 1 , … , n } \left\{\left(Y_i, \boldsym…...

Ubuntu中双击自动运行shell脚本

方法1: 修改文件双击反应 参考: https://blog.csdn.net/miffywm/article/details/103382405 chmod x test.sh鼠标选中待执行文件,在窗口左上角edit菜单中选择preference设计双击执行快捷键,如下图: 方法2: 设置一个应用 参考: https://blo…...

理解AJAX与Axios:异步编程的世界

理解AJAX与Axios:异步编程的世界 在现代Web开发中,异步编程作为一种处理复杂操作的方式,已经成为不可或缺的一部分。AJAX(Asynchronous JavaScript and XML)和Axios是两种实现异步请求的流行技术。本文将深入探讨这两…...

分组通道自注意力G-CSA详解及代码复现

G-CSA定义 G-CSA (Grouped Channel Self-Attention) 是一种创新性的视觉注意力机制,巧妙地结合了卷积和自注意力的优势。通过将输入特征图划分为多个独立的通道组,在每个组内执行自注意力操作,G-CSA实现了高效的全局信息交互,同时保留了局部特征细节。这种方法不仅提高了模…...

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念,下面我们来具体到每一层的具体内容进行讲解,每一层的每一个功能块力求用一个总览图,外加一个例子的图给大家进…...

玩转大语言模型——langchain调用ollama视觉多模态语言模型

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…...

Github 2025-01-11 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10C项目1Swift项目1Yazi - 快速终端文件管理器 创建周期:210 天开发语言:Rust协议类型:MIT LicenseStar数量:5668 个Fork数量:122…...

【学习】【记录】【分享】微型响应系统

前言 本篇博客源于对Vue和React框架中响应式系统的好奇与探索。若文中存在任何错误或有更优的解决方案,欢迎各位读者不吝指正,让我们一起学习,共同进步。 1. 什么是响应式系统 响应式系统是一种编程范式,它允许数据的变化自动地…...

vue城市道路交通流量预测可视化系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站、收藏、不迷路! 项目亮点 编号:R09 🚇 网站大屏管理三大前端、vuespringbootmysql、前后端分离架构 🚇 流量预测道路查询…...

Windows7 Emacs设置及中文乱码解决

个人博客地址:Windows7 Emacs设置及中文乱码解决 | 一张假钞的真实世界 环境说明 Windows7GNU Emacs 25.1.1安装路径:D:/apps/emacs/ 配置Emacs 在Windows7下安装完Emacs后,默认情况下Emacs不会在一启动的时候就生成.emacs配置文件和.ema…...

Python AI教程之十五:监督学习之决策树(6)高级算法C5.0决策树算法介绍

C5.0决策树算法 C5 算法由 J. Ross Quinlan 创建,是 ID3 决策树方法的扩展。它通过根据信息增益(衡量通过按特定属性进行划分而实现的熵减少量)递归地划分数据来构建决策树。 对于分类问题,C5.0 方法是一种决策树算法。它构建规则集或决策树,这是对 C4.5 方法的改进。根…...

MOS管为什么会有夹断,夹断后为什么会有电流?该电流为什么是恒定的?

以下是对MOS管MOS管为什么会有夹断,夹断后为什么还会有电流?该电流为什么是恒定的?的一些心得体会。 1. MOS管为什么会有夹断? 可以认为D极加压使得D极的耗尽层增大(原因是N极接正极,P极接负极,电子被吸引…...

网络安全-RSA非对称加密算法、数字签名

数字签名非常普遍: 了解数字签名前先了解一下SHA-1摘要,RSA非对称加密算法。然后再了解数字签名。 SHA-1 SHA-1(secure hash Algorithm )是一种 数据加密算法。该算法的思想是接收一段明文,然后以一种不可逆的方式将…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...

深入解析 ReentrantLock:原理、公平锁与非公平锁的较量

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...