如何开展自动化测试框架的构建?
1. 确定测试框架类型
首先,需要根据项目的复杂性和需求选择合适的测试框架类型。例如,线性测试框架适用于简单应用程序的测试,而模块化测试框架更适合测试复杂应用中不同部分之间的相互作用和依赖关系。
2. 分析项目需求和目标
分析项目需求和目标,明确自动化测试框架需要达成的具体目标,如提高测试效率、减少返工问题等。
3. 选择技术栈
选择适合项目的技术栈,例如结合Appium和TestNG构建移动应用的自动化测试框架。技术选型应充分考虑现有工具的功能,避免重复开发,以减少成本。
4. 设计框架架构
设计框架的架构,确保其易扩展、稳定,并能够有效地管理测试项目。一个理想的自动化测试框架应包括:
- 综合管理平台:作为统一入口,管理自动化测试中的所有工作内容。
- 集成开发环境:基于业务驱动的脚本开发,建立对象库,减少软件需求变化对脚本的影响。
- 自动化测试执行环境:配置好运行的虚拟机,以及自动化测试工具。
5. 开发和集成
在选定的技术栈上开发框架,集成所需的工具和功能,如版本控制、持续集成、测试用例数据管理、测试报告生成等。
6. 编写测试脚本
根据测试需求编写测试脚本,确保测试脚本的复用性和可维护性。测试脚本应能够处理测试数据的准备和转换,以及测试结果的分析。
7. 测试和优化
在开发过程中不断进行测试,确保框架的稳定性和可用性。根据测试结果对框架进行优化,提高自动化测试的效率和准确性。
8. 建立文档和培训
编写框架的文档,为团队成员提供操作指南。必要时进行培训,确保团队熟悉框架的使用。
9. 持续维护和升级
随着项目的发展,持续维护和升级测试框架,确保其始终满足项目需求。
构建自动化测试框架是一个系统的过程,需要充分考虑项目特点、团队技能和资源,以及未来可能的需求变化。通过以上步骤,可以搭建起一个高效、稳定的自动化测试框架,为软件质量的提升提供有力保障。
如何设计自动化测试用例?
1. 确定测试目标:
首先明确自动化测试要覆盖的功能点和需求,确保测试用例能够有效地验证这些功能点和需求。
2. 分析需求和功能:
深入了解软件的需求和功能,以便设计出更全面、有效的测试用例。这包括正常情况和异常情况的测试。
3. 制定测试策略:
确定自动化测试的范围、方法和工具。例如,可以采用单元测试、集成测试、系统测试等不同层次的测试方法。
4. 编写测试用例:
根据测试目标和策略,编写详细的测试用例。测试用例应包括测试目的、测试输入、操作步骤、预期结果等。
5. 设计测试数据:
为测试用例准备合适的测试数据,包括正常数据和异常数据。测试数据可以来源于现有数据、随机生成或特定场景下的数据。
6. 选择自动化测试工具:
根据项目需求和技术栈,选择适合的自动化测试工具,如Selenium、JMeter等。
7. 编写自动化测试脚本:
使用选择的自动化测试工具,编写测试脚本。测试脚本应能够执行测试用例、处理测试数据并生成测试报告。
8. 执行测试用例:
在自动化测试环境中执行测试用例,收集测试结果。
9. 分析测试结果:
分析测试结果,找出软件中的缺陷和问题,为软件质量的提升提供依据。
10. 优化测试用例:
根据测试结果和分析,优化测试用例,提高自动化测试的效率和准确性。
总之,设计自动化测试用例需要充分考虑软件的需求、功能和特点,以及自动化测试的目标、方法和工具。通过以上步骤,可以设计出全面、有效的自动化测试用例,为软件质量的保障提供有力支持。
WebDriver 如何开启和退出一个浏览器?
WebDriver 是一个用于自动化测试的工具,可以模拟用户操作来控制浏览器。
1. 开启浏览器:
要开启一个浏览器,首先需要创建一个 WebDriver 实例,并将其与相应的浏览器驱动程序关联。以下是一些常见浏览器的示例:
python
from selenium import webdriver
# 开启 Chrome 浏览器
driver = webdriver.Chrome()
# 开启 Firefox 浏览器
driver = webdriver.Firefox()
# 开启 Internet Explorer 浏览器
driver = webdriver.Ie()
2. 退出浏览器:
要退出浏览器,可以使用 WebDriver 的 `quit()` 方法。这将关闭浏览器并退出 WebDriver 会话。例如:
python
driver.quit()
注意:在某些情况下,可能需要先关闭当前窗口,然后再退出浏览器。可以使用 `close()` 方法关闭当前窗口,但不会退出 WebDriver 会话。例如:
python
driver.close()
总结:
要开启一个浏览器,需要创建一个 WebDriver 实例,并将其与相应的浏览器驱动程序关联。要退出浏览器,可以使用 `quit()` 方法关闭浏览器并退出 WebDriver 会话。在某些情况下,可能需要先关闭当前窗口,然后再退出浏览器,可以使用 `close()` 方法关闭当前窗口。
什么是自动化测试框架?
自动化测试框架是一种软件工具,用于支持自动化测试的执行、管理和报告。它提供了一组测试工具、库和接口,帮助测试人员快速创建、执行和管理自动化测试用例。自动化测试框架的主要目标是提高测试效率、降低测试成本、提高测试覆盖率,并确保软件质量。
自动化测试框架通常具有以下特点:
1. 支持多种编程语言和测试工具:
为了适应不同的测试需求,自动化测试框架通常支持多种编程语言(如Java、Python、C#等)和测试工具(如Selenium、QTP等)。
2. 提供丰富的测试库和接口:
自动化测试框架提供丰富的测试库和接口,帮助测试人员快速创建和执行测试用例,提高测试效率。
3. 支持测试用例的重复利用:
自动化测试框架支持测试用例的重复利用,可以减少测试人员的工作量,并确保测试的一致性和准确性。
4. 提供测试报告和管理功能:
自动化测试框架可以生成详细的测试报告,帮助测试人员和管理人员了解测试进度、测试覆盖率、缺陷情况等信息,以便更好地管理和控制测试过程。
5. 支持分布式测试:
自动化测试框架支持分布式测试,可以在多台机器上同时执行测试用例,提高测试效率。
常见的自动化测试框架有Selenium、QTP、JMeter等。这些框架可以帮助测试人员快速创建和执行自动化测试用例,提高软件质量和开发效率。
Selenium是什么,流行的版本有哪些?
Selenium是一款用于Web应用程序测试的自动化测试工具。它可以模拟用户操作,实现对浏览器的各种操作,如点击、输入、滚动等,以测试Web应用程序在各种浏览器和操作系统上的兼容性、功能及性能。
Selenium目前有两个主要版本:
1. Selenium 1.x:
核心组件是Selenium RC(Remote Control),使用具体的编程语言(如Java、Python、C#等)来编写测试脚本。Selenium 1.x支持多种浏览器,如IE、Firefox、Safari、Chrome和Opera等。
2. Selenium 2.x:
核心组件是WebDriver,它是一种浏览器自动化测试工具,与Selenium RC相比,WebDriver更加简单、易用。Selenium 2.x同样支持多种浏览器,包括IE、Firefox、Safari、Chrome和Opera等。
注意:Selenium 1.x和Selenium 2.x在功能和实现上有较大差异,它们完全是两套不同的东西。然而,Selenium 3.x与Selenium 2.x在本质上没有太大变化,主要是增加了对更多浏览器的支持以及更新了操作系统和开发语言的版本。
总的来说,Selenium是一个用于Web应用程序测试的自动化测试工具,有两个主要版本:Selenium 1.x(核心组件为Selenium RC)和Selenium 2.x(核心组件为WebDriver)。
你如何从命令行启动Selenium RC?
要从命令行启动Selenium RC,首先需要确保已经正确安装了Selenium RC以及对应的浏览器驱动程序。然后,可以按照以下步骤进行操作:
-
打开命令行窗口(在Windows系统中是CMD,在Linux和Mac系统中是Terminal)。
-
切换到Selenium RC安装目录下的bin目录。例如,如果Selenium RC安装在C盘的selenium目录下,可以输入以下命令:
python
cd C:\selenium\bin
- 在命令行中输入以下命令来启动Selenium RC:
python
java -jar selenium-server.jar
这将会启动Selenium RC服务,并在命令行窗口中显示一些启动信息。
- 如果需要指定Selenium RC的端口号,可以添加`-port`参数。例如,要设置端口号为8080,可以输入以下命令:
python
java -jar selenium-server.jar -port 8080
- 如果需要指定其他参数,可以在命令行中添加相应的参数。例如,要使用Firefox浏览器启动Selenium RC,可以添加`-browser`参数:
python
java -jar selenium-server.jar -browser firefox
以上就是从命令行启动Selenium RC的步骤。启动后,Selenium RC将监听指定的端口号,等待与客户端的连接。
在我的机器端口4444不是免费的。我怎样才能使用另一个端口?
如果您希望使用一个不同的端口来运行Selenium RC,您可以在命令行中添加`-port`参数并指定您希望使用的端口号。例如,如果您希望使用端口5555,您可以运行以下命令:
python
java -jar selenium-server.jar -port 5555
这将启动Selenium RC并监听端口5555。然后,您可以在您的测试脚本中指定新的端口号来连接到Selenium RC。请确保在运行此命令时,所指定的端口号在您的机器上是可用的。
什么是Selenium Server?它与Selenium Hub有什么不同?
Selenium Server和Selenium Hub都是Selenium框架中的组件,它们在自动化测试中发挥着不同的作用。
下面分别介绍它们的功能和区别:
1. Selenium Server:
Selenium Server是Selenium框架的核心组件之一,负责启动和管理浏览器实例。当您在测试脚本中调用Selenium时,Selenium Server将根据您配置的浏览器类型和版本启动相应的浏览器实例,然后在测试过程中控制这些浏览器实例。Selenium Server可以独立运行在测试机器上,也可以作为节点(Node)加入到Selenium Hub管理的测试集群中。
2. Selenium Hub:
Selenium Hub是Selenium框架的另一个组件,负责管理测试节点(Node)和分配测试任务。在一个大型测试项目中,可能需要在多台机器上同时执行测试用例,此时可以使用Selenium Hub来管理和分配测试任务。Selenium Hub将测试任务分配给可用的测试节点,确保测试资源得到合理利用。Selenium Hub还可以提供测试结果的汇总和报告,方便测试人员监控整个测试过程。
总结:
Selenium Server负责启动和管理浏览器实例,用于执行自动化测试。它可以独立运行,也可以作为节点加入Selenium Hub管理的测试集群。而Selenium Hub负责管理测试节点和分配测试任务,适用于大型测试项目,可以确保测试资源得到合理利用,并提供测试结果的汇总和报告。
你如何从Selenium连接到数据库?
要从Selenium连接到数据库,首先需要确保已经安装并配置了数据库驱动程序(如MySQL Connector/Python、SQLite等)。然后,可以使用Python编写一个连接数据库的脚本。
以下是一个使用Python和Selenium连接MySQL数据库的示例:
- 安装MySQL Connector/Python:
python
pip install mysql-connector-python
- 创建一个Python脚本(如:connect_to_database.py),并输入以下代码:
python
import mysql.connector
from selenium import webdriver
# 数据库连接参数
db_config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'your_database'
}
# Selenium WebDriver初始化
driver = webdriver.Chrome()
# 连接到数据库
def connect_to_database():
try:
# 使用mysql-connector-python连接到数据库
connection = mysql.connector.connect(**db_config)
print("Connected to the database")
return connection
except mysql.connector.Error as e:
print("Error while connecting to MySQL", e)
return None
# 在Selenium测试脚本中调用connect_to_database函数
connection = connect_to_database()
# 在这里执行数据库操作
# ...
# 关闭数据库连接
if connection:
connection.close()
# 关闭Selenium WebDriver
driver.quit()
- 在Selenium测试脚本中调用connect_to_database.py脚本来连接到数据库。
首先,确保已经启动了MySQL服务,并按照上述示例中的代码替换相应的数据库连接参数。然后,在Selenium测试脚本中,通过调用connect_to_database.py脚本,即可实现Selenium与数据库的连接。
注意:在实际项目中,建议将数据库连接配置和操作封装到一个独立的模块中,以便在Selenium测试脚本中重复使用。同时,为了确保数据库的安全性和稳定性,建议使用异常处理和事务控制。
你如何验证多个页面上存在的一个对象?
要验证多个页面上存在的一个对象,可以使用Selenium的WebDriver来模拟用户操作,逐一打开这些页面并查找目标对象。
以下是一个使用Python和Selenium验证多个页面上存在的一个对象的示例:
python
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建一个Chrome WebDriver实例
driver = webdriver.Chrome()
# 打开第一个页面
driver.get("https://www.example1.com")
# 查找并验证目标对象是否存在
target_object = driver.find_element(By.ID, "target_object_id")
if target_object:
print("目标对象在第一个页面存在")
else:
print("目标对象在第一个页面不存在")
# 打开第二个页面
driver.get("https://www.example2.com")
# 查找并验证目标对象是否存在
target_object = driver.find_element(By.ID, "target_object_id")
if target_object:
print("目标对象在第二个页面存在")
else:
print("目标对象在第二个页面不存在")
# 关闭浏览器
driver.quit()
在上面的示例中,我们首先创建了一个Chrome WebDriver实例,然后分别打开两个页面(https://www.example1.com 和 https://www.example2.com),并在每个页面上查找具有特定ID("target_object_id")的目标对象。根据查找结果,我们可以验证目标对象是否存在于这些页面中。
注意:在上面的示例中,我们使用了ID定位策略(By.ID)来查找目标对象。在实际应用中,您可以根据实际情况选择合适的定位策略,如Name、XPath等。
XPath中使用单斜杠和双斜杠有什么区别?
XPath中单斜杠(/)和双斜杠(//)的主要区别在于它们在查找节点时的起始位置和返回结果。
1. 单斜杠(/):
单斜杠用于从根节点开始查找指定路径的节点。例如,如果要在XML结构中查找所有的子节点,可以使用)/子节点的方式。单斜杠在查找时不会返回重复的节点,只会返回第一次匹配到的节点。
2. 双斜杠(//):
双斜杠用于从当前节点开始查找指定路径的节点,而不管当前节点在XML结构中的位置。例如,如果要在XML结构中查找所有的子节点,可以使用//子节点的方式。双斜杠在查找时会返回所有匹配到的节点,包括重复的节点。
总结一下,单斜杠和双斜杠在XPath中的区别主要表现在查找的起始位置和返回结果上。单斜杠从根节点开始查找,返回第一次匹配到的节点;而双斜杠从当前节点开始查找,返回所有匹配到的节点。
如何编写SeleniumIDE/RC的用户扩展?
要编写Selenium IDE/RC的用户扩展,您需要了解一些基本概念,如JavaScript、HTML和CSS。Selenium IDE/RC的用户扩展通常以HTML文件的形式存在,其中包含了JavaScript代码来执行特定的操作。
以下是一个简单的示例,展示了如何编写一个用户扩展:
1. 创建一个新的HTML文件(如:my_extension.html),然后在该文件中添加以下代码:
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My Extension</title>
<style>
body {
font-family: Arial, sans-serif;
}
#myExtension {
width: 200px;
height: 100px;
background-color: #f0f0f0;
border: 1px solid #ccc;
padding: 10px;
margin: 10px;
}
</style>
</head>
<body>
<div id="myExtension">
<h3>My Extension</h3>
<button id="myButton">Click Me</button>
<p id="myParagraph"></p>
</div>
<script>
// JavaScript代码
document.getElementById("myButton").addEventListener("click", function() {
document.getElementById("myParagraph").innerHTML = "Button clicked!";
});
</script>
</body>
</html>
在这个示例中,我们创建了一个简单的用户扩展,它包含一个标题("My Extension"),一个按钮("Click Me")和一个段落("Button clicked!")。当用户点击按钮时,JavaScript代码会将段落的文本更改为"Button clicked!"。
2. 将my_extension.html文件保存到Selenium IDE/RC的扩展目录下。
对于Selenium IDE,扩展目录位于用户的主目录下的.seleniumide/extensions文件夹。例如,在Windows系统上,扩展目录的路径可能类似于C:\Users\YourUsername\.seleniumide\extensions。
对于Selenium RC,扩展目录位于Selenium Server的安装目录下的extensions文件夹。例如,在Windows系统上,扩展目录的路径可能类似于C:\Program Files (x86)\Selenium Server\extensions。
3. 在Selenium IDE/RC中启用用户扩展。
对于Selenium IDE,您需要重新启动Selenium IDE以加载新添加的扩展。然后,在Selenium IDE中,您可以通过点击"Tools"菜单中的"Extensions"选项来管理您的扩展。
对于Selenium RC,您需要重新启动Selenium Server以加载新添加的扩展。然后,在Selenium RC中,您可以通过在命令行中添加`-load`参数并指定扩展的路径来启用您的扩展。例如,如果您要将my_extension.html扩展添加到Selenium RC,您可以运行以下命令:
html
java -jar selenium-server.jar -load /path/to/my_extension.html
请确保将`/path/to/my_extension.html`替换为实际的扩展文件路径。
现在,您已经成功编写并启用了Selenium IDE/RC的用户扩展。您可以在Selenium IDE/RC中创建新的测试脚本,然后在测试脚本中调用您扩展中的功能。
如何在页面加载成功后验证元素的存在?
在页面加载成功后验证元素的存在,可以使用Selenium的WebDriverWait和expected_conditions来实现。
以下是一个使用Python和Selenium在页面加载成功后验证元素存在的示例:
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 创建一个Chrome WebDriver实例
driver = webdriver.Chrome()
# 打开目标页面
driver.get("https://www.example.com")
# 使用WebDriverWait和expected_conditions等待元素加载成功
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))
# 验证元素是否存在
if element:
print("元素存在")
else:
print("元素不存在")
# 关闭浏览器
driver.quit()
在上面的示例中,我们首先创建了一个Chrome WebDriver实例,然后打开目标页面。接下来,我们使用WebDriverWait和expected_conditions等待具有特定ID("element_id")的元素加载成功。如果元素存在,则打印"元素存在",否则打印"元素不存在"。最后,我们关闭浏览器。
注意:在上面的示例中,我们使用了ID定位策略(By.ID)来查找目标元素。在实际应用中,您可以根据实际情况选择合适的定位策略,如Name、XPath等。此外,还可以根据需要调整等待时间(例如,将等待时间设置为10秒,如WebDriverWait(driver, 10))。
你对Selenium Grid有什么了解?它提供了什么功能?
Selenium Grid是Selenium的一个组件,主要用于在不同浏览器、操作系统和机器上并行运行测试。它采用hub-nodes结构,您可以在hub上启动测试,测试将在不同的机器node上执行。Selenium Grid的主要目的是提高测试效率,节省测试时间,并解决浏览器兼容性问题
Selenium Grid提供以下功能:
1. 分布式执行测试:
Selenium Grid可以在多台计算机上并行运行测试用例,从而提高执行效率。例如,如果有1000条用例需要执行,如果在本机执行,一条用例耗时100秒,执行完成则需要大约27小时。如果让这些用例并发执行,比如分配6台计算机,每个计算机执行1000/6大约166条用例,那时间大约节省了6倍,原来需要大约27个小时,现在可能只需要4.5个小时左右就基本完成了。
2. 集中管理不同的浏览器版本和浏览器配置:
Selenium Grid允许您在多个浏览器版本和配置上运行测试,从而确保测试的兼容性。
3. 在不同浏览器、操作系统和机器上并行运行测试:
Selenium Grid可以在不同的操作系统(如Linux、Windows、Mac等)和浏览器(如Chrome、Firefox、Edge、Safari等)上运行测试,从而确保测试的全面性和准确性。
4. 解决浏览器兼容性问题:
通过Selenium Grid,您可以在不同的浏览器和操作系统上运行测试,从而发现并解决浏览器兼容性问题。
5. 灵活的任务分发:
Selenium Grid可以根据测试用例的特点和需求,将任务分发到不同的节点上执行,从而提高测试效率。
总之,Selenium Grid是一个强大的测试工具,可以帮助您提高测试效率,节省测试时间,并解决浏览器兼容性问题。
如何从你的Java Class启动Selenium服务器?
要从 Java Class 启动 Selenium 服务器,首先需要确保已正确安装 Selenium Server,然后通过 Java 代码使用 Selenium Server 的 API 来启动服务器。
以下是一个简单的示例,展示了如何从 Java Class 启动 Selenium 服务器:
-
首先,确保已正确安装 Selenium Server。你可以从 Selenium 官网下载最新版本的 Selenium Server:https://www.selenium.dev/documentation/en/software/releases/
-
然后,将下载的 Selenium Server 解压到你喜欢的目录,例如:C:\selenium-server-4.1.2\。
-
在 Java Class 中,添加以下代码来启动 Selenium 服务器:
java
import org.openqa.grid.selenium.GridLauncher;
import org.openqa.grid.selenium.GridServer;
public class SeleniumServer {
public static void main(String[] args) {
// 设置 Selenium Server 的安装目录
String seleniumServerInstallDir = "C:\\selenium-server-4.1.2\\";
// 使用 GridLauncher 启动 Selenium 服务器
GridLauncher gridLauncher = new GridLauncher(seleniumServerInstallDir);
GridServer gridServer = gridLauncher.launch();
// 输出 Selenium 服务器的日志
System.out.println("Selenium 服务器已启动,日志如下:");
gridServer.log().forEach(System.out::println);
}
}
在这个示例中,我们首先设置了 Selenium Server 的安装目录(C:\selenium-server-4.1.2\)。然后,使用 GridLauncher 启动 Selenium 服务器,并输出服务器的日志。
- 将上述代码保存到一个名为 SeleniumServer.java 的文件中,并使用 Java 编译器编译运行该文件:
java
javac SeleniumServer.java
java SeleniumServer
运行后,如果看到控制台输出了 Selenium 服务器的日志,说明 Selenium 服务器已成功启动。
现在,你已从 Java Class 成功启动了 Selenium 服务器。接下来,你可以在 Java 代码中使用 Selenium WebDriver 来编写和执行自动化测试。
Selenium中有哪些验证点?
Selenium是一个自动化测试工具,它可以用来模拟用户的行为,来自动化浏览器的操作。在Selenium中,验证点通常是指我们期望测试的特定功能或行为。
以下是一些常见的Selenium验证点:
1. 页面元素是否存在:
我们可以验证页面上的特定元素是否存在,比如按钮、文本框、链接等。
2. 元素属性的值是否正确:
我们可以验证页面元素的属性值是否与我们期望的一致,比如链接的href属性、按钮的text属性等。
3. 页面布局是否正确:
我们可以验证页面的布局是否正确,比如页面上的元素是否按照正确的顺序排列。
4. 页面是否响应鼠标和键盘事件:
我们可以验证页面上的元素是否能够响应用户的鼠标和键盘操作,比如点击按钮、输入文本等。
5. 页面是否能够处理表单提交:
我们可以验证页面的表单提交功能是否正常工作,比如提交后页面是否跳转到了正确的页面。
6. 页面是否能够处理AJAX请求:
我们可以验证页面的AJAX功能是否正常工作,比如页面上的动态内容是否能够正确加载。
以上是一些常见的Selenium验证点,实际上,Selenium可以用来验证页面的任何功能和行为。
什么是XPath?什么时候应该在Selenium中使用XPath?
XPath(XML Path Language)是一种在XML文档中查找信息的语言,它用于在XML文档中对元素和属性进行遍历。XPath基于XML文档的树结构,并提供了浏览树的能力,通过多样的标准来选择节点。它被广泛应用于Selenium自动化测试中,用于定位页面元素。
在以下情况下,您应该在Selenium中使用XPath:
1. 当页面元素没有唯一的id或name属性时:
在这种情况下,可以使用XPath通过元素的其他属性或位置来定位元素。
2. 当需要定位一组具有相同属性或结构的元素时:
在这种情况下,可以使用XPath来定位这些元素,并进行进一步的操作。
3. 当需要定位表格内部的元素时:
XPath可以方便地定位表格行和列,以及表格中的具体元素。
4. 当需要定位具有非常规属性的元素时:
例如,当元素没有id或name属性,但具有其他唯一属性时,可以使用XPath来定位这些元素。
总之,当无法使用id、name等常规属性来定位页面元素时,可以考虑使用XPath在Selenium中定位元素。XPath具有强大的查询功能,可以方便地定位复杂的页面元素。