基于Selenium的Web应用功能测试

您所在的位置:网站首页 飞机登录流程 基于Selenium的Web应用功能测试

基于Selenium的Web应用功能测试

2024-07-11 07:46:09| 来源: 网络整理| 查看: 265

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,准备下载   在这里插入图片描述首先对下载页面中部分内容进行简单解释说明一下   在这里插入图片描述在这里插入图片描述在这里插入图片描述    - 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是火狐浏览器的插件,发现也可以直接在浏览器就直接测试,上手容易,但是对测试脚本不是很熟悉,导致了测试功能没有做的很好


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