0

0

Python如何实现自动化测试?Selenium教程

雪夜

雪夜

发布时间:2025-08-07 11:09:02

|

423人浏览过

|

来源于php中文网

原创

搭建selenium自动化测试环境步骤如下:1.安装python并配置环境变量;2.确保pip已安装;3.使用pip安装selenium库;4.安装webdriver_manager库以自动管理浏览器驱动;5.安装目标浏览器如chrome。使用selenium进行元素交互和断言的方法包括:通过id、name、class name、tag name、link text、partial link text、css selector或xpath定位元素;执行click()、send_keys()、clear()等操作;利用assert验证页面标题、元素文本、url等。常见挑战及解决方案:1.元素定位不稳定时,使用显式等待、更稳定的定位策略如css选择器;2.测试运行缓慢时,采用无头浏览器、优化等待时间、减少不必要的交互、并行测试;3.测试结果不稳定时,确保元素状态正确、处理异步操作、避免依赖绝对时间、清理测试环境、记录日志和截图。

Python如何实现自动化测试?Selenium教程

Python实现自动化测试,通常会选择Selenium这个强大的工具库。它模拟用户行为,直接在浏览器中执行操作,是Web应用测试的常见方案,能够有效验证前端交互和业务流程。

Python如何实现自动化测试?Selenium教程

解决方案

要使用Python和Selenium进行自动化测试,核心在于搭建环境、初始化浏览器驱动、定位元素并执行操作。这听起来可能有点复杂,但实际操作起来,只要思路清晰,每一步都有迹可循。

首先,你需要安装

selenium
库。在命令行里敲下:
pip install selenium

Python如何实现自动化测试?Selenium教程

接着,我们还需要一个浏览器驱动。比如,如果你用的是Chrome浏览器,就需要下载对应的ChromeDriver。以前这事儿挺烦的,每次浏览器更新都得手动去下驱动,版本不匹配就报错。现在好了,有个库叫

webdriver_manager
,它可以自动管理驱动,省去了很多麻烦。
pip install webdriver_manager

有了这些,就可以开始写代码了。一个基本的自动化测试流程是这样的:

立即学习Python免费学习笔记(深入)”;

Python如何实现自动化测试?Selenium教程
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
    # 初始化Chrome浏览器驱动
    # 这一步webdriver_manager会自动下载并管理对应版本的驱动
    service = ChromeService(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)

    # 设置一个隐式等待,在查找元素时,如果元素没有立即可用,会等待最多10秒
    # 但我个人更倾向于使用显式等待,因为它更精确
    # driver.implicitly_wait(10)

    # 访问一个网页
    driver.get("https://www.example.com") # 替换成你要测试的网站

    # 验证页面标题
    assert "Example Domain" in driver.title
    print(f"页面标题验证通过:{driver.title}")

    # 显式等待某个元素出现,比如一个ID为"my_element"的元素
    # 这比隐式等待更推荐,因为它只针对特定元素和特定条件
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.presence_of_element_located((By.ID, "my_element")))
    print("元素'my_element'已找到。")

    # 模拟点击操作
    # element.click()

    # 模拟输入文本
    # input_field = driver.find_element(By.NAME, "q")
    # input_field.send_keys("自动化测试")

    # 截屏保存,方便调试
    driver.save_screenshot("screenshot.png")
    print("页面截图已保存为 screenshot.png")

except Exception as e:
    print(f"自动化测试过程中发生错误: {e}")
    if 'driver' in locals() and driver: # 确保driver对象存在且不为空
        driver.save_screenshot("error_screenshot.png")
        print("错误发生时页面截图已保存为 error_screenshot.png")
finally:
    # 无论测试成功与否,最后都要关闭浏览器
    if 'driver' in locals() and driver:
        driver.quit()
        print("浏览器已关闭。")

这段代码展示了一个基本的框架。实际应用中,你需要根据被测应用的具体情况,调整定位策略、交互方式和断言逻辑。

Selenium自动化测试环境如何搭建?

搭建Selenium自动化测试环境,其实并没有想象中那么复杂。我个人觉得,最关键的就是解决浏览器驱动的问题,因为这常常是初学者卡壳的地方。

第一步,当然是安装Python。这个不多说,去官网下载最新版就行。安装时记得勾选“Add Python to PATH”,能省不少事儿。

第二步,安装

pip
。Python 3.4+的版本通常都自带了,所以如果你安装的是新版Python,这一步可以跳过。

第三步,安装Selenium库。打开命令行(Windows是CMD或PowerShell,macOS/Linux是终端),输入:

