初识pytest-selenium:快速上手指南
发布时间: 2024-01-05 04:17:12 阅读量: 114 订阅数: 49
selenium初学者指南
5星 · 资源好评率100%
# 1. 简介
## 1.1 pytest-selenium是什么
pytest-selenium是一个结合了pytest和Selenium的框架,用于编写自动化测试用例并进行Web应用程序的测试。它提供了简单易用的API和丰富的功能,能够有效地进行Web界面的测试。
## 1.2 为什么选择使用pytest-selenium
使用pytest-selenium有以下几个优势:
- pytest-selenium结合了pytest和Selenium的功能,能够充分发挥两者的优势,编写简单清晰的测试用例。
- pytest框架具有很好的灵活性和扩展性,可以通过插件机制方便地扩展各种功能。
- Selenium是一种流行的自动化测试工具,支持多种浏览器,能够模拟用户操作进行测试。
通过结合使用pytest和Selenium,能够更加高效地进行Web应用程序的自动化测试,并且能够轻松地与持续集成(CI)工具集成,实现自动化测试的持续集成和持续交付。
# 2. 环境设置
在进行 pytest-selenium 测试之前,需要进行一些环境设置,包括安装必要的软件和配置浏览器驱动。
#### 2.1 安装Python和pip
首先确保已经安装了Python和pip。可以从官方网站 [Python官网](https://www.python.org/downloads/) 下载安装包,并按照指引进行安装。安装完成后,可以在命令行中使用以下命令验证Python和pip是否成功安装:
```bash
python --version
pip --version
```
#### 2.2 安装pytest和selenium
接下来,我们需要安装 pytest 和 selenium 库。在命令行中执行以下命令来安装这两个库:
```bash
pip install pytest
pip install selenium
```
#### 2.3 配置浏览器驱动
pytest-selenium需要与特定的浏览器驱动配合使用,以便自动化测试。你可以选择 Chrome、Firefox、Edge 等浏览器,并下载相应的驱动程序。将驱动程序所在的目录添加到系统的环境变量中,或者在代码中指定驱动程序的路径。
完成上述环境设置后,就可以开始编写 pytest-selenium 测试用例了。
# 3. 测试用例编写
在本章节中,我们将详细介绍如何使用pytest-selenium编写测试用例。我们将从编写第一个测试用例开始,介绍如何进行断言、验证网页元素以及处理元素定位问题。
#### 3.1 编写第一个pytest-selenium测试用例
首先,我们需要导入必要的库和模块:
```python
import pytest
from selenium import webdriver
```
接下来,我们编写一个简单的测试用例:
```python
def test_open_browser():
driver = webdriver.Chrome()
driver.get("https://www.example.com")
assert "Example Domain" in driver.title
driver.quit()
```
在上面的例子中,我们首先实例化一个Chrome浏览器驱动,然后打开"https://www.example.com"网页并对页面标题进行断言。最后,我们关闭浏览器。
#### 3.2 断言和验证网页元素
除了页面标题外,我们还可以对页面元素进行断言,比如验证页面中是否存在某个特定的元素。我们可以使用Selenium提供的`find_element`方法来定位元素,然后进行断言。
```python
def test_verify_element_present():
driver = webdriver.Chrome()
driver.get("https://www.example.com")
assert driver.find_element_by_tag_name("h1").text == "Example Domain"
driver.quit()
```
在上面的例子中,我们使用`find_element_by_tag_name`方法来定位`<h1>`标签元素,然后对其文本内容进行断言。
#### 3.3 处理元素定位问题
有时候,页面中的元素定位会比较困难,我们可以通过CSS选择器、XPath等方式来定位元素。
```python
def test_element_located_by_css_selector():
driver = webdriver.Chrome()
driver.get("https://www.example.com")
assert driver.find_element_by_css_selector("p > a").get_attribute("href") == "https://www.iana.org/domains/example"
driver.quit()
```
在这个例子中,我们使用CSS选择器`"p > a"`来定位一个链接元素,然后获取其href属性进行断言。
通过上面这些例子,我们可以看到如何使用pytest-selenium编写测试用例,并对页面元素进行断言和验证。接下来,我们将介绍pytest-selenium的常用API。
# 4. pytest-selenium常用API介绍
在使用pytest-selenium进行测试时,我们可以通过一些常用的API来操作浏览器和网页元素。下面将介绍一些常用的API。
## 4.1 打开和关闭浏览器
首先,让我们看看如何打开和关闭浏览器。
### 打开浏览器
```python
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import pytest
@pytest.fixture(scope="session")
def browser():
driver = webdriver.Chrome()
yield driver
driver.quit()
```
上述代码示例中,首先我们导入了selenium库中的webdriver模块和Keys模块,然后使用pytest的fixture装饰器创建了一个作用域为session的fixture函数`browser`,其中我们实例化了一个Chrome浏览器驱动对象并返回。`yield`关键字用于将浏览器驱动对象返回给测试用例,在测试用例执行完毕后,`yield`之后的代码将会被执行,这里我们调用了`driver.quit()`方法关闭浏览器。
### 关闭浏览器
在使用完浏览器后,记得及时关闭浏览器以释放资源。
```python
def test_close_browser(browser):
browser.get("http://www.example.com")
# 执行一些操作
# ...
browser.quit()
```
<br>
## 4.2 导航和操作浏览器
pytest-selenium提供了一些用于导航和操作浏览器的API。下面是一些常用的API示例:
### 打开网页
```python
def test_open_webpage(browser):
browser.get("http://www.example.com")
assert browser.title == "Example Domain"
```
在上述示例中,我们使用`get()`方法打开了一个网页,并使用断言验证网页的标题是否为"Example Domain"。
### 导航到其他页面
```python
def test_navigation(browser):
browser.get("http://www.example.com")
# 导航到其他页面
browser.get("http://www.example.com/page1")
# 使用浏览器的后退功能
browser.back()
# 使用浏览器的前进功能
browser.forward()
# 刷新当前页面
browser.refresh()
```
在上述示例中,我们使用`get()`方法导航到一个网页,然后使用`back()`方法模拟浏览器的后退功能,使用`forward()`方法模拟浏览器的前进功能,使用`refresh()`方法刷新当前页面。
### 最大化和设置浏览器窗口大小
```python
def test_window(browser):
# 最大化浏览器窗口
browser.maximize_window()
# 设置浏览器窗口大小
browser.set_window_size(800, 600)
```
在上述示例中,我们使用`maximize_window()`方法将浏览器窗口最大化,使用`set_window_size()`方法设置浏览器窗口的宽度和高度。
<br>
## 4.3 设置和获取元素属性
使用 pytest-selenium,我们可以很方便地设置和获取网页元素的属性。
### 设置元素属性
```python
from selenium.webdriver.common.by import By
def test_set_element_attribute(browser):
element = browser.find_element(By.ID, "element_id")
# 设置元素属性
browser.execute_script("arguments[0].setAttribute('attr_name', 'attr_value')", element)
```
在上述示例中,我们首先使用`find_element()`方法找到指定的元素,然后使用`execute_script()`方法执行JavaScript代码,使用`setAttribute()`方法设置元素的属性。
### 获取元素属性
```python
def test_get_element_attribute(browser):
element = browser.find_element(By.ID, "element_id")
# 获取元素属性
attr_value = element.get_attribute("attr_name")
assert attr_value == "attr_value"
```
在上述示例中,我们使用`get_attribute()`方法获取元素的属性值,并使用断言验证获取的属性值是否为"attr_value"。
<br>
## 4.4 模拟鼠标和键盘操作
在测试中,我们有时需要模拟鼠标和键盘的操作,如点击、输入等。
### 模拟鼠标点击
```python
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
def test_mouse_click(browser):
element = browser.find_element(By.ID, "element_id")
# 创建鼠标动作对象
action_chains = ActionChains(browser)
# 执行鼠标左键点击操作
action_chains.click(element).perform()
```
在上述示例中,我们首先使用`find_element()`方法找到指定的元素,然后创建一个鼠标动作对象`ActionChains`,最后使用`click()`方法模拟鼠标左键点击操作。
### 模拟键盘输入
```python
from selenium.webdriver.common.keys import Keys
def test_keyboard_input(browser):
element = browser.find_element(By.ID, "element_id")
# 清空输入框内容
element.clear()
# 输入内容
element.send_keys("pytest-selenium is awesome!")
# 模拟键盘回车操作
element.send_keys(Keys.ENTER)
```
在上述示例中,我们首先使用`find_element()`方法找到指定的元素,然后使用`clear()`方法清空输入框的内容,使用`send_keys()`方法输入指定的内容,使用`Keys.ENTER`模拟键盘的回车操作。
以上就是pytest-selenium常用的操作API,我们可以根据需要选择合适的API进行使用。
注:本章节代码示例使用的是pytest-selenium的fixture方式,实际测试用例中可以根据需要进行调整。
# 5. 参数化测试
参数化测试是通过在一个测试方法中使用不同的参数来执行多次相同的测试用例。这种测试方法可以有效地减少代码的重复性,并且可以更好地测试不同的输入和边界条件。
#### 5.1 使用@pytest.mark.parametrize装饰器
`@pytest.mark.parametrize`装饰器是用来实现参数化测试的关键。它可以将测试方法参数化,即为测试方法提供不同的参数值来执行不同的测试。
假设我们有一个计算器程序,我们希望测试它的加法功能。我们可以使用参数化测试来测试不同的加法运算。
首先,我们需要导入pytest和`@pytest.mark.parametrize`装饰器:
```python
import pytest
```
然后,我们定义一个测试方法`test_add`,并在方法上使用`@pytest.mark.parametrize`装饰器指定参数化的参数。
```python
@pytest.mark.parametrize("a, b, expected", [
(1, 2, 3),
(5, 5, 10),
(10, -5, 5)
])
def test_add(a, b, expected):
result = add(a, b)
assert result == expected
```
在上述示例中,参数化装饰器中的参数是一个列表,其中的每个元素是一个元组,表示一个参数组合。每个元组中的元素依次对应测试方法中的参数。
`test_add`方法接受三个参数`a`、`b`和`expected`,分别代表两个加数和预期的加法结果。我们可以通过多次执行测试方法来验证程序在不同情况下的加法运算是否正确。
当我们运行这个测试方法时,`test_add`将会被执行三次,每次使用不同的参数,从而测试不同的加法运算。如果断言条件不满足,测试将会失败并打印失败信息。
#### 5.2 数据驱动测试案例
除了使用装饰器提供参数化的参数,我们还可以将参数从外部数据源加载,实现数据驱动的测试。
在参数化测试中,我们可以使用`.csv`、`.xlsx`、`.json`等文件来存储测试数据,并在测试方法中读取这些文件来获取参数。
假设我们有一个`.csv`文件来存储加法运算的测试数据,文件内容如下:
```
a,b,expected
1,2,3
5,5,10
10,-5,5
```
我们可以使用`pandas`库来读取`.csv`文件,并将数据传递给测试方法。首先,我们需要安装`pandas`库:
```bash
pip install pandas
```
然后,我们可以按照以下方式修改测试方法:
```python
import pytest
import pandas as pd
@pytest.mark.parametrize("a, b, expected", pd.read_csv("test_data.csv").values)
def test_add(a, b, expected):
result = add(a, b)
assert result == expected
```
在上述示例中,我们使用`pd.read_csv`方法读取`.csv`文件,并将数据传递给`@pytest.mark.parametrize`装饰器。
#### 5.3 参数化配置文件的使用
除了从外部文件读取测试数据,我们还可以将测试参数存储在配置文件中,并在测试方法中读取这些配置。
例如,我们可以使用`ini`格式的配置文件来存储测试数据,文件内容如下:
```ini
[a]
a = 1
b = 2
expected = 3
[b]
a = 5
b = 5
expected = 10
[c]
a = 10
b = -5
expected = 5
```
我们可以使用`configparser`库来读取`.ini`文件,并在测试方法中读取配置。首先,我们需要安装`configparser`库:
```bash
pip install configparser
```
然后,我们可以按照以下方式修改测试方法:
```python
import pytest
from configparser import ConfigParser
config = ConfigParser()
config.read("test_config.ini")
@pytest.mark.parametrize("a, b, expected", [
(
int(config.get("a", "a")),
int(config.get("a", "b")),
int(config.get("a", "expected"))
),
(
int(config.get("b", "a")),
int(config.get("b", "b")),
int(config.get("b", "expected"))
),
(
int(config.get("c", "a")),
int(config.get("c", "b")),
int(config.get("c", "expected"))
)
])
def test_add(a, b, expected):
result = add(a, b)
assert result == expected
```
在上述示例中,我们使用`ConfigParser`类读取`.ini`文件,并通过`.get`方法获取配置参数。然后,我们将这些参数传递给`@pytest.mark.parametrize`装饰器,实现参数化测试。
参数化测试是一个非常有用的测试方法,能够帮助我们简化测试代码,并更好地测试不同情况下的代码行为。通过参数化测试,我们可以轻松地测试多种输入和边界条件,提高测试的覆盖率和可靠性。
**总结**
本章介绍了参数化测试的概念和使用方法。我们学习了如何使用`@pytest.mark.parametrize`装饰器实现参数化测试,并介绍了数据驱动测试和参数化配置文件的使用。参数化测试是测试代码的重要手段,可以帮助我们更好地测试不同情况下的代码行为,提高测试的覆盖率和可靠性。
# 6. 报告生成和扩展
在本章节中,我们将介绍如何使用pytest-selenium生成HTML测试报告以及如何使用pytest插件扩展功能。
#### 6.1 生成HTML测试报告
在编写测试用例并执行测试后,我们通常会希望生成漂亮的测试报告来展示测试结果。pytest-selenium可以结合pytest-html插件来生成HTML测试报告。
首先,我们需要安装pytest-html插件:
```bash
pip install pytest-html
```
安装完成后,我们可以在运行测试时添加--html参数来生成HTML测试报告:
```bash
pytest --html=report.html
```
此命令将会执行测试,并将测试结果保存在report.html文件中,我们可以通过浏览器打开该文件来查看详细的测试报告。
#### 6.2 使用pytest插件扩展功能
pytest-selenium可以与其他pytest插件结合,扩展测试功能。例如,我们可以使用pytest-xdist插件实现多线程并发执行测试用例:
首先,安装pytest-xdist插件:
```bash
pip install pytest-xdist
```
然后,我们可以使用-x参数来执行多线程测试:
```bash
pytest -n 4
```
上述命令将会以4个线程并发执行测试用例,加快测试执行速度。
#### 6.3 调试和日志记录
在编写复杂的测试用例时,经常需要进行调试和记录测试执行过程中的日志信息。pytest-selenium可以结合pytest内置的logging模块来实现日志记录功能,同时可以使用pytest的调试功能来进行调试。
例如,我们可以在测试用例中添加日志记录:
```python
import logging
def test_example(selenium):
logging.info("Starting the test")
# Testing code here
logging.info("Test completed")
```
在执行测试时,我们可以设置日志级别来控制日志输出的详细程度。
以上是报告生成和扩展的内容,希望可以帮助到你!
0
0