Step1:在本地环境中配置一个测试开发环境
环境说明: Windows7 64位系统(在VMware虚拟机上) Eclipse4.9版本 JDK1.8环境准备 - 虚拟机安装Windows7 64位系统 操作步骤详细见:安装Windows7操作步骤 - JDK1.8 操作步骤详细见(基于Windows7):安装JDK步骤 - Eclipse4.9版本 网盘资料(解压后可直接用):链接:https://pan.baidu.com/s/1UUbAh88wPqQrXljhjpbdXQ 提取码:5scb 手动下载,这里如果选择4.9版本的话,如果从Eclipse官网下载,需要涉及到下载历史版本Eclipse的查找问题,详情见:选择历史版本,借助这篇博文就可以容易找到4.9版本了
Step2:选择并安装好一种Selenium支持的主流Web浏览器
推荐使用Chrome,Firefox,IE或Edge这里选择我比较喜欢用的Firefox浏览器,所以需要在Windows7上安装一个Firefox浏览器 附: 下载地址这里需要记录下所使用的浏览器的版本,后面需要用到.这里以Firefox为例 打开Firefox浏览器,点击右上角的三条横线符号 在下拉列表中选择 帮助 选择 关于Firefox 这里可以看到我这里使用的Firefox的版本号
Step3:下载对应浏览器版本的WebDriver包及Selenium相关包
进入Selenium官网,官网点击DOWNLOAD,准备下载 首先对下载页面中部分内容进行简单解释说明一下 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020052210503784.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjQ5MDAx,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200522105317633.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjQ5MDAx,size_16,color_FFFFFF,t_70) - Selenium Server(Grid):早期在Selenium1.0版本时,如果使用Selenium调用浏览器就必须要使用这个Server,到了2.0之后,如果是在本机调用Selenium的时候已经不需要这个包了,除非是使用Selenium调用远程计算机上的浏览器 - The Internet Explorer Driver Server:IE浏览器专用的Server - Selenium Client…:Selenium针对不同的编程语言,提供了相应的客户端支持,如果要使用某种程序设计语言来调用Selenium的话,就要下子对应语言的包,并且在代码中去调用,我这边使用Java语言来调用,所以下载一个Java的包 - Selenium IDE:提供了录制脚本的功能,主要通过浏览器插件的方式来完成,该插件可以提供该功能下载Firefox对应版本的WebDriver包 我的Firefox版本是76.0.1,下图中0.26.0最低版本是60,因此选择该版本 进入到下载页面,是一个GitHub链接 下滑找到对应下载链接 考虑到下载可能出现速度过慢的问题,这里提供了网盘下载链接,供大家使用:链接:https://pan.baidu.com/s/1d7d78InVXNgujM1IdJk6oQ 提取码:1app
Step4:准备好被测系统(MercuryTours,简称MTours)
该系统在我之前的一篇博文中已经详细介绍过完整的准备步骤了,麻烦大家移步继续看一下:MTours准备好之后,就可以启动服务,然后打开浏览器输入http://localhost:8080/mtours/进入到MTours主页了 这里在MTours上注册一个账户,方便使用 读到这里,所有的准备工作就结束了,感谢大家的阅读,希望大家有所收获,加油,继续吧!
Step5:开始测试
Step5.1:分析待测试的页面(MTours)
MTours的机票预订子系统(Flights)完成了从用户注册(Registration),用户登录(Sign on),查找航班(Flight Finder),选择航班(Select Flight),预订航班(Book a Flight),确认订单(Flight Confirmation)到退出登录(Log out)的整个完整的网上机票预订的业务流程我们可以使用浏览器对应的 开发者工具,对脚本相关页面进行页面(Html源码)分析,找出要操作和测试的页面元素(Web Element)
Step5.2:编写并执行自动化测试脚本
案例脚本内容包括: - 1.启动浏览器,加载测试页面 - 2.进行元素定位 调用页面元素的相关方法来获取元素对应的值,操作表单上的文本框,单选按钮等元素,操作浏览器完成网上机票预订全过程 - 3.操作相关元素 调用页面元素的相关方法来获取元素对应的值,操作表单上的文本框,单选按钮等元素,操作浏览器完成网上机票预订全过程 - 4.添加检查点(断言),实现参数化(可选) 为编写好的脚本添加必要的检查点(断言),并通过调用外部文件来使用订票测试脚本中相关输入项(如出发地/目的地/订票人姓名等)的参数化 - 5.退出浏览器
Step5.3:编写代码
打开Eclipse,创建一个Java项目 引入之前下载的Selenium与Java语言相关的包(selenium-java-3.141.59) 我把之前下载的selenium-java-3.141.59放在了C盘下, 将其解压,并把该文件夹内的部分jar包,引入到刚刚创建的Java项目中 引入方式如下: 根据自己文件夹的路径,依次添加好jar包即可 最后点击Apply and close即可 解压之前下载的Firefox对应的WebDriver压缩包 解压完成之后,里面有个程序 编写代码(创建一个class即可写代码)
package com.rc.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class Test {
public static void main(String[] args) {
// 1.设置WebDriver的位置
System.setProperty("webdriver.firefox.marionette", "C:\\geckodriver-v0.26.0-win64_4\\geckodriver.exe");
// 2.实例化一个Driver
FirefoxDriver driver = new FirefoxDriver();
// 3.设置一个等待时间
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
try {
/**
* 以下查找的By.cssSelector或者By.name等都是查看网页源代码找的对应元素
*/
// 4.浏览到指定页面 这里的IP地址是我本机地址
// driver.navigate().to("http://192.168.242.140:8080/mtours");
driver.get("http://192.168.242.140:8080/mtours");
// 5. 网站首页检查点
boolean openResult = driver.findElement(By.cssSelector(".footer")).getText().contains("Mercury Interactive");
System.out.println("打开网页:"+openResult);
// 6. 进行登录,填写自己的帐号密码
driver.findElement(By.name("userName")).sendKeys("f0522");
driver.findElement(By.name("password")).sendKeys("root");
driver.findElement(By.name("login")).click();
// 7.登录检查点
boolean loginResult = driver.findElement(By.name("t_signoff")).isDisplayed();
System.out.println("登录:"+loginResult);
// 参数化
File file = new File("E:\\flights.txt");
// 文件内容为:London Paris bai yi 10086 (使用\t分隔)
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String row =null;
Random random = new Random(System.currentTimeMillis());
while((row=br.readLine())!=null) {
String[] cols = row.split("\t");
// 8. 选择详细行程信息
// 8.1 选择出发地和目的地
new Select(driver.findElement(By.name("fromPort"))).selectByVisibleText(cols[0]);
new Select(driver.findElement(By.name("toPort"))).selectByVisibleText(cols[1]);
driver.findElement(By.name("findFlights")).click();
List flightIDs = driver.findElements(By.cssSelector(".data_left"));
// 8.2随即选择乘坐航班
List outFlights = driver.findElements(By.name("outFlight"));
int sizeOfOutFlights = outFlights.size();
int chooseIndex = random.nextInt(sizeOfOutFlights);
outFlights.get(chooseIndex).click();
String choseOutFlightID = flightIDs.get(chooseIndex).getText();
System.out.println(choseOutFlightID);
List inFlights = driver.findElements(By.name("inFlight"));
int sizeOfInFlights = inFlights.size();
chooseIndex = random.nextInt(sizeOfInFlights);
inFlights.get(chooseIndex).click();
String chosenInFlightID = flightIDs.get(sizeOfOutFlights+chooseIndex).getText();
System.out.println(chosenInFlightID);
driver.findElement(By.name("reserveFlights")).click();
// 9.选择航班检查点
WebElement reserveBody = driver.findElement(By.tagName("body"));
String bodyText = reserveBody.getText();
boolean chooseResult = bodyText.contains(choseOutFlightID) && bodyText.contains(chosenInFlightID);
System.out.println("选择:"+chooseResult);
//10. 确认个人信息
driver.findElement(By.name("passFirst0")).sendKeys(cols[2]);
driver.findElement(By.name("passLast0")).sendKeys(cols[3]);
driver.findElement(By.name("creditnumber")).sendKeys(cols[4]);
driver.findElement(By.name("buyFlights")).click();
}
fr.close();
// 11.退出登录
driver.findElement(By.xpath("//a[@href=\"com.mercurytours.servlet.SignonServlet\"]")).click();
} catch (Exception e) {
e.printStackTrace();
}finally {
driver.quit();
}
}
}
里面用到了很多Selenium定位的知识,详情见文章:简书Selenium定位
执行代码查看结果 出问题了!!! 浏览器显示效果: Eclipse控制台输出结果,显示启动Firefox超时了 研究了好久,发现原来是Firefox,Selenium,geckodriver三者的版本适配问题,我查找了好久,没有解决掉三者之间的版本匹配问题,退而求其次,我降低了Firefox的版本使用35.0.1版本(较低版本可以不需要用到geckodriver),使用selenium-java-2.48.0版本成功测试,这里也希望看到这篇文章的伙伴如果知道Firefox,Selenium,geckodriver三者合适匹配版本的话,欢迎私信或者留言谢谢了,当然,我也会不断寻找,找到后一定及时更新博文 这里把Firefox35和Selenium的2.48资料共享一下,需要注意的是,安装Firefox前一定要先卸载之前的Firefox,然后在安装过程中最好断网,我第一次装莫名其妙自动升级版本了,安装成功后,进入Firefox的设置,关闭掉自动更新 链接:https://pan.baidu.com/s/11HmEDMR-dopaAawlCGPNbA 提取码:08ey 代码有所变动:
package com.rc.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class Test {
public static void main(String[] args) {
// 1.设置Firefox的位置
System.setProperty("webdriver.firefox.bin", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
// 2.实例化一个Driver
WebDriver driver = new FirefoxDriver();
// 3.设置一个等待时间
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
// 最大窗口
driver.manage().window().maximize();
try {
/**
* 以下查找的By.cssSelector或者By.name等都是查看网页源代码找的对应元素
*/
// 4.浏览到指定页面 这里的IP地址是我本机地址
// driver.navigate().to("http://192.168.242.140:8080/mtours");
// driver.get("http://192.168.242.140:8080/mtours");
driver.get("http://192.168.242.140:8080/mtours");
// 5. 网站首页检查点
boolean openResult = driver.findElement(By.cssSelector(".footer")).getText().contains("Mercury Interactive");
System.out.println("打开网页:"+openResult);
// 6. 进行登录,填写自己的帐号密码
driver.findElement(By.name("userName")).sendKeys("f0522");
driver.findElement(By.name("password")).sendKeys("root");
driver.findElement(By.name("login")).click();
// 7.登录检查点
boolean loginResult = driver.findElement(By.name("t_signoff")).isDisplayed();
System.out.println("登录:"+loginResult);
// 参数化
// File file = new File("E:\\flights.txt");
// FileReader fr = new FileReader(file);
// BufferedReader br = new BufferedReader(fr);
// 文件内容为:London Paris bai yi 10086 (使用\t分隔)
FileInputStream fr = new FileInputStream("E:\\flights.txt");
InputStreamReader is = new InputStreamReader(fr,"UTF-8");
BufferedReader br=new BufferedReader(is);
String row =null;
Random random = new Random(System.currentTimeMillis());
while((row=br.readLine())!=null) {
String[] cols = row.split("\t");
System.out.println(cols[0]);
// 8. 选择详细行程信息
// 8.1 选择出发地和目的地
new Select(driver.findElement(By.name("fromPort"))).selectByVisibleText("London");
new Select(driver.findElement(By.name("toPort"))).selectByVisibleText("Paris");
driver.findElement(By.name("findFlights")).click();
List flightIDs = driver.findElements(By.cssSelector(".data_left"));
// 8.2随即选择乘坐航班
List outFlights = driver.findElements(By.name("outFlight"));
int sizeOfOutFlights = outFlights.size();
int chooseIndex = random.nextInt(sizeOfOutFlights);
outFlights.get(chooseIndex).click();
String choseOutFlightID = flightIDs.get(chooseIndex).getText();
System.out.println(choseOutFlightID);
List inFlights = driver.findElements(By.name("inFlight"));
int sizeOfInFlights = inFlights.size();
chooseIndex = random.nextInt(sizeOfInFlights);
inFlights.get(chooseIndex).click();
String chosenInFlightID = flightIDs.get(sizeOfOutFlights+chooseIndex).getText();
System.out.println(chosenInFlightID);
driver.findElement(By.name("reserveFlights")).click();
// 9.选择航班检查点
WebElement reserveBody = driver.findElement(By.tagName("body"));
String bodyText = reserveBody.getText();
boolean chooseResult = bodyText.contains(choseOutFlightID) && bodyText.contains(chosenInFlightID);
System.out.println("选择:"+chooseResult);
//10. 确认个人信息
driver.findElement(By.name("passFirst0")).sendKeys("bai");
driver.findElement(By.name("passLast0")).sendKeys("yi");
driver.findElement(By.name("creditnumber")).sendKeys("10086");
driver.findElement(By.name("buyFlights")).click();
}
fr.close();
// 11.退出登录
driver.findElement(By.xpath("//a[@href=\"com.mercurytours.servlet.SignonServlet\"]")).click();
} catch (Exception e) {
e.printStackTrace();
}finally {
driver.quit();
}
}
}
经过再一次的折腾之后,我准备完毕,再次准备执行代码 控制台输出: 动图显示效果: 遗留问题:代码中是打算使用读取文件flights.txt然后获取一些数据,在代码中使用的,比如使用split方法来切割每一行,但是在代码中8.1下面一行中,使用cols[0]完全可以获取到London字符串,但是我直接将cols[0]放在new Select(driver.findElement(By.name(“fromPort”))).selectByVisibleText(cols[0]);运行时控制台老是报错显示找不到London,但是换成"London"就可以正常运行,这个暂时未解决
总结
本次功能测试中,耗时最多的应该是前期的各种准备和编写Selenium代码相关,很容易出现一些问题,但是整理理解Selenium运行机制的话,通过代码可以说是一目了然,关键通过定位的方式,来找到每个合适的位置,再根据代码中给出的指令或内容进行填写和选择.Selenium IDE是火狐浏览器的插件,发现也可以直接在浏览器就直接测试,上手容易,但是对测试脚本不是很熟悉,导致了测试功能没有做的很好
|