pip install selenium
这一步是基础,没有它,后面的代码都跑不起来。

第四步,处理浏览器驱动。这是个痛点,也是现在被

webdriver_manager
完美解决的痛点。以前你得手动去下载ChromeDriver、GeckoDriver(Firefox)或者EdgeDriver,然后把它们放到系统PATH里,或者在代码里指定路径。这不仅麻烦,还容易出错,尤其当你的浏览器更新了,驱动版本不匹配,测试就直接崩了。 现在有了
webdriver_manager
,就简单多了:
pip install webdriver_manager
然后,在你的Python代码里,像上面示例那样使用
ChromeDriverManager().install()
,它就会自动帮你下载并管理对应版本的驱动。简直是福音!

最后,确保你安装了对应的浏览器,比如Chrome、Firefox或Edge。没有浏览器,Selenium也无从模拟。

总结一下,环境搭建的核心就是:Python + pip + selenium库 + webdriver_manager库 + 你想测试的浏览器。有了这些,基本上就可以开工了。

如何使用Selenium进行页面元素交互和断言?

在Selenium自动化测试中,与页面元素交互和进行断言是核心操作,它们决定了你的测试脚本能否真正模拟用户行为并验证结果。这块内容,我觉得理解透彻了,自动化测试的效率和可靠性会大大提升。

页面元素交互

要与页面元素交互,首先得找到它们。Selenium提供了多种定位策略:

  1. ID定位 (

    By.ID
    ): 如果元素有唯一的ID,这是最推荐的方式,因为它通常最快也最稳定。
    element = driver.find_element(By.ID, "username")

  2. Name定位 (

    By.NAME
    ): 通过元素的
    name
    属性定位。
    element = driver.find_element(By.NAME, "password")

  3. Class Name定位 (

    By.CLASS_NAME
    ): 通过元素的
    class
    属性定位。注意,如果class属性有多个值,或者有多个元素共享同一个class,可能需要更精确的定位。
    element = driver.find_element(By.CLASS_NAME, "login-button")

  4. Tag Name定位 (

    By.TAG_NAME
    ): 通过HTML标签名定位,比如
    div
    input
    a
    。通常用于查找一类元素。
    all_links = driver.find_elements(By.TAG_NAME, "a")
    (注意这里是
    find_elements
    ,返回列表)

  5. Link Text定位 (

    By.LINK_TEXT
    ): 专门用于定位超链接,通过链接的完整可见文本。
    link = driver.find_element(By.LINK_TEXT, "点击这里")

  6. Partial Link Text定位 (

    By.PARTIAL_LINK_TEXT
    ): 与
    LINK_TEXT
    类似,但只需要链接文本的一部分。
    partial_link = driver.find_element(By.PARTIAL_LINK_TEXT, "点击")

  7. CSS Selector定位 (

    By.CSS_SELECTOR
    ): 这是我个人比较喜欢的方式,因为它非常灵活和强大,可以组合多种属性、层级关系来精确定位。
    element = driver.find_element(By.CSS_SELECTOR, "input[name='username']")
    element = driver.find_element(By.CSS_SELECTOR, "#login-form .submit-button")

  8. XPath定位 (

    By.XPATH
    ): 最强大的定位方式,可以定位页面上的任何元素,包括那些没有ID或Name的。但XPath表达式可能比较复杂,而且在页面结构变化时容易失效。
    element = driver.find_element(By.XPATH, "//input[@id='username']")
    element = driver.find_element(By.XPATH, "//div[contains(text(), '欢迎')]")

找到元素后,就可以进行交互了:

  • element.click()
    : 点击元素。
  • element.send_keys("your text")
    : 向输入框输入文本。
  • element.clear()
    : 清空输入框内容。
  • element.text
    : 获取元素的可见文本。
  • element.get_attribute("attribute_name")
    : 获取元素的属性值,比如
    href
    value

断言

断言是自动化测试的灵魂,它用来验证实际结果是否符合预期。Python通常结合

unittest
pytest
框架来进行断言,但即使是简单的脚本,也可以用Python内置的
assert
语句。

