接上次博客:测试开发(5)测试分类标准 :按测试对像划分、按是否查看代码划分、按开发阶段划分、按测试实施组织、按是否运行划分、按是否手工划分、按测试地域划分-CSDN博客
目录
自动化测试是指利用自动化工具或脚本来执行测试活动的过程。它的主要目的是减少人工测试的工作量,提高测试的效率和准确性。自动化测试可以针对软件的不同方面进行,包括功能、性能、安全性、界面等,以确保软件的质量和稳定性。自动化测试通常涉及编写测试脚本、配置测试环境、执行测试、分析测试结果等步骤。相比手动测试,自动化测试具有更快的执行速度、更好的复用性、更高的覆盖率和更低的人力成本。
自动化测试是软件测试中的一项重要技术,旨在通过编写脚本或使用自动化测试工具来模拟用户的操作行为,以验证应用程序或系统的功能、性能和稳定性。它将人为驱动的测试行为转化为机器执行的过程,从而提高了测试的效率和准确性。
在自动化测试中,通常会涉及到不同层次的测试,包括UI自动化、接口自动化和单元测试自动化。UI自动化测试主要用于测试应用程序的用户界面,模拟用户与界面进行交互的过程,以验证界面的功能和用户体验。接口自动化测试则是针对应用程序的接口或服务进行测试,验证接口的正确性和可靠性。而单元测试自动化则是针对代码的最小单元进行测试,通常在开发阶段使用,用于验证代码的逻辑正确性和功能完整性。
金字塔模型是一种常用的自动化测试规划方法,它将不同层次的测试按照数量和投入比例划分成金字塔形状,底部是单元测试,中间是接口测试,顶部是UI测试。这种规划方式能够确保在保证测试覆盖全面的同时,尽量减少投入,提高测试的效率和质量。通过合理规划和执行自动化测试,可以有效降低测试成本,提高软件质量,加速软件发布的速度,从而实现更好的自动化测试产出投入比(ROI)。

