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

news2025/1/11 16:45:42

这里写目录标题

    • 什么是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中文版

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

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

相关文章

Apache XMLBeans 一个强大的 XML 数据处理框架

Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架,它提供了一种方式将 XML Schema (XSD) 映射到 Java 类,从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…

带格式 pdf 翻译

支持 openAI 接口,国内 deepseek 接口兼容 openAI 接口, deepseek api 又非常便宜 https://pdf2zh.com/ https://github.com/Byaidu/PDFMathTranslate

ubuntu22.04降级安装CUDA11.3

环境:主机x64的ubuntu22.04,原有CUDA12.1,但是现在需要CUDA11.3,本篇文章介绍步骤。 一、下载CUDA11.3的run文件 下载网址:https://developer.nvidia.com/cuda-11-3-1-download-archive?target_osLinux&target_…

9 异常

如果你希望在软件调试上有所突破,或者想了解如何通过异常进行反调试,或者想自己写一个调试器,那么就必须要深入了解异常,异常与调试是紧密相连的,异常是调试的基础。 异常产生后,首先是要记录异常信息(异常的类型、异常发生的位置等),然后要寻找异常的处理函数,我们…

springBoot整合ELK Windowsb版本 (elasticsearch+logstash+kibana)

springBoot整合ELK Windowsb版本 【elasticsearchlogstashkibana】 下载软件启动服务1、elasticsearch2、kibana3、logstash 集成springboot1、添加依赖2、在logback.xml添加相关配置3、修改logstash 配置4、重启logstash 最后测试 下载软件 elasticsearch 官网 https://www.…

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner,最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…

鸿蒙面试 2025-01-10

写了鉴权工具,你在项目中申请了那些权限?(常用权限) 位置权限 : ohos.permission.LOCATION_IN_BACKGROUND:允许应用在后台访问位置信息。 ohos.permission.LOCATION:允许应用访问精确的位置信息…

php 使用simplexml_load_string转换xml数据格式失败

本文介绍如何使用php函数解析xml数据为数组。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…

【多空资金博弈】综合副图指标,资金做多线,短线做多雷达,中长线共振,大资金进场会涨等技术信号

如上图&#xff0c;副图指标【多空资金博弈】&#xff0c;红线做多资金线&#xff0c;绿色线为做空资金线&#xff0c;紫色柱线为短线做多雷达信号&#xff0c;紫色圆柱叠加文字为大资金进场信号&#xff0c;堆量柱线和紫色空心柱线为底部吸筹建仓信号&#xff0c;三条横向虚线…

Win11家庭版转专业版

Win11家庭版转专业版&#xff08;亲测有效&#xff09; 第一步 【断网】输入这个密钥&#xff1a; R8NJ8-9X7PV-C7RCR-F3J9X-KQBP6 第二步 点击下一步会自动重启 第三步 【联网】输入这个密钥&#xff1a; F3NWX-VFMFC-MHYYF-BCJ3K-QV66Y 注意 两次输入密钥的地方一致 …

【云商城】高性能门户网构建

第3章 高性能门户网构建 网站门户就是首页 1.OpenResty 百万并发站点架构 ​ 1).OpenResty 特性介绍 ​ 2).搭建OpenResty ​ 3).Web站点动静分离方案剖析 2.Lua语法学习 ​ 1).Lua基本语法 3.多级缓存架构实战 ​ 1).多级缓存架构分析 用户请求网站&#xff0c;最开始…

上海亚商投顾:沪指探底回升微涨 机器人概念股午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天探底回升&#xff0c;沪指盘中跌超1.6%&#xff0c;创业板指一度跌逾3%&#xff0c;午后集体拉升翻红…

计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

游戏语音的历史是什么样的?

游戏中&#xff0c;离不开游戏社交。 无社交&#xff0c;不游戏&#xff0c;大家都深知社交在游戏体验中的重要性。 游戏语音的发展史是怎么样的&#xff1f;问了下AI&#xff0c;给我的回答是 早期阶段 1970年代&#xff1a;1970年代出现了第一个语音游戏“尤瓦尔的冒险”&am…

《解锁图像的语言密码:Image Caption 开源神经网络项目全解析》

《解锁图像的语言密码&#xff1a;Image Caption 开源项目全解析》 一、开篇&#xff1a;AI 看图说话时代来临二、走进 Image Caption 开源世界三、核心技术拆解&#xff1a;AI 如何学会看图说话&#xff08;一&#xff09;深度学习双雄&#xff1a;CNN 与 RNN&#xff08;二&a…

毕业设计选题

你是不是正在纠结毕业设计该如何完成&#xff1f;不知道该如何选题?同时又觉得定制太昂贵&#xff1f;你是不是还在为毕业论文不会写而苦恼&#xff1f; 当你看到这儿&#xff0c;就不用再纠结再苦恼了&#xff0c;周哥为你提供了计算机专业各个方向的选题&#xff0c;包括Jav…

linux RT-Preempt spin lock实现

一、spin_lock概述 Spinlock是linux内核中常用的一种互斥锁机制&#xff0c;和mutex不同&#xff0c;当无法持锁进入临界区的时候&#xff0c;当前执行线索不会阻塞&#xff0c;而是不断的自旋等待该锁释放。正因为如此&#xff0c;自旋锁也是可以用在中断上下文的。也正是因为…

Ubuntu 22.04 桥接配置

1. 网卡配置文件备份 sudo cp /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak 1.1 静态ip配置 1.1.3 解释 network: version: 2 ethernets: # 网卡名称 使用ifconfig查看 ens33: dhcp4: false dhcp6: false …

PHP多功能投票小程序源码

多功能投票小程序&#xff1a;全方位打造专属投票盛宴的得力助手 &#x1f389; &#x1f527; 基于先进的ThinkPHP框架与Uniapp技术深度融合&#xff0c;我们匠心独运&#xff0c;精心雕琢出一款功能全面、操作便捷的投票小程序&#xff0c;旨在为您带来前所未有的投票体验。…

[fastadmin] 第三十四篇 FastAdmin 商城模块标签使用详解

FastAdmin 商城模块标签使用详解 一、标签基本语法 1.1 基础语法格式 {shop:goodslist flag"参数值" id"变量名" row"数量"}<!-- 循环内容 --> {/shop:goodslist}1.2 常用参数说明 flag: 商品标记筛选id: 循环变量名row: 显示数量 1.…