今天学校发布了2017大学生软件测试大赛,突然想起本科阶段曾做过一个自动化测试的练习,于是回忆一下。该文章主要分成2个部分,selenium简介和一个小demo源码。
selenium简介
selenium是一种自动化功能测试工具,中文名为“硒”,是一种化学元素的名字,它对汞(Mercury)有天然的解毒作用,实验表明汞暴露水平越高,硒对汞毒性的拮抗作用越明显,所以说硒是汞的克星。Mercury 测试工具系列(QTP,QC,LR,WR…)功能强大,但却价格不菲,大家对此又爱又恨,故thoughtworks 特意把他们的Web 开源测试工具命名为Selenium,以此帮助大家脱离汞毒。
Selenium 使用灵活、简单,写出的测试案例非常简洁、优美、易于维护。Selenium RC支持用多种语言编写测试案例,可以用VS写测试案例。相比于QTR,它更加容易整合到测试平台中。
selenium常用工具有IDE + selenium RC,安装只需要直接将selenium-ide-*.xpi拖入firefox中,重启即可。在IDE中可以开始/停止录制,回放测试用例,查看要操作的元素及使用的值等。
小demo
练习使用的是selenium2,测试订票功能并截图,使用Junit测试,代码如下:
package com.jlxy.demo;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
import junit.framework.TestCase;
public class Demo extends TestCase{
WebDriver driver = new FirefoxDriver();
protected void setUp(){
String url ="http://127.0.0.1:1080/WebTours";
driver.get(url);
}
public void testOrderticket(){
String title = driver.getTitle();
assertEquals("Web Tours",title); //验证title
driver.switchTo().frame("body");
driver.switchTo().frame("info");
WebElement element = driver.findElement(By.linkText("administration")); //获取administration超链接
System.out.println(element.getAttribute("href")); //输出url
//登陆
driver.switchTo().defaultContent();
driver.switchTo().frame("body");
driver.switchTo().frame("navbar");
WebElement usr = driver.findElement(By.name("username"));
WebElement psd = driver.findElement(By.name("password"));
usr.sendKeys("01014");
psd.sendKeys("01014");
WebElement button = driver.findElement(By.name("login"));
button.click();
//得到当前页面下所有的cookies,并且输出它们的所在域、name、value、有效日期和路径
Set<Cookie> cookies = driver.manage().getCookies();
System.out.println(String.format("Domain -> name -> value -> expiry -> path"));
for (Cookie c : cookies)
System.out.println(String.format("%s -> %s -> %s -> %s -> %s",
c.getDomain(), c.getName(), c.getValue(), c.getExpiry(),c.getPath()));
//设置隐式等待
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//点击Flights
driver.switchTo().defaultContent();
driver.switchTo().frame("body");
driver.switchTo().frame("navbar");
WebElement figButton = driver.findElement(By.xpath("html/body/center/center/a[1]/img"));
figButton.click();
//选择往返城市
driver.switchTo().defaultContent();
driver.switchTo().frame("body");
driver.switchTo().frame("info");
Select selectDepart = new Select(driver.findElement(By.name("depart")));
selectDepart.selectByIndex(3); //索引值定位
Select selectArrival = new Select(driver.findElement(By.name("arrive")));
selectArrival.selectByValue("Seattle"); //属性值定位
//选择往返时间
WebElement returnDate = driver.findElement(By.name("returnDate"));
Calendar c = Calendar.getInstance(); //使用系统时间
c.add(Calendar.MONTH, 1);
int month = c.get(Calendar.MONTH)+1;
int day = c.get(Calendar.DAY_OF_MONTH);
int year = c.get(Calendar.YEAR);
String t = Integer.toString(month)+"/"+Integer.toString(day)+"/"+Integer.toString(year);
returnDate.clear();
returnDate.sendKeys(t);
//往返票
WebElement checkbox = driver.findElement(By.name("roundtrip"));
checkbox.click();
WebElement cont1 = driver.findElement(By.name("findFlights"));
cont1.click();
//默认航班
WebElement cont2 = driver.findElement(By.name("reserveFlights"));
cont2.click();
//填写个人信息
WebElement firName = driver.findElement(By.name("firstName"));
WebElement lastName = driver.findElement(By.name("lastName"));
WebElement credCard = driver.findElement(By.name("creditCard"));
firName.sendKeys("Hu");
lastName.sendKeys("Yang");
credCard.sendKeys("6222024301071119876");
WebElement cont3 = driver.findElement(By.name("buyFlights"));
cont3.click();
//截图
try {
Thread.sleep(900);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
File screenShotFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(screenShotFile, new File("E:/invoice.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//取消所定的最后一个票
driver.switchTo().defaultContent();
driver.switchTo().frame("body");
driver.switchTo().frame("navbar");
WebElement itinerartButton = driver.findElement(By.xpath("html/body/center/center/a[2]/img"));
itinerartButton.click(); //点击Itinerary
driver.switchTo().defaultContent();
driver.switchTo().frame("body");
driver.switchTo().frame("info");
WebElement checkbox1 = driver.findElement(By.xpath("html/body/blockquote/form/center/table[1]/tbody/tr[last()-3]/td[1]/b/label/input"));
checkbox1.click();
WebElement cancelButton = driver.findElement(By.name("removeFlights"));
cancelButton.click();
//延时查看取消结果
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//注销
driver.switchTo().defaultContent();
driver.switchTo().frame("body");
driver.switchTo().frame("navbar");
WebElement logout = driver.findElement(By.xpath("html/body/center/center/a[4]/img"));
logout.click();
}
protected void tearDown(){
driver.quit();
}
}