单元测试是软件开发中至关重要的一环,其投入应该占据测试工作的主要部分。由于单元测试是针对代码中最小的可测试单元进行的,因此它的运行频率通常也会更高。
在Java领域,Junit是一种常用的单元测试框架,它为开发人员提供了一种简单而有效的方式来编写和执行单元测试。通过Junit,开发人员可以快速编写测试用例,并在代码发生变化时轻松地运行测试,确保代码的正确性和稳定性。
接口自动化测试,也称为API测试,是针对应用程序接口进行的自动化测试。相对于UI自动化,API自动化更容易实现,执行起来也更加稳定。接口自动化测试具有以下特点:
可在产品前期介入:接口自动化测试可以在产品开发的早期阶段介入,甚至在接口完成后即可开始。这使得团队可以及早发现接口问题,从而更早地解决和修复。
用例维护量小:由于接口的稳定性较高,且接口变动相对较小,因此接口自动化测试的用例维护量通常较少。这意味着团队可以更轻松地维护和更新测试用例,降低了测试的成本和工作量。
适合变动小的项目:接口自动化测试特别适用于那些接口变动较小,但界面变动频繁的项目。通过自动化测试,团队可以更快速地验证接口的正确性和可靠性,确保应用程序的稳定性和质量。
常见的接口自动化测试工具包括RobotFramework、JMeter、SoapUI、TestNG+HttpClient、Postman等。这些工具提供了丰富的功能和灵活的使用方式,可以满足不同项目的测试需求。通过选择合适的工具和策略,团队可以提高测试效率,加速软件开发过程,同时确保应用程序的质量和稳定性。
UI自动化测试是针对用户界面(UI)进行的自动化测试,尽管测试金字塔告诉我们应尽量多做API层的自动化测试,但UI层的自动化测试仍然具有其独特的价值。与API测试相比,UI自动化测试更贴近用户的需求和软件系统的实际业务,因此在某些情况下,我们不得不进行UI层的测试。
UI自动化测试的特点包括:
用例维护量大:由于UI自动化测试通常涉及到页面元素的操作和验证,因此测试用例的维护量往往较大。页面结构的变化或功能的更新都可能导致大量的测试用例需要进行调整和更新,这对于测试团队来说是一个挑战。
页面相关性强:UI自动化测试与具体的页面密切相关,因此通常需要在项目的后期阶段,即项目页面开发完成后才能进行介入。在页面开发过程中,可能会有不断的修改和调整,这可能会影响到已编写的UI自动化测试用例,增加了测试工作的复杂性。
适合界面变动较小的项目:虽然UI自动化测试对页面的变动敏感,但仍适用于那些界面变动较小的项目。对于那些页面结构和功能变动频繁的项目,UI自动化测试的维护成本可能会较高,因此需要仔细评估是否值得进行UI自动化测试。
UI自动化测试带来了许多好处,其中一些主要好处有:
降低回归测试的人力投入:针对大型系统的UI自动化测试能够降低由于变更或多期开发引起的大量回归测试的人力投入。虽然自动化测试在前期需要较多的人力投入,但在后期维护阶段,可以显著节省人力资源,而手工测试在后期需要增加大量人力用于回归测试。
减少重复测试的时间:UI自动化测试可以快速执行大量的重复测试,从而实现快速回归测试。这使得在软件开发周期中的迭代过程中,可以更快速地发现和修复问题。
创建优良可靠的测试过程:通过UI自动化测试,可以建立可靠的测试过程,减少了人为错误的可能性。自动化测试的执行过程更加一致和可靠,不容易受到人为因素的影响。
执行更多更繁琐的测试:UI自动化测试可以执行更多更繁琐的测试,包括对大量输入组合的测试、多种操作场景的测试等。这些测试对于手工测试来说可能非常耗时和困难,但通过自动化测试可以轻松实现。
执行难以手工进行的测试:有些测试场景可能很难手工进行,例如对于性能测试、负载测试等,UI自动化测试可以更容易地实现这些测试,并且可以在不同环境和配置下进行测试。
更好地利用资源:UI自动化测试可以在非工作时间执行,充分利用计算机资源,从而提高了资源利用率。
测试脚本的重用性:编写的UI自动化测试脚本可以在不同的版本和环境下重复使用,节省了测试人员编写测试用例的时间,提高了测试的效率。
在UI层的测试中,有许多不同的测试框架可供选择。例如,针对Windows客户端测试可以使用AutoIT,对于Web测试则常用的有Selenium、TestPlant eggPlant、Robot Framework、QTP等。
在测试开发的讲解中,我主要以Web UI自动化测试框架Selenium为例进行详细介绍,因为Selenium具有以下优点:
免费且开源:Selenium是一个免费的开源工具,不需要为其付费,也无需担心使用非法软件破解带来的问题。这使得团队可以在没有额外成本的情况下进行自动化测试。
小巧简单:Selenium对于不同的编程语言来说只是一个包或库,相比之下,QTP需要下载安装一个体积较大的程序。Selenium的小巧简单使得它在安装和使用上更为便捷。
多语言支持:Selenium支持多种编程语言,包括C、Java、Ruby、Python、C#等。这意味着无论你之前对哪种编程语言更熟悉,你都可以通过Selenium完成自动化测试,而QTP只支持VBScript。
跨平台和多浏览器支持:Selenium支持多平台,包括Windows、Linux和Mac,同时也支持多种主流浏览器,如Internet Explorer、Firefox、Safari、Opera和Chrome等。这使得测试人员可以在不同的操作系统和浏览器环境下进行测试,确保应用程序的跨平台兼容性和浏览器兼容性。
支持分布式测试:Selenium支持将测试用例分布到不同的测试机器上执行,从而实现分布式测试。这使得测试可以更快地执行,同时也更容易进行横向扩展,以适应大规模测试的需求。
实施自动化测试的前提条件包括:
需求变动不频繁:自动化测试需要稳定的测试环境和稳定的需求,如果需求频繁变动,可能导致自动化测试脚本频繁失效,增加了维护成本。
项目周期足够长:自动化测试需要在项目的整个生命周期内发挥作用,如果项目周期太短,可能无法收回自动化测试所需的投入成本。
自动化测试脚本可重复使用:编写的自动化测试脚本需要具有高度的可重复使用性,能够适应不同版本的测试需求,并且能够在多次执行中保持稳定性。
适合做自动化测试的项目包括:
产品型项目:针对产品型项目,特别是那些功能相对稳定、需要频繁回归测试的项目,自动化测试非常适合。通过自动化回归测试可以有效验证新功能的引入是否导致了旧功能的故障,确保产品质量。
机械且频繁的测试:对于需要频繁重复相同操作的测试场景,比如兼容性测试或性能测试,自动化测试可以大大提高效率和准确性。
不适合做自动化测试的项目包括:
需求变动频繁的项目:如果项目需求频繁变动,导致自动化测试脚本频繁失效,维护成本会变得非常高,此时自动化测试的效果不佳。
项目周期短:如果项目周期太短,无法收回自动化测试所需的投入成本,自动化测试的效益将大打折扣。
交互型较强的项目:对于需要人工干预或者交互较强的项目,自动化测试难以实施。自动化测试更适合于机械化、重复性较强的测试任务。
实施自动化测试通常包括以下七个关键步骤:
分析:在这一阶段,需要对系统进行全面的分析,把握系统的核心体系架构和功能点。理解系统的逻辑结构和业务流程,确定自动化测试的重点和范围。
设计:设计测试用例是自动化测试的基础。在这一阶段,需要根据系统的需求和功能特性,设计出足够明确和清晰的测试用例。测试用例应该覆盖系统的各项功能,并且要考虑到不同的测试场景和边界条件。
实现:实现测试脚本是自动化测试的核心步骤。在这一阶段,根据设计好的测试用例,编写测试脚本,并且确保脚本具有合理的断言和参数化设置。断言用于验证测试结果的正确性,参数化可以提高测试脚本的灵活性和复用性。
执行:执行测试脚本是验证自动化测试效果的关键步骤。在这一阶段,需要执行编写好的测试脚本,并且监控脚本执行过程中的异常情况。对于出现的异常,需要及时分析原因并做出相应的调整。
总结:测试结果的分析和测试过程的总结对于优化自动化测试非常重要。在这一阶段,需要对测试结果进行深入分析,找出测试中存在的问题和改进的空间,并且总结测试过程中的经验教训。
维护:自动化测试脚本的维护是持续改进的过程。随着系统的变更和需求的更新,测试脚本也需要不断地进行维护和优化。在这一阶段,需要及时更新和调整测试脚本,确保其与系统保持同步。
分析:在自动化测试过程中,深刻分析自动化用例的覆盖风险和脚本维护的成本是至关重要的。通过对自动化测试的效果进行评估和分析,可以不断改进测试策略和优化测试流程,提高自动化测试的效率和可靠性。

