使用Selenium WebDriver和Python入门自动化测试
1. 准备工作
在开始使用Selenium WebDriver与Python进行自动化测试之前,需要确保我们的开发环境已经准备就绪。以下是详细的步骤,帮助你快速搭建好环境。
1.1 安装Python及Selenium包
Python是一种广泛使用的高级编程语言,适用于多种应用场景。为了确保我们能够顺利使用Selenium WebDriver进行自动化测试,首先需要安装Python。
安装Python
-
检查是否已安装Python
大多数Linux发行版、Mac OS X和其他Unix机器默认安装了Python。如果你使用的是Windows系统,则需要单独安装Python。 -
下载并安装Python
访问 Python官方网站 下载适合你操作系统的安装程序。本书中的所有示例都在Windows 8操作系统上使用Python 2.7和Python 3.0进行了测试。
安装Selenium包
Selenium WebDriver的Python客户端库包含在Selenium包中。最简便的安装方式是使用 pip
工具。
-
安装Selenium包
打开命令行界面,运行以下命令:
bash pip install -U selenium
这条命令会下载并安装Selenium包的最新版本。-U
标志表示升级已安装的包到最新版本。 -
手动安装(可选)
如果你更喜欢手动安装,可以从 PyPI 下载Selenium包的源代码,解压缩后运行以下命令:
bash python setup.py install
1.2 浏览Selenium WebDriver的Python文档
Selenium WebDriver的Python客户端库文档提供了关于其所有核心类和函数的详细信息。以下是几个有用的链接:
- 官方文档
- Selenium Wiki
2. 选择集成开发环境(IDE)
为了提高开发效率,选择一个合适的IDE非常重要。以下是几个推荐的IDE及其特点。
2.1 PyCharm
PyCharm是由JetBrains开发的一款功能强大的Python IDE,支持多种开发需求。以下是安装和配置PyCharm的步骤:
-
下载并安装PyCharm
访问 PyCharm官方网站 下载并安装PyCharm。 -
配置Python解释器
打开PyCharm,进入File -> Settings -> Project -> Python Interpreter
,点击加号图标选择解释器路径。确保选择了正确的Python解释器版本。 -
创建新项目
在Create New Project
对话框中,点击OK
按钮创建项目。
2.2 PyDev Eclipse插件
PyDev是一个Eclipse的Python插件,适合那些已经在使用Eclipse的开发者。以下是安装步骤:
-
安装PyDev
打开Eclipse,进入Help -> Eclipse Marketplace
,搜索PyDev
并安装。 -
配置Python解释器
安装完成后,进入Window -> Preferences -> PyDev -> Interpreters -> Python Interpreter
,添加Python解释器路径。
2.3 PyScripter
PyScripter是一款轻量级的Python IDE,适合初学者。以下是安装步骤:
-
下载并安装PyScripter
访问 PyScripter官方网站 下载并安装PyScripter。 -
配置Python解释器
打开PyScripter,进入Tools -> Configure Python Interpreter
,添加Python解释器路径。
3. 创建首个自动化脚本
现在我们已经设置好了开发环境,接下来将编写第一个自动化脚本。我们将使用一个简单的搜索工作流作为示例,演示如何使用Selenium WebDriver与Python进行自动化测试。
3.1 示例应用程序
我们将使用一个基于Magento框架的电子商务示例应用程序。该应用程序的地址为 http://demo.magentocommerce.com/ 。
3.2 编写脚本
以下是编写自动化脚本的具体步骤:
-
创建Python文件
在PyCharm的Project Explorer
中,右键点击项目根目录,选择New -> Python File
,创建一个新的Python文件。 -
编写代码
在新建的Python文件中,编写如下代码:
from selenium import webdriver
# 创建一个新的Firefox会话
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.maximize_window()
# 导航到示例应用程序主页
driver.get("http://demo.magentocommerce.com/")
# 获取搜索框元素
search_field = driver.find_element_by_name("q")
search_field.clear()
# 输入搜索关键词并提交
search_field.send_keys("phones")
search_field.submit()
# 获取当前结果页面上所有显示产品名称的锚点元素
products = driver.find_elements_by_xpath("//h2[@class='product-name']/a")
# 获取找到的锚点元素数量
print(f"Found {len(products)} products:")
# 遍历每个锚点元素并打印文本(产品名称)
for product in products:
print(product.text)
# 关闭浏览器窗口
driver.quit()
这段代码实现了以下功能:
- 打开Firefox浏览器。
- 导航到示例应用程序主页。
- 清空搜索框并输入搜索关键词 phones
。
- 提交搜索请求。
- 获取搜索结果页面上的所有产品名称并打印。
- 关闭浏览器窗口。
4. 跨浏览器支持
为了确保自动化测试脚本能够在不同浏览器上正常运行,我们需要为每个浏览器设置相应的驱动程序。以下是针对Internet Explorer和Google Chrome的具体设置步骤。
4.1 设置Internet Explorer
-
下载InternetExplorerDriver
访问 Selenium官方网站 下载InternetExplorerDriver。 -
配置驱动程序路径
将下载的驱动程序文件解压缩,并将其路径添加到系统环境变量PATH
中。 -
修改脚本
修改脚本以使用InternetExplorerDriver。以下是修改后的代码:
from selenium import webdriver
# 设置InternetExplorerDriver路径
ie_driver_path = "C:\\path\\to\\IEDriverServer.exe"
# 创建一个新的IE会话
driver = webdriver.Ie(executable_path=ie_driver_path)
driver.implicitly_wait(30)
driver.maximize_window()
# 导航到示例应用程序主页
driver.get("http://demo.magentocommerce.com/")
# 获取搜索框元素
search_field = driver.find_element_by_name("q")
search_field.clear()
# 输入搜索关键词并提交
search_field.send_keys("phones")
search_field.submit()
# 获取当前结果页面上所有显示产品名称的锚点元素
products = driver.find_elements_by_xpath("//h2[@class='product-name']/a")
# 获取找到的锚点元素数量
print(f"Found {len(products)} products:")
# 遍历每个锚点元素并打印文本(产品名称)
for product in products:
print(product.text)
# 关闭浏览器窗口
driver.quit()
4.2 设置Google Chrome
-
下载ChromeDriver
访问 ChromeDriver官方网站 下载适合你操作系统的ChromeDriver。 -
配置驱动程序路径
将下载的驱动程序文件解压缩,并将其路径添加到系统环境变量PATH
中。 -
修改脚本
修改脚本以使用ChromeDriver。以下是修改后的代码:
from selenium import webdriver
# 设置ChromeDriver路径
chrome_driver_path = "C:\\path\\to\\chromedriver.exe"
# 创建一个新的Chrome会话
driver = webdriver.Chrome(executable_path=chrome_driver_path)
driver.implicitly_wait(30)
driver.maximize_window()
# 导航到示例应用程序主页
driver.get("http://demo.magentocommerce.com/")
# 获取搜索框元素
search_field = driver.find_element_by_name("q")
search_field.clear()
# 输入搜索关键词并提交
search_field.send_keys("phones")
search_field.submit()
# 获取当前结果页面上所有显示产品名称的锚点元素
products = driver.find_elements_by_xpath("//h2[@class='product-name']/a")
# 获取找到的锚点元素数量
print(f"Found {len(products)} products:")
# 遍历每个锚点元素并打印文本(产品名称)
for product in products:
print(product.text)
# 关闭浏览器窗口
driver.quit()
通过以上步骤,我们成功地设置了跨浏览器支持,确保了自动化测试脚本能够在多个浏览器上正常运行。
浏览器 | 驱动程序 | 下载链接 |
---|---|---|
Internet Explorer | InternetExplorerDriver | Selenium官方网站 |
Google Chrome | ChromeDriver | ChromeDriver官方网站 |
5. 总结
通过上述步骤,我们已经成功搭建了Selenium WebDriver与Python的开发环境,并编写了第一个自动化测试脚本。此外,我们还设置了跨浏览器支持,确保了脚本能够在多个浏览器上正常运行。接下来,我们将进一步深入学习如何编写更复杂的测试用例,并探索更多高级功能。
6. 编写复杂的测试用例
在掌握了基础的自动化脚本编写后,我们可以开始编写更复杂的测试用例。这不仅能够提高测试的覆盖率,还能确保测试的准确性和可靠性。以下是编写复杂测试用例的一些关键点。
6.1 使用unittest库
Python的 unittest
库是一个强大的单元测试框架,可以帮助我们更好地组织和管理测试用例。以下是使用 unittest
编写测试用例的具体步骤:
-
导入必要的库
在编写测试用例时,需要导入unittest
和selenium
库。 -
创建测试类
继承unittest.TestCase
类,创建一个测试类。这个类将包含多个测试方法。 -
编写测试方法
每个测试方法都应以test_
开头,并且可以在方法中编写具体的测试逻辑。 -
设置和清理
使用setUp()
和tearDown()
方法来设置测试环境和清理资源。
以下是使用 unittest
编写的一个示例测试用例:
import unittest
from selenium import webdriver
from selenium.webdriver.support.ui import Select
class CookiesTest(unittest.TestCase):
def setUp(self):
# 创建一个新的Firefox会话
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.driver.maximize_window()
# 导航到示例应用程序主页
self.driver.get("http://demo.magentocommerce.com/")
def test_store_cookie(self):
driver = self.driver
# 获取语言选择下拉框
select_language = Select(driver.find_element_by_id("select-language"))
# 检查默认选中的选项是否为英文
self.assertEqual("ENGLISH", select_language.first_selected_option.text)
# 检查store cookie是否为空
store_cookie = driver.get_cookie("store")
self.assertEqual(None, store_cookie)
# 选择法语选项
select_language.select_by_visible_text("French")
# 检查store cookie是否已更新为法语
store_cookie = driver.get_cookie("store")['value']
self.assertEqual("french", store_cookie)
def tearDown(self):
# 关闭浏览器窗口
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
6.2 测试套件和HTML报告
为了更好地管理和执行多个测试用例,我们可以创建测试套件。同时,生成HTML格式的测试报告可以方便地分享测试结果。
-
创建测试套件
使用unittest.TestLoader().loadTestsFromTestCase()
方法加载测试用例,并创建测试套件。 -
生成HTML报告
使用第三方库如HTMLTestRunner
来生成HTML格式的测试报告。
以下是创建测试套件并生成HTML报告的示例代码:
import unittest
import HTMLTestRunner
import os
def create_suite():
test_suite = unittest.TestSuite()
test_suite.addTests(unittest.makeSuite(CookiesTest))
return test_suite
if __name__ == '__main__':
suite = create_suite()
runner = HTMLTestRunner.HTMLTestRunner(
verbosity=2,
title="Test Report",
description="This report contains the test results."
)
runner.run(suite)
6.3 使用页面对象模式
页面对象模式(Page Object Pattern)是一种设计模式,用于隐藏页面元素的定位器细节,并将页面上的操作封装到单独的类中。这使得测试用例更加简洁和易于维护。
-
创建页面对象类
为每个页面创建一个页面对象类,封装页面上的元素和操作。 -
在测试用例中使用页面对象
在测试用例中实例化页面对象类,并调用其方法来执行操作。
以下是使用页面对象模式的一个示例:
from selenium import webdriver
class HomePage:
def __init__(self, driver):
self.driver = driver
def search_product(self, product_name):
search_field = self.driver.find_element_by_name("q")
search_field.clear()
search_field.send_keys(product_name)
search_field.submit()
class TestHomePage(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.driver.maximize_window()
self.driver.get("http://demo.magentocommerce.com/")
self.home_page = HomePage(self.driver)
def test_search_products(self):
self.home_page.search_product("phones")
products = self.driver.find_elements_by_xpath("//h2[@class='product-name']/a")
print(f"Found {len(products)} products:")
for product in products:
print(product.text)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
7. 使用Selenium WebDriver API进行元素交互
Selenium WebDriver提供了丰富的API,用于与网页元素进行交互。了解这些API的使用方法,可以帮助我们更高效地编写自动化测试脚本。以下是几个常用的API及其使用方法。
7.1 元素查找方法
Selenium WebDriver提供了多种查找元素的方法,可以根据不同的属性查找元素。以下是几种常见的查找方法:
-
使用ID属性
find_element_by_id(id)
:根据元素的ID属性查找元素。 -
使用名称属性
find_element_by_name(name)
:根据元素的名称属性查找元素。 -
使用类名
find_element_by_class_name(class_name)
:根据元素的类名查找元素。 -
使用标签名
find_element_by_tag_name(tag_name)
:根据元素的标签名查找元素。 -
使用XPath
find_element_by_xpath(xpath)
:根据XPath表达式查找元素。 -
使用CSS选择器
find_element_by_css_selector(css_selector)
:根据CSS选择器查找元素。
以下是使用不同查找方法的示例代码:
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.maximize_window()
driver.get("http://demo.magentocommerce.com/")
# 使用ID属性查找元素
element_by_id = driver.find_element_by_id("search")
# 使用名称属性查找元素
element_by_name = driver.find_element_by_name("q")
# 使用类名查找元素
element_by_class_name = driver.find_element_by_class_name("search-term")
# 使用标签名查找元素
element_by_tag_name = driver.find_element_by_tag_name("input")
# 使用XPath查找元素
element_by_xpath = driver.find_element_by_xpath("//input[@id='search']")
# 使用CSS选择器查找元素
element_by_css_selector = driver.find_element_by_css_selector("input#search")
driver.quit()
7.2 元素操作方法
除了查找元素外,Selenium WebDriver还提供了多种操作元素的方法。以下是几种常见的操作方法:
-
输入文本
send_keys(keys)
:向元素发送按键事件,通常用于输入文本。 -
清除文本
clear()
:清除元素中的文本内容。 -
点击元素
click()
:点击元素。 -
获取元素属性
get_attribute(attribute_name)
:获取元素的指定属性值。 -
检查元素是否可见
is_displayed()
:检查元素是否可见。 -
检查元素是否启用
is_enabled()
:检查元素是否启用。 -
检查复选框或单选按钮是否选中
is_selected()
:检查复选框或单选按钮是否选中。
以下是使用不同操作方法的示例代码:
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.maximize_window()
driver.get("http://demo.magentocommerce.com/")
# 获取搜索框元素
search_field = driver.find_element_by_name("q")
# 清除搜索框中的文本
search_field.clear()
# 输入搜索关键词
search_field.send_keys("phones")
# 提交搜索请求
search_field.submit()
# 获取搜索结果页面上的所有产品名称
products = driver.find_elements_by_xpath("//h2[@class='product-name']/a")
# 获取找到的产品数量
print(f"Found {len(products)} products:")
# 遍历每个产品并打印名称
for product in products:
print(product.text)
# 检查元素是否可见
visible = search_field.is_displayed()
print(f"Search field is visible: {visible}")
# 检查元素是否启用
enabled = search_field.is_enabled()
print(f"Search field is enabled: {enabled}")
driver.quit()
8. 使用ActionChains类进行复杂操作
对于需要模拟复杂键盘和鼠标操作的测试场景,Selenium WebDriver提供了 ActionChains
类。通过 ActionChains
类,我们可以组合多个操作,实现更复杂的交互。
8.1 常见的ActionChains操作
以下是几种常见的 ActionChains
操作及其使用方法:
-
点击并按住元素
click_and_hold(on_element=None)
:点击并按住指定元素。 -
双击元素
double_click(on_element=None)
:双击指定元素。 -
拖拽元素
drag_and_drop(source, target)
:将一个元素拖拽到另一个元素上。 -
按下键盘键
key_down(value, element=None)
:按下指定键盘键。 -
释放键盘键
key_up(value, element=None)
:释放指定键盘键。 -
移动到元素上方
move_to_element(to_element)
:将鼠标移动到指定元素上方。 -
执行所有操作
perform()
:执行所有组合操作。
以下是使用 ActionChains
类的示例代码:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.maximize_window()
driver.get("http://demo.magentocommerce.com/")
# 获取搜索框元素
search_field = driver.find_element_by_name("q")
# 创建ActionChains对象
action = ActionChains(driver)
# 点击并按住搜索框
action.click_and_hold(search_field).perform()
# 输入搜索关键词
action.send_keys("phones").perform()
# 双击搜索框
action.double_click(search_field).perform()
# 移动到搜索框上方
action.move_to_element(search_field).perform()
# 提交搜索请求
search_field.submit()
# 获取搜索结果页面上的所有产品名称
products = driver.find_elements_by_xpath("//h2[@class='product-name']/a")
# 获取找到的产品数量
print(f"Found {len(products)} products:")
# 遍历每个产品并打印名称
for product in products:
print(product.text)
driver.quit()
通过以上步骤,我们已经深入学习了如何使用Selenium WebDriver与Python进行自动化测试。我们不仅掌握了基础的自动化脚本编写,还学会了如何编写更复杂的测试用例,并探索了更多高级功能。接下来,我们将继续探索Selenium WebDriver的更多高级特性和应用场景。
mermaid流程图示例
表格示例
测试用例 | 描述 | 预期结果 |
---|---|---|
test_store_cookie | 测试语言选择下拉框和store cookie的行为 | 默认选中英文,选择法语后store cookie更新为”french” |
test_search_products | 测试搜索功能 | 输入关键词”phones”后,找到并打印所有匹配的产品名称 |
通过这些内容,我们已经全面掌握了使用Selenium WebDriver与Python进行自动化测试的基本方法和技巧。希望这篇文章能够帮助你更好地理解和应用这些技术。