一些常见的断言场景:

  • 验证页面标题:

    assert "预期标题" in driver.title

  • 验证元素文本:

    assert element.text == "预期文本"

  • 验证元素是否可见/存在:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    try:
        WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "success_message")))
        print("成功消息已显示。")
    except:
        print("成功消息未显示或超时。")
        assert False, "成功消息未出现"
  • 验证URL:

    assert driver.current_url == "预期URL"

    云模块网站管理系统3.1.03
    云模块网站管理系统3.1.03

    云模块_YunMOK网站管理系统采用PHP+MYSQL为编程语言,搭载自主研发的模块化引擎驱动技术,实现可视化拖拽无技术创建并管理网站!如你所想,无限可能,支持创建任何网站:企业、商城、O2O、门户、论坛、人才等一块儿搞定!永久免费授权,包括商业用途; 默认内置三套免费模板。PC网站+手机网站+适配微信+文章管理+产品管理+SEO优化+组件扩展+NEW Login界面.....目测已经遥遥领先..

    下载
  • 验证某个值:

    assert int(element.get_attribute("value")) > 0

我的经验是,断言要尽可能具体,不要泛泛而谈。比如,不要只断言一个页面元素是否存在,而是断言它的文本内容是否正确,或者它的状态是否符合预期。这样,当测试失败时,你能更快地定位问题。

Selenium自动化测试中常见的挑战与解决方案?

在实际的Selenium自动化测试实践中,我们会遇到各种各样的挑战,有些是技术层面的,有些是策略层面的。这些“坑”踩多了,自然就有了经验。

1. 元素定位不稳定或找不到元素 (Stale Element Reference Exception)

这是最常见的挑战之一。页面动态加载、Ajax请求、元素ID或XPath随机生成,都可能导致元素定位失败。有时候,一个元素刚被定位到,但页面内容更新了,这个元素就“过时”了,再次操作就会报错。

解决方案:

  • 显式等待 (Explicit Waits):这是我的首选。使用

    WebDriverWait
    结合
    expected_conditions
    来等待元素满足特定条件(如可见、可点击、存在于DOM中)。这比
    implicitly_wait
    更精确,因为它只针对特定操作生效。

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10) # 最长等待10秒
    element = wait.until(EC.element_to_be_clickable((By.ID, "submitButton")))
    element.click()
  • 更稳定的定位策略:尽量避免使用动态变化的ID或过于复杂的XPath。优先使用固定不变的ID、Name,如果不行,考虑使用CSS选择器。CSS选择器在可读性和稳定性之间通常能找到一个不错的平衡点。

  • 重试机制:对于偶尔出现的定位失败,可以考虑实现一个简单的重试逻辑,但要小心,避免无限循环。

2. 测试脚本运行缓慢,执行效率低

自动化测试的价值之一就是快速反馈,但如果脚本跑得太慢,这个价值就大打折扣了。

解决方案:

  • 使用无头浏览器 (Headless Browser):比如Chrome的无头模式。它不会打开图形界面,从而节省了渲染时间,尤其在CI/CD环境中非常有用。

    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_argument("--headless") # 开启无头模式
    chrome_options.add_argument("--disable-gpu") # 禁用GPU加速,通常与无头模式一起使用
    driver = webdriver.Chrome(service=service, options=chrome_options)
  • 优化等待时间:不要过度使用

    time.sleep()
    ,它会强制等待固定时间,无论元素是否已经出现。优先使用显式等待。

  • 减少不必要的交互:有些测试步骤可能不是必须通过UI交互来完成,比如登录,如果可以通过API或Cookie注入来模拟,会快很多。

  • 并行测试:利用Selenium Grid或者

    pytest-xdist
    等工具,在多台机器或多个浏览器实例上同时运行测试。

3. 测试结果不稳定 (Flaky Tests)

有时测试会“随机”失败,前一次通过,后一次就失败了,这让人非常头疼,因为很难复现和调试。这通常是由于页面加载时序、网络延迟、动画效果等非确定性因素导致的。

解决方案:

  • 确保元素状态正确:在操作元素前,不仅仅是等待元素出现,还要等待它达到可操作的状态(如可点击、可见、可输入)。
  • 处理异步操作:对于Ajax请求或动态内容加载,必须等待相关数据加载完成或DOM更新后再进行操作和断言。
  • 避免依赖绝对时间:再次强调,不要用
    time.sleep()
    ,用
    WebDriverWait
  • 清理测试环境:每次测试运行前,确保测试数据是干净的,或者在测试结束后进行清理,避免上一次测试的残留数据影响本次测试。
  • 日志记录和截图:在测试失败时,立即截取当前页面截图并记录详细日志,这对于事后分析至关重要。

这些挑战是常态,解决它们的过程也是自动化测试工程师成长的过程。没有一劳永逸的方案,关键在于理解问题本质,然后选择最合适的工具和策略去应对。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

746

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

634

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1261

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.08.11

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

3

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号