自动化测试需要掌握以下技能:
了解被测试系统的基本业务:深入了解被测试系统的业务流程、功能模块和用户需求,对系统的业务逻辑有清晰的认识。
了解业务的技术框架:了解被测试系统所采用的技术框架,包括前端和后端的技术栈,对系统的架构和技术实现有一定的了解。
懂得功能测试:具备功能测试的基本知识,包括测试用例设计、执行和结果验证等方面的技能。
懂得一种编程语言:至少掌握一种编程语言,例如Java、Python、JavaScript等,用于编写自动化测试脚本和实现测试工具。
懂数据库、操作系统:了解数据库的基本操作和SQL语言,能够进行简单的数据库操作和查询;熟悉常见的操作系统,如Windows、Linux等。
了解常见的测试框架:熟悉常见的测试框架和工具,如JUnit、TestNG、Selenium、Appium等,了解它们的基本原理和使用方法。
掌握版本控制工具:熟悉使用版本控制工具如Git,能够进行代码版本管理和团队协作。
具备问题分析和解决能力:能够快速定位和解决自动化测试过程中遇到的问题和异常,包括脚本编写、环境配置、执行错误等。
良好的沟通和团队合作能力:与开发人员、产品经理等团队成员进行有效的沟通和协作,共同推进自动化测试工作的进展。
持续学习和改进的意识:保持对新技术和行业趋势的关注,不断学习和提升自己的技能水平,不断改进自动化测试流程和方法。
Selenium是一个用于Web应用程序的自动化测试框架,它基于UI,支持多平台、多浏览器和多种编程语言。在Selenium的发展历程中,早期的Selenium Remote Control(RC)已经被现在的WebDriver所取代,从某种程度上说,WebDriver可以被理解为Selenium 1.0和WebDriver的结合体,构成了现在的Selenium 2.0。一般来说,当我们谈论Selenium时,指的就是Selenium 2.0。
Selenium框架主要由三个组件组成:
Selenium IDE: Selenium IDE是一个用于Selenium测试的集成开发环境。它允许测试人员直接在浏览器中录制用户操作,并且可以回放、编辑和调试测试脚本。在调试过程中,可以逐步执行测试脚本或调整执行速度,并且可以查看底部的日志以查找错误信息。Selenium IDE还支持将录制的测试脚本导出为多种编程语言,如Java、C#、Python、Ruby等,以满足不同测试人员的需求。
WebDriver: Selenium WebDriver是Selenium 2.0的核心组件之一。相比Selenium RC,在WebDriver中运行JavaScript应用程序不会受到环境沙箱的限制。WebDriver可以针对不同的浏览器创建更强大、更稳定、跨平台的自动化测试脚本。它使用特定于语言的绑定(如Java、C#、Python、Ruby、Perl、JavaScript等)来驱动浏览器执行操作和验证Web元素。
Selenium Grid: Selenium Grid是一个服务器,用于管理多个浏览器实例的访问。它负责管理各个节点的注册和状态信息,允许在同一时刻在不同服务器上执行不同的测试脚本。Selenium Grid支持在多个计算机上并行执行测试,从而提高测试效率。它可以在不同的操作系统和浏览器上并行运行测试,并且可以通过分布式测试用例的执行来扩展测试覆盖范围。
Selenium 是一个用于自动化 Web 应用程序测试的工具,它提供了一组工具和库,允许开发者模拟用户在浏览器中的操作,如点击链接、填写表单、提交数据等。其原理可以简要概括如下:
WebDriver 接口:WebDriver 接口是 Selenium 的核心。它定义了一系列用于控制浏览器行为的方法,如打开 URL、查找元素、模拟用户操作等。不同的浏览器都有对应的 WebDriver 实现,比如 ChromeDriver、FirefoxDriver 等。
浏览器驱动:每个 WebDriver 都是与特定浏览器版本兼容的驱动程序,用于与浏览器通信。这些驱动程序负责启动浏览器、加载页面、执行用户操作,并将结果返回给测试脚本。
定位元素:Selenium 允许通过各种方式定位 HTML 页面上的元素,如通过 ID、类名、标签名、CSS 选择器、XPath 等。这些方法可以精确定位到页面中的元素,以便进行后续操作。
模拟用户操作:一旦定位到页面上的元素,Selenium 可以模拟各种用户操作,如点击链接、填写表单、提交数据等。这些操作会触发页面上的相应事件,从而使页面的行为与用户交互一致。
获取页面状态:Selenium 还可以获取页面的状态信息,如页面标题、URL、元素属性等。这些信息可以用于验证页面行为是否符合预期。
断言和验证:测试人员可以使用断言和验证机制来验证页面的行为是否符合预期。如果页面上的某个元素存在、文本匹配、URL 包含特定内容等,测试就会通过,否则就会失败。
总的来说,Selenium 的原理就是利用 WebDriver 接口与浏览器进行通信,定位页面元素并模拟用户操作,最终验证页面行为是否符合预期。这使得开发者能够自动化执行各种 Web 应用程序的测试,提高了测试效率和质量。

WebDriver的工作原理如下:
启动浏览器:首先,测试脚本会通过Selenium WebDriver启动目标浏览器。一旦浏览器启动,它将作为WebDriver的远程服务器运行,等待接收命令。
绑定到特定端口:Selenium WebDriver会将目标浏览器绑定到特定的端口,以便在远程服务器上进行通信和控制。
客户端发送请求:测试脚本(即客户端)借助CommandExecutor发送HTTP请求给远程服务器(即WebDriver的remote server)。这些请求遵循WebDriver Wire协议,在HTTP请求的body中以JSON格式的字符串指定要执行的操作。
远程服务器处理请求:远程服务器接收到来自客户端的请求后,会依赖于原生的浏览器组件,将WebDriver Wire协议中定义的命令转化为浏览器原生的调用。这些调用会直接操作浏览器,完成相应的操作,如点击按钮、输入文本等。
操作浏览器:浏览器接收到来自远程服务器的命令后,会执行相应的操作,如点击链接、填写表单等。所有这些操作都是通过WebDriver的控制来实现的,浏览器本身不会与测试脚本直接通信。
返回执行结果:浏览器执行完命令后,将执行结果返回给远程服务器,然后远程服务器再将结果返回给测试脚本。这样,测试脚本就可以获取到浏览器执行操作的结果,从而进行后续的断言或其他操作。

Selenium是广泛应用的Web自动化测试工具,有以下几个主要原因:
跨平台性: Selenium支持多种操作系统(如Windows、Mac和Linux)和多种浏览器(如Chrome、Firefox、Edge等),使得测试工程师可以在不同的环境下开展测试工作。
开源免费: Selenium是开源的软件测试工具,用户可以免费获取并根据需要进行定制和扩展。这使得它成为了很多团队的首选,尤其是对于那些预算有限或者不想受商业工具限制的团队。
支持多种编程语言: Selenium支持多种主流编程语言,包括Java、Python、C#等,使得测试人员可以根据自己的喜好和项目的需求选择合适的语言进行测试脚本的编写。
强大的社区支持: Selenium拥有庞大的开发者社区,用户可以从社区中获取到丰富的资源、教程和解决方案。这样的社区支持使得用户能够更快地解决问题并且与其他开发者进行交流。
灵活性和可扩展性: Selenium提供了丰富的API和功能,可以进行各种形式的Web测试,包括UI测试、功能测试、性能测试等。同时,Selenium还支持与其他测试框架和工具集成,以满足更复杂的测试需求。
综上所述,Selenium因其跨平台性、开源免费、多语言支持、强大的社区支持以及灵活可扩展的特性,成为了Web自动化测试领域的首选工具之一。
windows电脑环境搭建-chrome浏览器
Chrome+Java(推荐)
1、下载chrome浏览器
链接地址:Google Chrome - 快速安全的网络浏览器,专为您而打造

2、查看chrome浏览器版本


3、下载chrome浏览器驱动
链接地址:ChromeDriver - WebDriver for Chrome - Downloads



如果是更高版本的浏览器,可以下载测试版本的驱动:



配置系统环境变量PATH
解压下载好的驱动压缩包,将下载好的chromedriver.exe放到chrome浏览器安装路径下(如果是edge浏览器驱动那就将对应驱动放到edge浏览器安装路径下),这里以chrome浏览器驱动为例:



接下来编辑环境变量:

把刚刚的chrome浏览器安装路径复制粘贴进来就行了:

创建java项目,添加pom文件中添加依赖
-
-
-
org.seleniumhq.selenium -
selenium-java -
3.141.59 -

注意这里的版本是selenium3,不是selenium4。

编写代码运行
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.chrome.ChromeDriver;
-
- public class Main {
- public static void main(String[] args) {
-
- WebDriver webDriver = new ChromeDriver();
- webDriver.get("https://www.baidu.com");
- }
- }

调整代码为:
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.chrome.ChromeDriver;
-
- public class Main {
- public static void main(String[] args) {
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- webDriver.get("https://www.baidu.com");
- }
- }
其中,驱动器可执行文件的路径必须通过 webdriver.chrome.driver 系统属性进行设置。这意味着虽然我们已经将 chromedriver.exe 移动到了 C:\Program Files\Google\Chrome\Application 下,但 Selenium 仍然无法找到它。
为了解决这个问题,我们需要确保在代码中设置了正确的系统属性。所以我们可以在代码中添加以下一行代码来设置 webdriver.chrome.driver 属性:
System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
Selenium 在寻找浏览器驱动时,通常需要指定一个系统属性来告诉它驱动程序的路径。因此,即使你已经将 Chrome 浏览器的安装目录添加到了系统的 Path 变量中,可能仍然需要在代码中设置 webdriver.chrome.driver 系统属性,以确保 Selenium 可以找到 ChromeDriver 可执行文件。
所以,无论你将 Chrome 浏览器的安装目录添加到 Path 变量中与否,我都建议在代码中显式设置 webdriver.chrome.driver 属性,这样更加健壮和可靠。
运行后,如果打开了浏览器,说明安装成功:


API是应用程序编程接口(Application Programming Interface)的缩写。它是一组定义了软件组件之间交互方式的规则和约定。API允许不同的软件系统之间相互通信、交换数据和执行操作,而无需了解彼此的内部实现细节。通过API,开发人员可以利用其他软件系统提供的功能,而无需重新实现这些功能,从而提高了开发效率和软件的可重用性。API通常以函数、方法或协议的形式呈现,并且可以在不同的编程语言和平台上使用。
对象的定位在自动化测试中是至关重要的,因为要操作一个对象,首先需要识别它。就像我们识别一个人一样,一个对象也有各种特征(属性),比如身份证号、姓名、住址等,通过这些特征我们可以找到这个对象。
在自动化测试中,我们也可以通过对象的属性来定位它,确保页面上该属性的唯一性。
WebDriver 提供了一系列的对象定位方法,常用的包括:
以上提到的对象定位方法,按照定位方法的具体实现方式进行归类,即定位方法的技术实现方式,可以分为三种类型:
基于单一属性的定位方法: 这些方法依赖于对象的单一属性来定位,如ID、Name、Class Name等。它们通常适用于对象具有唯一标识符的情况。
基于链接的定位方法: 这些方法用于定位超链接对象,根据链接的文本内容进行定位。
基于对象层级关系的定位方法: 这些方法通过对象在DOM树中的位置或者与其他对象之间的关系来定位,具有更高的灵活性。
每种定位方法都有其适用的场景和优劣势,根据具体情况选择最合适的定位方法是至关重要的。在编写自动化测试脚本时,我们需要充分了解页面结构和对象特征,以便准确地定位和操作对象。
按照定位方法的主要特征进行归类,即定位方法所依赖的元素属性或特征,元素定位方法又可以归结为三类 :
通过标签定位:包括ID、Name、Class Name、Link Text、Partial Link Text和Tag Name等方法,这些方法直接使用元素在HTML文档中的标签信息来定位元素。
XPath定位:使用XPath表达式来定位对象,XPath提供了一种更灵活、更强大的定位方式,可以基于元素的属性、层级关系等进行定位。
CSS Selector(CSS选择器):使用CSS选择器语法来定位元素,这种方法也是基于元素的样式属性进行选择,具有灵活性和强大的定位能力。
通过前端工具,例如Chrome浏览器的F12开发者工具,我们能够轻松地获取网页元素的属性信息,例如百度搜索框的属性如下所示:
<input id="kw" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">

ID是指页面元素的唯一标识属性,在网页开发中被广泛应用于元素的定位。然而,并非所有元素都具有ID属性。若一个元素具有ID属性,通常意味着在整个页面范围内其ID是唯一的,因此我们可以通过该ID来精确地定位到这个元素。 ID的唯一性使得它成为一种可靠的定位方式,为开发者提供了一种直接而有效的手段来操作特定的页面元素。
我们通过Java,使用Selenium WebDriver库来进行网页元素的定位和操作:
- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.chrome.ChromeDriver;
-
- public class WebElementLocate {
- public static void main(String[] args) {
- // 设置Chrome浏览器驱动路径
- System.setProperty("webdriver.chrome.driver", "path_to_chromedriver");
-
- // 实例化Chrome浏览器驱动对象
- WebDriver driver = new ChromeDriver();
-
- // 打开百度首页
- driver.get("https://www.baidu.com");
-
- //…………
-
- // 关闭浏览器
- driver.quit();
- }
- }
- // 通过ID定位百度输入框
- WebElement elementById = driver.findElement(By.id("kw"));
- System.out.println("通过ID定位百度输入框:" + elementById);
使用name属性进行定位是另一种常见的方法。如果一个元素具有name属性,并且该属性在整个页面中是唯一的,那么我们同样可以借助name属性来定位这个元素。
- // 通过Name定位百度输入框
- WebElement elementByName = driver.findElement(By.name("wd"));
- System.out.println("通过Name定位百度输入框:" + elementByName);
除了ID和Name属性外,还可以使用Tag Name和Class Name进行定位。Tag Name是元素的标签名,而Class Name是元素的类名。但需要注意,不是所有元素都具有Tag Name或Class Name属性,并且这两种属性在页面上必须是唯一的才能够准确地定位。
- // 通过Tag Name定位百度输入框
- WebElement elementByTagName = driver.findElement(By.tagName("input"));
- System.out.println("通过Tag Name定位百度输入框:" + elementByTagName);
-
- // 通过Class Name定位百度输入框
- WebElement elementByClassName = driver.findElement(By.className("s_ipt"));
- System.out.println("通过Class Name定位百度输入框:" + elementByClassName);
Text 定位是通过元素的可见文本内容来定位元素。这在处理按钮文本、段落内容或其他可见文本元素时非常有用。使用 find_element_by_link_text() 方法来实现对链接文本的定位,或使用 find_element_by_partial_link_text() 方法来实现对部分链接文本的定位。
举例来说,如果一个按钮上的文本是 "Submit",可以使用 find_element_by_link_text("Submit") 方法来定位该按钮元素。同样地,如果一个段落中包含了 "Important information",也可以使用 find_element_by_partial_link_text("Important") 来定位该段落元素。
- // Link Text定位
- WebElement linkByText = driver.findElement(By.linkText("Click Here"));
- System.out.println("Link Text定位:" + linkByText);
Partial Link Text 定位是对链接文本的部分匹配定位。有时候,链接文本可能非常长,但我们只需要匹配其中的一部分来定位元素即可。在这种情况下,使用 find_element_by_partial_link_text() 方法是很方便的。
例如,如果一个链接的文本是 "Click Here to Visit OpenAI",我们可以使用 find_element_by_partial_link_text("OpenAI") 来定位该链接元素。即使链接文本的其余部分发生变化,只要包含了 "OpenAI" 这个部分,该定位方法依然能够准确地找到对应的元素。
- // Partial Link Text定位
- WebElement partialLinkByText = driver.findElement(By.partialLinkText("OpenAI"));
- System.out.println("Partial Link Text定位:" + partialLinkByText);
CSS Selector 是一种通过 CSS 样式规则来定位元素的方法。使用 CSS Selector 可以根据元素的标签名、类名、ID 等属性来精确定位元素。相对于 XPath,CSS Selector 的定位速度通常更快。在实际应用中,可以根据需要选择合适的 CSS Selector 来定位元素。
CSS(层叠样式表)是一种用来描述 HTML 和 XML 文档的表现样式的语言。CSS 使用选择器来选择页面元素并绑定样式。这些选择器也可以被 Selenium 用作定位元素的策略。
通过使用 find_element_by_css_selector() 函数,我们可以根据 CSS Selector 来定位元素。例如,通过 find_element_by_css_selector("#kw") 就可以定位到百度输入框,其中 #kw 是表示 ID 属性的 CSS Selector。
基本的CSS选择器语法包括以下几种:
元素。
获取 CSS Selector 通常可以使用 Chrome 浏览器的开发者工具(F12),在 Elements 面板中右键点击元素,选择 Copy -> Copy selector 即可获取元素的 CSS Selector。
点击最左上角的图标后,在页面中选中百度输入框,跳转到该代码,点击这行代码后按Ctrl+F,下方弹出输入框:


想要选中这行代码,此时,.s_ipt并不是一个有效的CSS选择器,因为在CSS中,.用于选择具有特定类的元素,而不是选择具有特定类的元素的属性。所以,输入.s_ipt并不会选择整行代码,而是选择具有类名为s_ipt的元素。

要选中整行代码,我们可以使用更通用的CSS选择器,例如根据标签名、ID或其他属性来选择。class="s_ipt"是元素的属性,而不是元素本身。因此,要选择具有class="s_ipt"属性的元素,我们应该使用属性选择器,[class='s_ipt']。 如果要选中整行代码,我们可以使用更具体的选择器,例如input.s_ipt来选择具有类名为s_ipt的input元素。

CSS Selector 的灵活性允许我们选择控件的任意属性。因此,在实际使用中,我们可以根据页面的具体情况选择合适的 CSS Selector 来进行元素定位。
具体的语法参考:CSS 选择器参考手册

利用代码定位元素:
- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.chrome.ChromeDriver;
-
- public class Main {
- public static void main(String[] args) {
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- webDriver.get("https://www.baidu.com");
- WebElement search_input = webDriver.findElement(By.cssSelector(".s_ipt"));
- if (search_input==null){
- System.out.println("测试不通过");
- } else {
- System.out.println("测试通过");
- }
- }
- }


什么是XPath?Cover page | xpath | W3C standards and drafts | W3C
XPath 基础教程: XPath 教程
XPath是一种用于在XML文档中定位节点的语言,它是XML Path Language的缩写。在网页自动化测试中,XPath也是一种常用的元素定位方式。与CSS选择器类似,XPath允许根据元素的层级关系、属性等特征来准确定位元素。XPath的灵活性很高,使得它成为了一种强大的定位工具,但同时也需要注意XPath表达式的编写规则和语法,以确保定位的准确性和唯一性。
XPath的优势在于扩展了传统的id和name定位方式,提供了更多种可能性。通过XPath,可以精确地定位页面中的任何一个元素,而不仅限于id和name属性。XPath的表达能力使得它可以处理各种复杂的定位需求,如基于文本内容、基于元素属性、基于元素位置等。
XPath的基本语法包括以下几个部分:
元素,而 //div/p 选择文档中所有嵌套在
元素。
元素。
当使用XPath时,有两种主要的路径操作符:绝对路径和相对路径。
绝对路径:绝对路径从根节点开始,沿着文档结构一直到目标节点。在XPath中,绝对路径以斜杠 / 开头,表示从文档的根节点开始沿着路径查找目标节点。绝对路径的优点是确保了唯一性和准确性,因为它们不受当前节点位置的影响。然而,当页面结构发生变化时,绝对路径可能会变得不稳定,需要经常更新。
例如,/html/body/div[1]/p[2] 是一个绝对路径,表示选择文档根节点下的第一个
元素。
相对路径:相对路径从当前节点开始,沿着文档结构查找目标节点。在XPath中,相对路径不以斜杠开头,表示相对于当前节点的路径。相对路径通常更简洁,并且在页面结构变化时更具灵活性,因为它们不依赖于文档的绝对结构。
例如,./div/p[2] 是一个相对路径,表示从当前节点开始选择下一级的
元素。
相对路径更加灵活,因为它们不依赖于文档结构的绝对位置,而是相对于当前节点的位置。但是,绝对路径可以提供更强的准确性和稳定性,特别是在页面结构变化较少或者需要确保准确性的情况下。在实际应用中,根据页面的具体情况,我们可以灵活选择使用绝对路径或相对路径。
要获取XPath表达式,可以借助浏览器的开发者工具。例如,在Chrome浏览器中,可以使用F12开发者模式中的Elements面板,右键点击目标元素,选择“Copy” > “Copy XPath”来获取该元素的XPath表达式。这样就能够方便地将XPath表达式应用于自动化测试脚本中,实现对页面元素的准确定位和操作。
当定位元素时,我们可以使用以下四种方法:
这些方法可以根据页面的具体结构和需要灵活选择,以确保准确地定位目标元素。具体来看:
绝对路径:

相对路径+索引:

相对路径+属性值:

相对路径+通配符:

相对路径+文本匹配:

利用代码定位元素:
- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.chrome.ChromeDriver;
-
- public class Main {
- public static void main(String[] args) {
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- webDriver.get("https://www.baidu.com");
- WebElement search_input = webDriver.findElement(By.xpath("//form/span[1]/input"));
- if (search_input==null){
- System.out.println("测试不通过");
- } else {
- System.out.println("测试通过");
- }
- }
- }


关闭浏览器:
- webDriver.quit();
- webDriver.close();
webDriver.quit() 和 webDriver.close() 都是WebDriver中用于关闭浏览器的方法,它们之间有一些区别:
webDriver.quit():
webDriver.close():
推荐的使用方式取决于测试场景和需求:
当然,抛开上述内容不谈,还有最简单的选中元素的方法:

CSS选择器和XPath选择器都是用于定位元素的工具,但是它们之间还是有一些区别的:
语法:
性能:
功能:
跨平台性:
综上所述,CSS选择器和XPath选择器各有优劣,具体选择取决于测试场景的要求、目标元素的复杂度以及浏览器的支持情况。通常情况下,我们还是优先考虑使用CSS选择器,只有在CSS选择器无法满足定位需求时,再考虑使用XPath选择器。
现在回过头来问你,定位元素的API是什么?
定位元素的API通常是指用于在网页上查找和定位特定元素的方法和函数。在Web自动化测试中,定位元素是非常重要的,因为测试脚本需要与页面上的各种元素进行交互,如输入文本、点击按钮、验证文本等操作。
在Selenium中,定位元素的API主要是一组方法,用于根据不同的定位策略找到网页上的元素。一些常见的定位元素的API包括:
前面提到的定位元素只是自动化测试的第一步,接下来需要对这些定位到的元素进行各种操作。这些操作可以是与用户交互的动作,比如点击按钮或链接,输入文本,清除输入框内容,提交表单等。针对定位到的元素进行何种操作取决于测试场景和需求。
在WebDriver中,最基本的操作对象的方法有以下几个:
click:用于点击对象,例如按钮、链接等可点击的元素,以触发相应的事件或操作。
send_keys:在对象上模拟按键输入,将指定的文本内容输入到对象中,通常用于输入框等需要用户输入信息的元素。
clear:清除对象输入的文本内容,用于将输入框中已有的文本清空,方便输入新的内容。
submit:用于提交表单,通常用于表单中的某些按钮,当按钮类型为 submit 时,可以使用该方法提交表单。
text:用于获取元素的文本信息,即元素中显示的文本内容,例如链接的文本、段落的文字等。
稍微归一下类:
鼠标点击或键盘输入:
清除元素内容:
提交表单:
其他操作:
当然,测试对象的操作方法还有很多:
在WebDriver中,操作对象的API主要包括以下几种方法:
findElement(By by):根据指定的定位器(By对象)定位并返回单个 WebElement 对象。如果找不到元素,则会抛出 NoSuchElementException 异常。
findElements(By by):根据指定的定位器(By对象)定位并返回一组 WebElement 对象列表。如果找不到任何元素,则返回空列表。
WebElement click():点击此元素。
WebElement submit():提交此元素,如果此元素是表单内的 元素,或者此元素是带有提交功能的元素(如 元素),则会提交该表单。
void sendKeys(CharSequence... keysToSend):在此元素上模拟按键输入。键盘输入将会追加到当前元素的值的末尾。
void clear():清除此元素上的文本。
String getAttribute(String name):获取此元素的指定属性的值。
String getText():获取此元素的文本内容。
boolean isDisplayed():判断此元素是否可见。
void submit():提交此元素,如果此元素是 元素,则提交该表单。
void click():点击此元素。
Point getLocation():获取此元素在页面上的位置。
Dimension getSize():获取此元素的大小。
String getTagName():获取此元素的标签名。
String getCssValue(String propertyName):获取此元素的指定 CSS 属性的值。
这些方法可以用于定位、操作以及获取元素的信息。通过它们,我们可以完成对网页上各种元素的交互操作和状态获取。

- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.chrome.ChromeDriver;
-
- import java.util.List;
-
- import static java.lang.Thread.sleep;
-
- public class Main {
- public static void main(String[] args) throws InterruptedException {
- Test02();
- }
-
- private static void Test02() throws InterruptedException {
- //创建一个浏览器驱动器
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- //打开百度页面
- webDriver.get("https://www.baidu.com");
- //找到搜索输入框
- WebElement search_input = webDriver.findElement(By.cssSelector("#kw"));
- //向搜索输入框中输入“软件测试”
- search_input.sendKeys("软件测试");
- //找到“百度一下”文本进行点击
- WebElement baidu_button = webDriver.findElement(By.cssSelector("#su"));
- baidu_button.click();
- sleep(3000);
- //逻辑判断
- List
search_results = webDriver.findElements(By.cssSelector("a em")); - sleep(3000);
- for(int i =0;i
- if(search_results.get(i).getText().equals("软件测试"))
- System.out.println("测试通过");
- else
- System.out.println("测试不通过");
- }
- }
-
- }


- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.chrome.ChromeDriver;
-
- import java.util.List;
-
- import static java.lang.Thread.sleep;
-
- public class Main {
- public static void main(String[] args) throws InterruptedException {
- //Test01();
- //Test02();
- //Test03();
- //TureTest();
- //FalseTest();
- Test04();
- }
-
- private static void Test04() {
- //创建一个浏览器驱动器
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- //打开百度页面
- webDriver.get("https://www.baidu.com");
- String baidu_button_text = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
- System.out.println("百度按钮文案是:"+baidu_button_text);
- }
-
- //用click不会报错
- private static void TureTest() {
- //创建一个浏览器驱动器
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- //打开百度页面
- webDriver.get("https://www.baidu.com");
- //找到“新闻”按钮,点击
- WebElement news_button = webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));
- news_button.click();
- //退出浏览器
- }
-
- //用submit会报错
- private static void FalseTest() {
- //创建一个浏览器驱动器
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- //打开百度页面
- webDriver.get("https://www.baidu.com");
- //找到“新闻”按钮,点击
- WebElement news_button = webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));
- news_button.submit();
- //退出浏览器
- }
-
- private static void Test03() throws InterruptedException {
- //创建一个浏览器驱动器
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- //打开百度页面
- webDriver.get("https://www.baidu.com");
- //找到搜索输入框
- WebElement search_input = webDriver.findElement(By.cssSelector("#kw"));
- //向搜索输入框中输入“软件测试”
- search_input.sendKeys("软件测试");
- //找到搜索输入框,并清空百度搜索输入框中的内容
- search_input.clear();
- //向搜索输入框中输入“前端开发”
- search_input.sendKeys("前端开发");
- //找到“百度一下”文本进行点击
- WebElement baidu_button = webDriver.findElement(By.cssSelector("#su"));
- baidu_button.click();
- sleep(3000);
- //校验结果是否正确
- List
search_results = webDriver.findElements(By.xpath("//font[text()=\"web前端开发\"]")); -
- for(int i =0;i
- if(search_results.get(i).getText().equals("web前端开发"))
- System.out.println("测试通过");
- else
- System.out.println("测试不通过");
- }
-
- }
-
- private static void Test02() throws InterruptedException {
- //创建一个浏览器驱动器
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- //打开百度页面
- webDriver.get("https://www.baidu.com");
- //找到搜索输入框
- WebElement search_input = webDriver.findElement(By.cssSelector("#kw"));
- //向搜索输入框中输入“软件测试”
- search_input.sendKeys("软件测试");
- //找到“百度一下”文本进行点击
- WebElement baidu_button = webDriver.findElement(By.cssSelector("#su"));
- baidu_button.click();
- sleep(3000);
- //逻辑判断
- List
search_results = webDriver.findElements(By.cssSelector("a em")); - sleep(3000);
- for(int i =0;i
- if(search_results.get(i).getText().equals("软件测试"))
- System.out.println("测试通过");
- else
- System.out.println("测试不通过");
- }
- }
-
- private static void Test01() {
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- webDriver.get("https://www.baidu.com");
- WebElement search_input = webDriver.findElement(By.xpath("//form/span[1]/input"));
- if (search_input==null){
- System.out.println("测试不通过");
- } else {
- System.out.println("测试通过");
- }
- webDriver.quit();
- //webDriver.close();
- }
- }


- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.chrome.ChromeDriver;
-
- import java.util.List;
-
- import static java.lang.Thread.sleep;
-
- public class Main {
- public static void main(String[] args) throws InterruptedException {
- //Test01();
- //Test02();
- Test03();
- }
-
- private static void Test03() throws InterruptedException {
- //创建一个浏览器驱动器
- System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
- WebDriver webDriver = new ChromeDriver();
- //打开百度页面
- webDriver.get("https://www.baidu.com");
- //找到搜索输入框
- WebElement search_input = webDriver.findElement(By.cssSelector("#kw"));
- //向搜索输入框中输入“软件测试”
- search_input.sendKeys("软件测试");
- //找到搜索输入框,并清空百度搜索输入框中的内容
- search_input.clear();
- //向搜索输入框中输入“前端开发”
- search_input.sendKeys("前端开发");
- //找到“百度一下”文本进行点击
- WebElement baidu_button = webDriver.findElement(By.cssSelector("#su"));
- baidu_button.click();
- sleep(3000);
- //校验结果是否正确
- List
search_results = webDriver.findElements(By.xpath("//font[text()=\"web前端开发\"]")); -
- for(int i =0;i
- if(search_results.get(i).getText().equals("web前端开发"))
- System.out.println("测试通过");
- else
- System.out.println("测试不通过");
- }
-
- }
-
- }


此时,将上述代码中的click方法改为submit方法,程序可以正常运行。
此处我们使用submit方法替代click方法不会报错的原因是因为百度搜索按钮(#su)是包含在一个