Web 自动化测试价值与体系:
1.UI 自动化测试
2.自动化测试相关技术
Selenium支持多语言,行业内最火最主流
pytest/junit5最好用最全面的单元测试框架
allure测试报告
-
有赞: UI 自动化测试在有赞的实践
@startmindmap -
Web自动化测试
** 初级
*** selenium 常见方法的基本使用
*** 基本web自动化测试用例编写
** 中级
*** web自动化测试技巧进阶使用
*** 用例集成截图、日志、报告
** 高级
*** PageObject设计模式
*** 基于 page object 模式的测试用例编写
** 资深与拓展
** 常见面试题
@endmindmap
3.selenium依赖安装:
- 官方网站
- 简介
- 用于web浏览器测试的工具
- 支持的浏览器包括IE,Firefox,Safari,Chrome,Edge等
- 使用简单,可使用Java,Python等多种语言编写用例脚本
- 主要由三个工具构成:WebDriver、IDE、Grid
- 准备好Python/Java环境
- 准备好selenium依赖
- driver的下载与配置(Mac与Windows不同)
- 在代码中import对应的依赖
注意:刚开始学习,谷歌浏览器和火狐浏览器选一个配置即可,建议谷歌浏览器
配置好python环境
配置好pip工具
安装:pip install selenium
4.Drver的下载与配置
下载浏览器对应的driver
配置driver的环境变量
重启命令行工具,验证是否配置成功
chromedriver --version 输入之前要重启cmd
java环境:
- 前提:
- Java环境
- maven环境
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0-rc-2</version>
</dependency>
UTF-8
11
11
5.8.2
3.8.1
3.0.0-M5
2.2
3.0.0-M5
</properties>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0-rc-2</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
</dependencies>
<build>
<!-- maven 运行的依赖插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<parameters>true</parameters>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M7</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
Driver下载和安装
- 下载浏览器对应的driver,谷歌浏览器和火狐浏览器选一个即可。
- 配置 driver 的环境变量
- 重启命令行工具,验证是否配置成功
- chromedriver的下载(windows)
- 确定与浏览器匹配的driver版本
- 根据使用的操作系统下载相应的 chromedriver
- 淘宝镜像:
- Windows详细配置步骤:
- 重启命令行,输入:
chromedriver --version
geckodriver 配置-Windows
-
下载geckodriver。
- 没有chromedriver类似的对应关系,默认下载最新的driver版本
- 根据使用的操作系统下载相应的 geckodriver
- 淘宝镜像:CNPM Binaries Mirror
-
配置步骤与谷歌浏览器的相同。
-
输入
geckodriver --version
,验证是否配置成功。 -
chromedriver的下载(MAC)
- 确定与浏览器匹配的driver版本
- 根据使用的操作系统下载相应的 chromedriver
-
淘宝镜像:
chromedriver 环境变量配置-Mac
- 进入命令行工具,确定当前的SHELL环境:
echo $SHELL
- 根据自己的SHELL环境选择执行命令:
- 如果显示
/bin/bash
,则vim ~/.bash_profile
- 如果显示
/bin/zsh
则vim ~/.zshrc
- 在文件中添加:
export PATH=$PATH:[chromedriver所在路径]
- 重启命令行工具
- 输入
chromedriver
,验证是否配置成功(MAC)
geckodriver 配置-Mac
- 下载geckodriver。
- 没有chromedriver类似的对应关系,默认下载最新的driver版本
- 根据使用的操作系统下载相应的 geckodriver
- 淘宝镜像:CNPM Binaries Mirror
- 配置步骤与谷歌浏览器的相同。
- 输入
geckodriver --version
,验证是否配置成功。
在 python 中的使用
- 谷歌浏览器演示
# 导入selenium 包
from selenium import webdriver
# 创建一个 Chromdriver 的实例。Chrome()会从环境变量中寻找浏览器驱动
driver = webdriver.Chrome()
# 打开网址
driver.get("https://www.baidu.com/")
# 关闭driver
driver.quit()
SeleniumIDE的下载以及安装
- 官网:https://www.selenium.dev/
- Chrome插件:https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd
- Firefox插件:Selenium IDE – Get this Extension for 🦊 Firefox (en-US)
- github release:Releases · SeleniumHQ/selenium-ide · GitHub
- 其它版本:Selenium IDE version history - 1 version – Add-ons for Firefox (en-GB) 注意:Chrome插件在国内无法下载,Firefox可以直接下载。
启动
- 安装完成后,通过在浏览器的菜单栏中点击它的图标来启动它:
- 如果没看到图标,首先确保是否安装了Selenium IDE扩展插件
- 通过以下链接访问所有插件
- Chrome: chrome://extensions
- Firefox: about:addons
eleniumIDE常用功能
- 新建、保存、打开
- 开始和停止录制
- 运行8中的所有的实例
- 运行单个实例
- 调试模式
- 调整案例的运行速度
- 要录制的网址
- 实例列表
- 动作、目标、值
- 对单条命令的解释
- 运行日志
其他常用功能
- 用例管理
- 保存和回放
SeleniumIDE脚本导出
- Java
- Python
标准的用例结构
- 用例标题
- 前提条件
- 用例步骤
- 预期结果
- 实际结果
用例标题 | 类型 | 前提条件 | 用例步骤 | 预期结果 | 实际结果 |
---|---|---|---|---|---|
搜狗搜索功能 | 正例 | 进入搜狗首页 | 1. 输入搜索关键词 | ||
2.按下回车键 | 1. 搜索成功 |
- 搜索结果列表包含关键字||
用例结构对比
自动化测试用例 | 作用 | |
---|---|---|
用例标题 | 测试包、文件、类、方法名称 | 用例的唯一标识 |
前提条件 | setup、setup_class(Pytest); | |
BeforeEach、BeforeAll(JUnit) | 测试用例前的准备动作,比如读取数据或者driver的初始化 | |
用例步骤 | 测试方法内的代码逻辑 | 测试用例具体的步骤行为 |
预期结果 | assert 实际结果 == 预期结果 | 断言,印证用例是否执行成功 |
实际结果 | assert 实际结果 == 预期结果 | 断言,印证用例是否执行成功 |
后置动作 | teardown、teardown_class(Pytest); 脏数据清理、关闭driver进程 | |
@AfterEach、@AfterAll(JUnit) |
1、Python3 使用 pip install -U pytest 安装
2、查看 pytest 版本信息 pytest --version
import pytest
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
class TestDemo01():
def setup_method(self, method):
# 实例化chromedriver
self.driver = webdriver.Chrome()
# 添加全局隐式等待
self.driver.implicitly_wait(5)
def teardown_method(self, method):
# 关闭driver
self.driver.quit()
def test_demo01(self):
# 访问网站
self.driver.get(“https://www.baidu.com/”)
# 设置窗口
self.driver.set_window_size(1330, 718)
# 点击输入框
self.driver.find_element(By.ID, “kw”).click()
# 输入框输入信息
self.driver.find_element(By.ID, “kw”).send_keys(“霍格沃兹测试开发”)
# 点击搜索按钮
self.driver.find_element(By.ID, “su”).click()
# 等待界面加载
time.sleep(5)
# 元素定位后获取文本信息
res = self.driver.find_element(By.XPATH,“//*[@id=‘1’]/h3/a”).get_attribute(“text”)
# 打印文本信息
print(res)
# 添加断言
assert “霍格沃兹测试开发” in res
# 查看界面展示
time.sleep(5)
pom依赖(Java)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>beginner</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>11</java.version>
<!-- 使用 Java 11 语言特性 ( -source 11 ) 并且还希望编译后的类与 JVM 11 ( -target 11 )兼容,您可以添加以下两个属性,它们是默认属性插件参数的名称-->
<maven.compiler.target>11</maven.compiler.target>
<!-- 对应junit Jupiter的版本号;放在这里就不需要在每个依赖里面写版本号,导致对应版本号会冲突-->
<junit.jupiter.version>5.8.2</junit.jupiter.version>
<maven.compiler.version>3.8.1</maven.compiler.version>
<maven.surefire.version>3.0.0-M5</maven.surefire.version>
<hamcrest.version>2.2</hamcrest.version>
<!-- plugins -->
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
<!-- log日志 -->
<slf4j.version>2.0.0-alpha7</slf4j.version>
<logback.version>1.3.0-alpha16</logback.version>
</properties>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
</dependencies>
<build>
<!-- maven 运行的依赖插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<parameters>true</parameters>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M7</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
</project>
脚本优化(Java)
- 隐式等待(了解即可)
- 断言信息
// Generated by Selenium IDE
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Alert;
import org.openqa.selenium.Keys;
import java.time.Duration;
import java.util.*;
import java.net.MalformedURLException;
import java.net.URL;
import static org.junit.Assert.assertEquals;
public class TestSogouTest {
private WebDriver driver;
private Map<String, Object> vars;
JavascriptExecutor js;
@Before
public void setUp() {
// 实例化chromedriver
driver = new ChromeDriver();
// 添加全局隐式等待
js = (JavascriptExecutor) driver;
vars = new HashMap<String, Object>();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
}
@After
// 关闭driver
public void tearDown() {
driver.quit();
}
@Test
public void testSogou() {
// 打开网页
driver.get("https://www.sogou.com/");
// 设置窗口
driver.manage().window().setSize(new Dimension(1671, 1417));
// 输入霍格沃兹测试开发
driver.findElement(By.id("query")).sendKeys("霍格沃兹测试开发");
// 回车搜索
driver.findElement(By.id("query")).sendKeys(Keys.ENTER);
// 获取搜索的文本结果
String text = driver.findElement(By.cssSelector("#sogou_vr_30000000_0 > em")).getText();
// 断言是否包含期望文本
assertEquals("霍格沃兹测试开发", text);
}
}