热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PythonSeleniumWebDriver浏览器驱动详解与实践

本文详细介绍了如何使用Python结合Selenium和unittest构建自动化测试框架,重点解析了WebDriver浏览器驱动的配置与使用方法,涵盖Chrome、Firefox、IE/Edge等主流浏览器。

在探讨WebDriver浏览器驱动的具体实现前,我们先简要回顾一下基于Python的自动化测试框架——Selenium和unittest。Selenium是一个强大的开源自动化测试工具,专为Web应用设计,能够在真实的浏览器环境中模拟用户的交互行为。它支持多种操作系统、浏览器和编程语言,因此被广泛应用于自动化测试领域。而unittest则是Python的标准库之一,提供了丰富的功能帮助开发者构建和管理测试用例。

为了更好地利用这些工具,我们需要完成一些基础的环境设置:

  1. 首先,推荐使用Python 3,可通过Python官方网站下载并安装,安装完成后记得将Python的安装路径添加到系统的PATH环境变量中。
  2. 接着,安装Selenium。完成Python的安装后,可以直接通过pip命令安装Selenium,具体命令为:cmd → pip install selenium。
  3. 对于unittest,由于它是Python的内置模块,使用时只需在代码中导入即可,例如:import unittest。

WebDriver作为Selenium的核心组件,通过特定的驱动程序来控制浏览器执行自动化测试脚本。不同操作系统和浏览器可能需要不同的驱动配置,因此我们将介绍如何封装通用的浏览器驱动方法,以适应多样的测试需求。

本文将逐步引导读者了解Web UI自动化测试的基本方法,并通过具体的示例展示如何封装和使用三大主流浏览器(Chrome、Firefox、IE/Edge)的WebDriver驱动方法。

1. Chrome 浏览器驱动

Chrome的驱动程序名为chromedriver,它并不严格区分32位和64位系统,主要确保与浏览器版本相匹配。对于较新的Chrome版本(70及以上),chromedriver的版本应与Chrome的大版本保持一致。如果一个Chrome版本对应多个chromedriver版本,可以通过详细的版本号或发布时间来选择合适的驱动程序。如图所示:

对于早期的Chrome版本,Chrome版本号与chromedriver版本号可能不一致,这时可以通过版本对照表来选择正确的驱动程序。如图所示:

更多关于chromedriver的信息,可访问其官方下载页面获取。

2. Firefox 浏览器驱动

Firefox的驱动程序名为geckodriver,其版本需要与Selenium和Firefox版本相匹配。Selenium 2内建的驱动程序默认支持路径安装的Firefox。而Selenium 3及更高版本则支持Firefox 47及之后的版本,虽然没有严格的版本对应表,但通常推荐根据浏览器和geckodriver的发布时间来选择匹配的版本。如图所示:

有关geckodriver的更多信息,可访问其官方下载页面获取。

3. IE/Edge 浏览器驱动

对于IE浏览器,其驱动程序为IEDriverServer,版本需与Selenium版本相匹配。此外,还需要确保在IE浏览器的安全选项中启用了所有四个区域(Internet、本地Intranet、可信站点、受限站点)的保护模式。如图所示:

关于IEDriverServer的更多信息,可访问其官方下载页面获取。

而对于Edge浏览器,旧版Edge 18及以上的版本会自动提供WebDriver更新,而旧版Edge 17及以下版本则需要手动下载对应的MicrosoftWebDriver版本。如图所示:

注意区分新版和旧版MicrosoftWebDriver的下载链接。如图所示:

更多关于MicrosoftWebDriver/edgedriver的信息,可访问其官方下载页面获取。

4. 浏览器驱动封装实例 (Python)
from selenium import webdriver

class BrowserWrapper(object):
def __init__(self):
self.driver = None

def launch_browser(self, browser_name):
'''
启动指定的浏览器
:param browser_name: 浏览器名称,支持 'Chrome', 'Firefox', 'IE', 'Edge'
:return: None
'''
if browser_name == 'Chrome':
print('=== 正在启动 Chrome 浏览器...')
chrome_optiOns= webdriver.ChromeOptions()
# 禁用自动化受控提示和开发者模式扩展
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation', 'load-extension'])
# 禁用保存密码提示
prefs = {'credentials_enable_service': False, 'profile.password_manager_enabled': False}
chrome_options.add_experimental_option('prefs', prefs)
self.driver = webdriver.Chrome(optiOns=chrome_options)
elif browser_name == 'Firefox':
print('=== 正在启动 Firefox 浏览器...')
self.driver = webdriver.Firefox()
elif browser_name == 'IE':
print('=== 正在启动 IE 浏览器...')
self.driver = webdriver.Ie()
elif browser_name == 'Edge':
print('=== 正在启动 Edge 浏览器...')
self.driver = webdriver.Edge()
else:
print('=== 未知的浏览器类型,请选择支持的浏览器...')

if __name__ == '__main__':
bw = BrowserWrapper()
bw.launch_browser('Chrome')

推荐阅读
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 本文详细介绍了如何使用Linux下的mysqlshow命令来查询MySQL数据库的相关信息,包括数据库、表以及字段的详情。通过本文的学习,读者可以掌握mysqlshow命令的基本语法及其常用选项。 ... [详细]
  • 本文详细探讨了编程中的命名空间与作用域概念,包括其定义、类型以及在不同上下文中的应用。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 本文探讨了在 PHP 的 Zend 框架下,使用 PHPUnit 进行单元测试时遇到的 Zend_Controller_Response_Exception 错误,并提供了解决方案。 ... [详细]
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
  • 使用R语言进行Foodmart数据的关联规则分析与可视化
    本文探讨了如何利用R语言中的arules和arulesViz包对Foodmart数据集进行关联规则的挖掘与可视化。文章首先介绍了数据集的基本情况,然后逐步展示了如何进行数据预处理、规则挖掘及结果的图形化呈现。 ... [详细]
  • 探讨如何在给定数组中寻找一个连续子数组,使其和至少达到指定值s,同时确保子数组长度最短。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文探讨了在Python中多线程与多进程的性能差异,特别是在处理CPU密集型任务和I/O密集型任务时的表现。由于全局解释器锁(GIL)的存在,多线程在利用多核CPU方面表现不佳,而多进程则能有效利用多核资源。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • 本文介绍如何使用 Python 计算两个时间戳之间的时间差,并将其转换为毫秒。示例代码展示了如何通过 `time` 和 `datetime` 模块实现这一功能。 ... [详细]
  • 本文详细对比了HashMap和HashTable在多线程环境下的安全性、对null值的支持、性能表现以及方法同步等方面的特点,帮助开发者根据具体需求选择合适的数据结构。 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
author-avatar
hedongsheng
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有