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

server/2025/1/14 21:34:05/

这里写目录标题

    • 什么是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进行网页自动化操作(代码示例,可以直接运行)

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

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

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

  2. 显式等待

    python">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. 线程等待

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

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

Selenium高级技巧详解

页面元素操作

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

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

    python">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. 鼠标悬停

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

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

处理弹窗和警告框

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

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

截图和日志记录

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

  1. 截图

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

    python">page_source = driver.page_source
    
  3. 日志记录

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

多窗口和多标签页操作

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

python"># 获取当前窗口句柄
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中文版


http://www.ppmy.cn/server/158381.html

相关文章

用python实战excel和word自动化

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python实现excel和word自动化--批量处理 前言--需求快要期末了需要,提交一个年级的学生成绩数据,也就是几百份。当前我们收集了一份excel表格&#xf…

给DevOps加点料:融入安全性的DevSecOps

从前,安全防护只是特定团队的责任,在开发的最后阶段才会介入。当开发周期长达数月、甚至数年时,这样做没什么问题;但是现在,这种做法现在已经行不通了。 采用 DevOps 可以有效推进快速频繁的开发周期(有时…

E12.【C语言】练习:求两个数的最大公约数

目录 1.枚举 2.辗转相除法 1.枚举 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {int a 0;int b 0;int tmp 0;scanf("%d %d", &a, &b);if (a < b){for (int i1; i < a; i){if (0a% i && 0b%i)tmp i;}}if …

vue使用自动化导入api插件unplugin-auto-import,避免频繁手动导入

‌unplugin-auto-import‌是一个现代的自动导入插件&#xff0c;旨在简化前端开发中的导入过程&#xff0c;减少手动导入的繁琐工作&#xff0c;提升开发效率。它支持多种构建工具&#xff0c;包括Vite、Webpack、Rollup和esbuild&#xff0c;并且可以与TypeScript配合使用&…

贪心算法笔记

贪心算法笔记 大概内容 贪心就是对于一个问题有很多个步骤,我们在每一个步骤中都选取最优的那一个,最后得出答案。就是在一些函数中可行,但是有些比如二次函数,因为它的转折点不一定最优,就是不可行的。那么如何判断贪心呢?有这么几种 看时间复杂度,一般的就是 O ( n…

【经验】MCU在keil和IAR中开启FPU 硬件浮点运算单元

本文是总结归纳了两篇笔记: 关于华大/小华 HC32F460 在IAR环境中&#xff0c;无法启用FPU 硬件浮点运算单元的解决方案 【经验】雅特力MCU在Keil和IAR中开启和关闭浮点运算单元&#xff08;FPU&#xff09;的配置方法及注意事项 第一步 先查看所使用的MCU的手册,是否内置了FPU…

Oracle 学习指南与资料分享

Oracle 学习资料 Oracle 学习资料 Oracle 学习资料 在当今数字化飞速发展的浪潮中&#xff0c;Oracle 数据库凭借其卓越的性能、强大的功能以及高度的可靠性&#xff0c;稳坐数据库领域的前沿宝座&#xff0c;广泛应用于金融、电信、航空航天等诸多关键行业。如果你有志于深入…

Word 转成pdf及打印的开源方案支持xp

Word转成pdf、打印的方案几乎没有免费开源的方案&#xff0c;现在提供一个通过LibreOffice实现的方案 操作依赖LibreOffice需要安装&#xff0c;点此下载老版本 5.4.7.2是最后一个支持xp的 版本如需xp要请安装此版本 LibreOffice官方介绍 LibreOffice 是一款开放源代码的自…