【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 EC
    
    wait = 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 Select
    
    select_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 ActionChains
    
    element = 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 logging
    
    logging.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"  # 设置要访问的URL
        self.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)  # 打开指定的URL

        for 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中文版

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Seata搭建

1.初识Seata Quick Start | Apache Seata 官网 2.准备nacos和 seata 启动nacos startup.cmd -m standalone账号nacos 密码nacos 搭建seata TC 这里下载的 1.4.2 seata-server-1.4.2 1.修改seata配置文件 registry.conf 这里我们使用nacos作为注册中心 和 配置中心 r…

selenium+pyqt5自动化工具总结

说明:本工具是,操作外部google浏览器、selenium是无法操作qt界面中嵌套的浏览器的, 工具在后面 1. 代码结构 pycharm打开的文件下,再写一个子文件,文件导入的时候把子文件名带上 这样就可以在 外层使用命令 pyinst…

.NET 终止或结束进程

如何使用 C# 终止进程。 使用简单的方法终止.NET中的现有进程Process.Kill()。有一个可选参数 true 或 false,用于结束与要结束的进程相关的所有子进程。 了解如何创建流程。 结束当前进程: System.Diagnostics.Process.GetCurrentProcess().Kill(tru…

怎么实现Redis的高可用?

大家好,我是锋哥。今天分享关于【怎么实现Redis的高可用?】面试题。希望对大家有帮助; 怎么实现Redis的高可用? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 为了实现 Redis 的高可用性,我们需要保证在发…

大数据技术实训:Hadoop完全分布式运行模式配置

准备: 1)准备3台客户机(关闭防火墙、静态ip、主机名称) 2)安装JDK 3)配置环境变量 4)安装Hadoop 5)配置环境变量 6)配置集群 7)单点启动 8)配置ss…

【Uniapp-Vue3】Prop校验与prop默认值用法及循环遍历数组对象

一、prop校验 如果我们在想要限制prop的类型,就可以在接收prop的时候对接收类型进行限制: defineProps({ 属性名:{ type:类型 } }) 需要注意类型的首字母大写 但是设置了传入参数类型限制并不能严格限制,只会在后台进行提示: 二、…

开启Excel导航仪,跨表跳转不迷路-Excel易用宝

都2025年了,汽车都有导航了,你的表格还没有导航仪吗?那也太OUT了。 面对着一个工作簿中有N多个工作表,工作表中又有超级表,数据透视表,图表等元素,如何快速的切换跳转到需要查看的数据呢&#…

【Unity3D日常开发】Unity3D中适用WEBGL打开Window文件对话框打开/上传文件

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 Unity3D发布的WEBGL程序是不支持直接的I/O操…

《安富莱嵌入式周报》第348期:开源低功耗测试仪,开源创意万用表,续航100-300小时,开源PCB电机,自制shell和网络协议栈,开源水培自动化系统

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1Tzr9Y3EQ7/ 《安富莱嵌入式周报》第348期:开源低功…

音频合成的常见问题

使用了1年多的音频合成,有些常见的问题分享给大家 。 一、音质问题 噪声 背景噪声:在音频合成过程中,可能会引入背景噪声。这可能是由于原始音频素材本身质量不佳,比如录制环境嘈杂,包含电脑风扇声、外界交通声等。当…

用AI技术提升Flutter开发效率:ScriptEcho的力量

引言 在当今快速发展的技术时代,Flutter作为一种跨平台开发框架,正在越来越多的开发者中崭露头角。它不仅能够为开发者提供一套代码同时部署到iOS和Android平台的解决方案,还能帮助企业节省人力成本和开发时间。然而,对于新手开发…

SmartAIChain荣获重要认可

2024年12月21日,洛杉矶尔湾市——在今年尔湾举办的交流会上,黄荣先生的SmartAIChain项目获得了重要认可。此次活动汇聚了来自各地的杰出人才以及社区代表,共同庆祝这一创新性艺术的时刻。 在活动中,核桃市议员伍立伦(Allen Wu)的代表黄冬平女士发言,并为黄荣先生颁发了荣誉证书…

EFT信号测试和电源测试经验笔记

1. 什么是EFT 标准:perlEC 61000-4-4 eft设备将群脉冲干扰加到信号或者电源上,常见的频率是 5K 100K 两个频率 电压 电源3k,信号2k -----电网设备 电源4K -------------------空调设备 大概就是下图这样的周期性脉冲 1.1 电源eft 通过信…

web前端学习总结(一)

web前端使用三项技术:html、css、javascript. 一、html:超文本标记语言&#xff0c;用于展示网页的框架。 <html> <head><title> </title></head><body><div> </div> <!--用于布局&#xff0c;占1行 --><span&g…

【web靶场】之upload-labs专项训练(基于BUUCTF平台)

前言 该靶场&#xff0c;是通过平台BUUCTF在线评测中的靶场进行的&#xff0c;基于linux搭建的 当然若是想要该靶场&#xff0c;可以采用github上的醒目&#xff0c;点击后面文字即可访问c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场 或者本人分享在网盘中&a…

ES 的倒排索引

目录 什么是 elasticSearch。 什么是倒排索引 Term Index 是什么 Stored Fields 是什么 Doc Values 是什么 segment lucene 是什么 高性能 高扩展性 高可用 Node 角色分化 去中心化 ES 是什么? ES 和 Kafka 的架构差异 ES 的写入流程 ES 的搜索流程 查询阶段…

微服务电商平台课程六:后端代码框架认识

本地环境搭建好,大家可以进行调试,并能够修改其中代码。 后端技术栈 Spring Boot是伴随着Spring4.0共同诞生的,它的目的就是简化spring的配置及开发,并协助开发人员可以整体管理应用程序的配置而不再像以前那样需要做大量的配置工作,它提供了很多开发组件,并且内嵌了we…

Unity教程(二十)战斗系统 角色反击

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

Garnet:微软官方基于.Net 8开源缓存系统,可无需任何改动直接替代Redis,而且还更高性能!

近日微软官方开源了一个开源缓存系统&#xff0c;可完全替代Redis。 01 项目简介 Garnet是微软官方基于.Net 8开发的、开源高性能远程缓存存储系统&#xff0c;支持单节点、集群。 Garnet使用的是当前流行的 RESP 协议&#xff0c;使得当前大多数编程语言现成的 Redis 客户端…

java项目之网上点餐系统源码(springboot+mysql+vue)

大家好我是风歌&#xff0c;曾担任某大厂java架构师&#xff0c;如今专注java毕设领域。今天要和大家聊的是一款基于springboot的网上点餐系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 网上点餐系统的主要使用者分为管理员登录…