作者:禅与计算机程序设计艺术
1.简介
Selenium是一个开源的自动化测试工具,它提供了基于web应用的UI自动化、跨浏览器测试、测试结果分析等功能。它提供的功能包括:自动化控制浏览器、操纵表单、点击链接及按钮、验证页面元素、执行JavaScript代码、生成PDF文件、模拟移动设备行为、实时日志记录、多种报告格式输出、扩展接口支持、分布式集群支持等。
Selenium WebDriver 是 Selenium 的WebDriver实现,是一个用于构建自动化测试脚本的API。它是Selenium 3.x版本的重量级产品,集成了许多强大的功能特性和便利性。它可以操纵Chrome、Firefox、IE、Edge、Safari、Android Webview、iOS UI Automation及Remote Webdriver服务器等。
本教程将会带领读者了解Selenium WebDriver的工作机制、语法规范及编程示例。通过阅读本文,你可以了解到以下知识点:
1.什么是Selenium?
2.为什么要用Selenium?
3.Selenium是如何工作的?
4.如何安装并配置Selenium环境?
5.Selenium的Java API介绍及测试框架介绍
6.编写自动化测试脚本的一般流程及基本要素
7.一些常见问题及其解决方案
8.测试案例代码示例,助您快速上手
9.一些Selenium应用场景以及未来的发展方向
2.基础概念与术语
2.1.什么是Selenium?
Selenium是一个开源的自动化测试工具,它提供了基于web应用的UI自动化、跨浏览器测试、测试结果分析等功能。它提供的功能包括:自动化控制浏览器、操纵表单、点击链接及按钮、验证页面元素、执行JavaScript代码、生成PDF文件、模拟移动设备行为、实时日志记录、多种报告格式输出、扩展接口支持、分布式集群支持等。
Selenium WebDriver 是 Selenium 的WebDriver实现,是一个用于构建自动化测试脚本的API。它是Selenium 3.x版本的重量级产品,集成了许多强大的功能特性和便利性。它可以操纵Chrome、Firefox、IE、Edge、Safari、Android Webview、iOS UI Automation及Remote Webdriver服务器等。
2.2.为什么要用Selenium?
满足自动化测试需求的场景有很多,例如:
- 购物网站的自动化测试
- 金融网站的自动化测试
- 微博的自动化测试
- 小程序的自动化测试
- APP的自动化测试
2.3.Selenium是如何工作的?
2.3.1.运行环境准备
在进行Selenium测试之前,需要准备好如下环境:
- 安装Java开发环境:Windows/Linux/Mac系统均可;
- 安装Selenium Server或其他远程Driver:下载对应版本的selenium-server-standalone.jar,并启动。
- 配置Web Drivers:设置测试环境中Web浏览器的驱动文件路径,配置环境变量。
2.3.2.测试脚本编写
测试脚本通常由三部分构成:
- 引入必要的包
- 创建WebDriver对象
- 使用WebElement对象定位网页中的特定元素,然后对该元素进行操作。
测试脚本编写完成后,通过WebDriver调用各种命令实现对浏览器的自动化控制,从而实现对页面的测试。
2.3.3.运行测试脚本
测试脚本可以通过两种方式运行:
- 直接在IDE中运行测试脚本:这种方式要求有相应的调试环境,比如Eclipse、IntelliJ IDEA等;
- 通过命令行运行测试脚本:这种方式不需要有特定的调试环境,只需在命令行窗口中进入项目目录,并输入
java -jar selenium-server-standalone.jar
命令即可启动测试脚本。
2.3.4.查看测试结果
运行完测试脚本后,将生成测试报告。测试报告详细地反映测试结果,包括测试用例的执行情况、错误信息、测试时间等。根据测试报告的内容,可以判断测试是否成功,及时发现和修复出现的问题。
2.4.如何安装并配置Selenium环境
2.4.1.安装JDK
首先需要安装Java开发环境(JDK),Java Development Kit,用于运行Java程序。如果系统已经安装OpenJDK或者Oracle JDK,则无需重复安装。否则,可以到官方网站下载Java SE Development Kit 8u202 (JDK 8 Update 202)的最新版安装包安装。
2.4.2.安装Selenium Server
从http://www.seleniumhq.org/download/下载对应版本的selenium-server-standalone.jar,并放入工程目录下,执行命令“java -jar selenium-server-standalone.jar”开启服务。
2.4.3.配置WebDrivers
每个浏览器都有自己的驱动程序,用来操控浏览器,不同浏览器的驱动文件放在不同的位置,因此需要分别配置。这里以FireFox浏览器为例:
- 下载对应的FireFoxDriver:https://github.com/mozilla/geckodriver/releases,目前最新版本是0.29.0。
- 将下载好的FireFoxDriver放入工程的根目录下。
- 配置环境变量:在系统环境变量中添加一个新的变量名为"webdriver.gecko.driver",值为刚才下载好的驱动文件的路径。
- 修改测试脚本中的代码,创建WebDriver对象时传入“DesiredCapabilities.firefox()”参数,即可创建一个Firefox浏览器的WebDriver对象。
2.4.4.配置IDE
根据使用的IDE不同,配置起来会有所差异。这里以Eclipse为例,介绍一下配置过程。
- 安装Selenium插件:打开Eclipse,依次选择Help -> Install New Software…。在弹出的对话框中,点击“Add”,输入地址“http://repository.sonatype.org/content/repositories/releases/org/seleniumhq/selenium/selenium-eclipse-plugin/3.141.59/”并回车。找到名为“Selenium IDE Tools”的插件,勾选安装,等待安装完成。
- 设置编码格式:打开Eclipse,依次选择Window -> Preferences -> General -> Workspace,在右侧的“Text file encoding”一项中,选择UTF-8,点击Apply和OK保存设置。
- 配置项目:右键单击项目名称,选择Properties。在左侧导航栏中选择“Project Facets”标签,在“Dynamic Web Module Support”面板中勾选“Web”和“JSF”,点击Apply和OK保存设置。
- 添加测试依赖:在pom.xml文件中加入selenium-api、junit、selenium-remote-driver依赖。
- 生成单元测试:在src/test/java目录下新建包,比如“demo”。然后在此包下新建一个类,比如“TestExample”,代码如下:
packagedemo;importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.firefox.FirefoxDriver;importorg.testng.annotations.BeforeMethod;importorg.testng.annotations.Test;publicclassTestExample{privatestaticfinalStringURL="https://www.baidu.com";privateWebDriver driver;@BeforeMethodpublicvoidinit()throwsException{System.setProperty("webdriver.gecko.driver","/path/to/geckodriver");
driver =newFirefoxDriver();
driver.get(URL);}@TestpublicvoidtestSearchBaidu()throwsException{WebElement searchInput = driver.findElement(By.id("kw"));
searchInput.sendKeys("Sel<PASSWORD>");WebElement searchButton = driver.findElement(By.id("su"));
searchButton.click();}}
此处的init方法负责初始化WebDriver对象和访问页面。testSearchBaidu方法通过查找网页中id为“kw”的搜索框和id为“su”的搜索按钮,输入关键字“Selenium”,并点击搜索按钮进行搜索。
6. 运行单元测试:在Eclipse菜单栏中依次选择Run->Run As->JUnit Test。选择TestExample类,点击右下角的“Run”按钮即可运行单元测试。
2.5.Selenium的Java API介绍及测试框架介绍
2.5.1.Selenium的Java API
Selenium的Java API主要由四个部分组成:
- WebDriver接口:用于控制浏览器,发送命令并接收响应。
- WebElement接口:用于表示页面中的某个HTML元素,能够执行诸如点击、输入文本等操作。
- Keys类:用于帮助模拟键盘按键,如ENTER、TAB、ESC等。
- By类:用于帮助定位HTML元素,如ById、ByName、ByXPath等。
2.5.2.测试框架
测试框架有很多种,最常用的有两种:
- JUnit:一种单元测试框架,可以在单元测试时模拟用户交互、检查测试结果、生成测试报告。
- TestNG:另一种单元测试框架,提供了更丰富的断言功能、多线程执行、数据驱动等特性。
2.6.编写自动化测试脚本的一般流程及基本要素
下面介绍一下编写自动化测试脚本的一般流程及基本要素:
- 明确目标测试范围:确认测试对象、测试范围、测试内容等相关信息。
- 确定测试工具:选择合适的测试工具,比如Selenium IDE、Selenium WebDriver、Appium等。
- 安装测试环境:设置测试环境,包括安装测试工具、安装浏览器驱动、配置运行参数等。
- 设计测试用例:根据业务场景和测试目标设计测试用例。
- 编写测试脚本:按照测试工具的语法编写自动化测试脚本。
- 执行测试:执行测试脚本,查看测试结果,根据测试报告分析失败原因。
- 优化脚本:根据测试结果及时修改脚本,提升测试效率。
2.7.一些常见问题及其解决方案
2.7.1.Selenium IDE与Selenium WebDriver的区别和联系?
Selenium IDE是一款基于图形界面的测试工具,它具有较高的易用性和直观性。它可视化地构造自动化测试用例,同时提供大量的高级功能支持,方便编写者快速编写测试用例。Selenium IDE支持多种浏览器,包括Chrome、Firefox、IE、Opera等。
Selenium WebDriver是Selenium的一个WebDriver实现,它是一个用于构建自动化测试脚本的API。它是Selenium 3.x版本的重量级产品,具有较高的性能及兼容性。它可以使用各种语言实现,包括Java、Python、C#、Ruby、JavaScript等。
Selenium IDE 和 Selenium WebDriver 之间的关系是什么呢?它们之间有一个重要的区别,那就是它们在工作原理上的不同。
- 工作模式:Selenium IDE 和 Selenium WebDriver 分别采用不同的工作模式。
Selenium IDE 以独立的进程形式运行,它通过与浏览器的无缝连接与浏览器进行交互,它提供了大量的测试用例模板供使用者快速构造测试用例,但它不具备很强的灵活性,只能在已知的测试用例场景中使用。
Selenium WebDriver 是作为一个Selenium客户端运行在测试人员的机器上,它通过本地浏览器驱动与浏览器进行交互,它拥有独立于平台的特性,能在任意环境下运行,能适应多种浏览器,但是由于它不是独立的进程,所以测试时需要引入额外的配置及维护,且编写测试脚本相对复杂。
- 数据共享:Selenium IDE 和 Selenium WebDriver 可以彼此共享测试数据。
Selenium IDE 和 Selenium WebDriver 都支持生成XML格式的测试结果,并且它们还可以共享同样的数据,比如断言、预期结果等。但是在某些情况下,比如需要把预期结果持久化存储,Selenium IDE 会比 Selenium WebDriver 更合适一些。
- 支持平台:Selenium IDE 支持 Windows、Linux、macOS 操作系统,Selenium WebDriver 支持多种语言,包括Java、Python、C#、Ruby、JavaScript等。
2.7.2.Selenium为什么慢?
因为Selenium是通过请求和回复HTTP协议通信的,每次请求都会造成网络开销,而且Selenium做了太多的事情。具体表现为:
- 页面加载时间长:每次测试前都会先加载完整的页面,这导致了页面加载时间的增加。
- 脚本执行时间长:Selenium WebDriver 会加载被测页面的所有资源,执行所有的Javascript代码,这导致了脚本执行时间的增加。
如果你的应用是一个需要响应快的网站,那么用Selenium去测试可能会很慢,因此建议尽量减少Selenium的用法。
2.7.3.如何处理有弹窗的页面?
有弹窗的页面是指在执行测试时遇到一个弹窗框,它会阻止当前的测试继续执行,因此我们需要采取一些策略来处理这样的页面。
有三种常见的方法来处理弹窗:
- 等待弹窗关闭:这是最简单的方式,在测试执行过程中等待弹窗关闭。
不过这种方法可能会使得测试运行变得很慢,尤其是在存在多个弹窗的时候。
- 用CSS选择器处理弹窗:这种方法利用了CSS选择器,即查找具有特定样式的页面元素。我们可以将具有弹窗的元素的样式设置为display:none,然后在测试结束时恢复这个样式,就可以让弹窗消失了。
不过这种方法也不能应付所有的弹窗类型,对于异步加载的弹窗就没办法处理。
- JavaScript控制:这种方法利用了JavaScript来控制浏览器的行为。我们可以注入一段代码到页面中,它会监听弹窗的显示和隐藏事件,当弹窗显示出来时,它就会暂停当前的测试,等弹窗消失后再继续测试。
不过这种方法也需要测试人员掌握JavaScript的编程能力,因此它的适用场景还是有限的。
2.7.4.测试报告怎么看?
当测试结束后,你会得到一个测试报告,它包含了测试用例的执行情况、错误信息、测试时间等。如果你熟悉JUnit或TestNG的测试报告,那么理解Selenium的测试报告也就容易了。
测试报告的结构分为几个部分:
- Summary:概述了测试的总体情况,展示了测试的结果(Pass、Fail)、用时、总计用例数、通过的用例数、失败的用例数、错误的用例数等信息。
- Testsuite:展示了每条测试用例的信息,包括用例名称、用例是否通过、用例耗费的时间、用例执行步骤以及用例的错误信息。
- Errors and Failures:包含了所有失败或错误的用例的信息。
- TestCase ID:每条用例的唯一标识符。
- TimeStamp:测试开始的时间戳。
2.8.测试案例代码示例,助您快速上手
在接下来的部分,我将提供一些Selenium的实际例子,帮助读者快速上手。这些例子都是基于上述技术栈,以帮助读者理解Selenium的工作机制、语法规范及编程示例。
2.8.1.登录百度首页并搜索关键字
打开浏览器并访问百度首页:
WebDriver driver =newFirefoxDriver();// 或者其他浏览器
driver.get("https://www.baidu.com");
输入搜索关键字并提交:
WebElement input = driver.findElement(By.id("kw"));
input.clear();
input.sendKeys("Selenium");WebElement button = driver.findElement(By.id("su"));
button.click();
获取搜索结果列表:
List<WebElement> results = driver.findElements(By.cssSelector("#content_left div.result"));for(WebElement result : results){System.out.println(result.getText());}
2.8.2.上传图片到微博
打开浏览器并访问微博登录页面:
WebDriver driver =newFirefoxDriver();// 或者其他浏览器
driver.get("https://passport.weibo.cn/signin/login");
输入用户名密码并提交:
WebElement username = driver.findElement(By.name("username"));
username.clear();
username.sendKeys("yourUsername");WebElement password = driver.findElement(By.name("password"));
password.clear();
password.sendKeys("<PASSWORD>");WebElement submit = driver.findElement(By.xpath("//div[@class='info_list']/button"));
submit.click();
上传图片:
WebElement picButton = driver.findElement(By.cssSelector(".picBtn"));
picButton.click();File imageFile =newFile("/path/to/image.jpg");WebElement uploadField = driver.findElement(By.cssSelector(".js_upload_file"));
uploadField.sendKeys(imageFile.getAbsolutePath());WebElement confirmButton = driver.findElement(By.cssSelector(".btn_primary"));
confirmButton.click();
2.8.3.上传文件到Dropbox
打开浏览器并访问Dropbox页面:
WebDriver driver =newFirefoxDriver();// 或者其他浏览器
driver.get("https://www.dropbox.com/");
点击登录按钮并登录:
WebElement loginLink = driver.findElement(By.linkText("登录"));
loginLink.click();WebElement usernameInput = driver.findElement(By.id("login_email"));
usernameInput.sendKeys("[email protected]");WebElement continueButton = driver.findElement(By.className("secondaryAction"));
continueButton.click();WebElement passwordInput = driver.findElement(By.id("login_password"));
passwordInput.sendKeys("yourPassword");WebElement signInButton = driver.findElement(By.id("login_submit"));
signInButton.click();
上传文件:
WebElement filesLink = driver.findElement(By.linkText("文件"));
filesLink.click();WebElement dropzone = driver.findElement(By.id("file-dropzone"));
dropzone.sendKeys(newFile("/path/to/file").getAbsolutePath());
版权归原作者 禅与计算机程序设计艺术 所有, 如有侵权,请联系我们删除。