很多没有语言基础小伙伴学了一点selenium,会写“打开浏览器->输入搜索内容->点击百度一下”这种简单用例后就不知道怎么进阶了,下面以一个实际的例子介绍selenium怎么一步步进阶
安装eclipse或其他IDE
安装JDK,并配置系统变量(不会的百度)
创建Java项目,导入selenium的jar包
为了保护公司隐私,已改动url,所以该例子不能运行,参考代码即可
package com.kdzwy.cases1;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.Assert;
/*
*包名:com.kdzwy.cases
*作者:Adien_cui
*时间:2017-5-17 下午5:06:42
*描述:导入客户用例
**/
public class ImportCustomerCase {
public static void main(String[] args) throws Exception{
//设置chrome驱动器的地址
System.setProperty("webdriver.chrome.driver", "resource/chromedriver.exe");
ChromeDriver driver = new ChromeDriver();
//识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement 异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//浏览器窗口最大化
driver.manage().window().maximize();
//输入访问地址
driver.get("http://guanjia/zwy/entrance.html");
//通过id定位用户名输入框
WebElement usernameEle = driver.findElement(By.id("log-account"));
//调用WebElement的clear()方法,清空用户名输入框的数据
usernameEle.clear();
//调用WebElement的sendKeys()方法,输入用户名
usernameEle.sendKeys("13152640586");
//通过css定位密码输入框
driver.findElement(By.cssSelector("#log-pwd")).sendKeys("123456@");
driver.findElement(By.id("sub-btn")).click();
//线程停1s,等待页面加载
Thread.sleep(1000);
//设置导入客户名称为:AutoTest加上当前时间,从而使每次导入的客户名不相同
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
String currentTime = sdf.format(new java.util.Date());
String customerName = "AutoTest"+currentTime;
//通过xpath定位代账服务标签
driver.findElement(By.xpath("//span[text()='代账服务']")).click();
//点击下拉选项
driver.findElement(By.xpath("//*[@id='control-con']//div[@class='el-dropdown']")).click();
Thread.sleep(1500);
//获得“导入客户”元素,该元素直接点击会报“element not visible”,所以用js来执行点击事件
WebElement importBtn = driver.findElement(By.xpath("//ul[@class='el-dropdown-menu']//li[text()='导入客户']"));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].click()", importBtn);
//获取输入用户名文本框,并输入客户名
WebElement cusName = driver.findElementByXPath("(//*[@id='con-wraper']//form//input)[1]");
cusName.sendKeys(customerName);
//点击确定按钮
driver.findElement(By.xpath("//*[@id='con-wraper']/div[14]/div/div[3]/span/button[2]")).click();
//获取新增客户成功的提示语
String successTip = driver.findElement(By.xpath("//div[@class='el-message__group']//p[text()='新增客户成功']")).getText();
//验证提示语是否正确
Assert.assertEquals(successTip, "新增客户成功");
System.out.println("导入的客户名:"+customerName);
Thread.sleep(1000);
//关闭浏览器
driver.quit();
}
}
package com.kdzwy.cases1;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
/*
*包名:com.kdzwy.cases
*作者:Adien_cui
*时间:2017-5-24 下午4:39:17
*描述:搜索客户
**/
public class SearchCustomer {
public static void main(String[] args) throws Exception{
// 设置chrome驱动器的地址
System.setProperty("webdriver.chrome.driver",
"resource/chromedriver.exe");
ChromeDriver driver = new ChromeDriver();
// 识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement 异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// 浏览器窗口最大化
driver.manage().window().maximize();
// 输入访问地址
driver.get("http://guanjia/zwy/entrance.html");
// 通过id定位用户名输入框
WebElement usernameEle = driver.findElement(By.id("log-account"));
// 调用WebElement的clear()方法,清空用户名输入框的数据
usernameEle.clear();
// 调用WebElement的sendKeys()方法,输入用户名
usernameEle.sendKeys("13152640586");
// 通过css定位密码输入框
driver.findElement(By.cssSelector("#log-pwd")).sendKeys("123456@");
driver.findElement(By.id("sub-btn")).click();
Thread.sleep(1000);
//设置要搜索的客户名
String customerName = "AutoTest201705241653";
driver.findElement(By.xpath("//span[text()='代账服务']")).click();
//获取搜索文本框,并输入用户名
WebElement searchInput = driver.findElement(By.xpath("//input[@placeholder='企业名称/编号']"));
searchInput.clear();
searchInput.sendKeys(customerName);
//点击搜索
driver.findElement(By.xpath("//div[@class='el-input el-input--small el-input-group el-input-group--append']" +
"//button[@class='el-button el-button--default']")).click();
Thread.sleep(3000);
//获取搜索结果的第一个客户名称
String resultName = driver.findElement(By.xpath(".//*[@id='con-wraper']/div[1]/div[5]/div/div[2]/div[1]")).getText();
//验证搜索结果的第一个客户名称是否和输入的客户名相同
Assert.assertEquals(resultName, customerName);
driver.quit();
}
}
可以看到,上面这两个用例有很多重复的代码(如登录、获取当前时间等),现在把它们单独写个方法封装起来
package com.kdzwy.cases2;
import java.text.SimpleDateFormat;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
/*
*包名:com.kdzwy.cases2
*作者:Adien_cui
*时间:2017-5-24 下午5:19:40
*描述:封装公共的操作
**/
public class CommonMethods {
// 登录操作
public static void login(WebDriver driver,String userName,String password) {
// 输入访问地址
driver.get("http://guanjia/zwy/entrance.html");
// 通过id定位用户名输入框
WebElement usernameEle = driver.findElement(By.id("log-account"));
// 调用WebElement的clear()方法,清空用户名输入框的数据
usernameEle.clear();
// 调用WebElement的sendKeys()方法,输入用户名
usernameEle.sendKeys(userName);
// 通过css定位密码输入框
driver.findElement(By.cssSelector("#log-pwd")).sendKeys(password);
driver.findElement(By.id("sub-btn")).click();
}
//获取当期时间
public static String getCurrentTime(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
String currentTime = sdf.format(new java.util.Date());
return currentTime;
}
}
package com.kdzwy.cases2;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
/*
*包名:com.kdzwy.cases2
*作者:Adien_cui
*时间:2017-5-24 下午5:38:05
*描述:导入客户用例和搜索客户用例
**/
public class ImportAndSearchCase {
private static ChromeDriver driver;
public static void main(String[] args) throws Exception{
setUp();
testImportCustomer();
testSearchCustomer();
tearDown();
}
public static void setUp() {
// 设置chrome驱动器的地址
System.setProperty("webdriver.chrome.driver",
"resource/chromedriver.exe");
driver = new ChromeDriver();
// 识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement 异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// 浏览器窗口最大化
driver.manage().window().maximize();
// 调用封装后的登录方法,传入driver、用户名和密码
CommonMethods.login(driver, "13152640586", "123456@");
}
public static void tearDown() {
driver.quit();
}
public static void testImportCustomer() throws Exception {
// 线程停1s,等待页面加载
Thread.sleep(1000);
// 通过CommonMethods.getCurrentTime()获取当期时间
String customerName = "AutoTest" + CommonMethods.getCurrentTime();
// 通过xpath定位代账服务标签
driver.findElement(By.xpath("//span[text()='代账服务']")).click();
// 点击下拉选项
driver.findElement(By.xpath("//*[@id='control-con']//div[@class='el-dropdown']")).click();
Thread.sleep(1500);
// 获得“导入客户”元素,该元素直接点击会报“element not visible”,所以用js来执行点击事件
WebElement importBtn = driver.findElement(By.xpath("//ul[@class='el-dropdown-menu']//li[text()='导入客户']"));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click()", importBtn);
// 获取输入用户名文本框,并输入客户名
WebElement cusName = driver.findElementByXPath("(//*[@id='con-wraper']//form//input)[1]");
cusName.sendKeys(customerName);
// 点击确定按钮
driver.findElement(By.xpath("//*[@id='con-wraper']/div[14]/div/div[3]/span/button[2]")).click();
// 获取新增客户成功的提示语
String successTip = driver.findElement(By.xpath("//div[@class='el-message__group']//p[text()='新增客户成功']")).getText();
// 验证提示语是否正确
Assert.assertEquals(successTip, "新增客户成功");
System.out.println("导入的客户名:" + customerName);
}
public static void testSearchCustomer() throws Exception {
Thread.sleep(1000);
// 设置要搜索的客户名
String customerName = "AutoTest201705241653";
driver.findElement(By.xpath("//span[text()='代账服务']")).click();
// 获取搜索文本框,并输入用户名
WebElement searchInput = driver.findElement(By.xpath("//input[@placeholder='企业名称/编号']"));
searchInput.clear();
searchInput.sendKeys(customerName);
// 点击搜索
driver.findElement(By.xpath("//div[@class='el-input el-input--small el-input-group el-input-group--append']"
+ "//button[@class='el-button el-button--default']")).click();
Thread.sleep(3000);
// 获取搜索结果的第一个客户名称
String resultName = driver.findElement(By.xpath(".//*[@id='con-wraper']/div[1]/div[5]/div/div[2]/div[1]")).getText();
// 验证搜索结果的第一个客户名称是否和输入的客户名相同
Assert.assertEquals(resultName, customerName);
}
}
可以看到搜索客户的用例中customerName是写死的,如果我们想搜索刚刚导入的客户,就可以写Customer对象把customerName存到里面
package com.kdzwy.cases2;
/*
*包名:com.kdzwy.cases2
*作者:Adien_cui
*时间:2017-5-25 上午10:19:24
*描述:客户对象
**/
public class Customer {
private static String customerName;
public static String getCustomerName() {
return customerName;
}
public static void setCustomerName(String customerName) {
Customer.customerName = customerName;
}
}
在导入客户时把客户名传入Customer.java,搜索客户从Customer.java获取客户名
代码片如下:
package com.kdzwy.cases2;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
/*
*包名:com.kdzwy.cases2
*作者:Adien_cui
*时间:2017-5-24 下午5:38:05
*描述:导入客户用例和搜索客户用例,从Customer.java获取客户名
**/
public class ImportAndSearchCase2 {
private static ChromeDriver driver;
public static void main(String[] args) throws Exception{
setUp();
testImportCustomer();
testSearchCustomer();
tearDown();
}
...
public static void testImportCustomer() throws Exception {
...
// 验证提示语是否正确
Assert.assertEquals(successTip, "新增客户成功");
System.out.println("导入的客户名:" + customerName);
//---------导入客户成功后设置客户名到Customer.java
Customer.setCustomerName(customerName);
}
public static void testSearchCustomer() throws Exception {
Thread.sleep(1000);
// 设置要搜索的客户名
//---------通过Customer.java获取客户名
String customerName =Customer.getCustomerName();
driver.findElement(By.xpath("//span[text()='代账服务']")).click();
// 获取搜索文本框,并输入用户名
...
}
}
package com.kdzwy.case3;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import com.kdzwy.cases2.CommonMethods;
import com.kdzwy.cases2.Customer;
/*
*包名:com.kdzwy.case3
*作者:Adien_cui
*时间:2017-5-25 上午10:27:31
*描述:代账服务自动化用例
**/
public class AgencyServiceCase {
private static ChromeDriver driver;
@BeforeClass
public static void setUp() {
// 设置chrome驱动器的地址
System.setProperty("webdriver.chrome.driver","resource/chromedriver.exe");
driver = new ChromeDriver();
// 识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement 异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// 浏览器窗口最大化
driver.manage().window().maximize();
// 调用封装后的登录方法,传入driver、用户名和密码
CommonMethods.login(driver, "13152640586", "123456@");
}
@AfterClass
public static void tearDown() {
driver.quit();
}
@Test
public static void testImportCustomer() throws Exception {
// 线程停1s,等待页面加载
Thread.sleep(1000);
// 通过CommonMethods.getCurrentTime()获取当期时间
String customerName = "AutoTest" + CommonMethods.getCurrentTime();
// 通过xpath定位代账服务标签
driver.findElement(By.xpath("//span[text()='代账服务']")).click();
// 点击下拉选项
driver.findElement(By.xpath("//*[@id='control-con']//div[@class='el-dropdown']")).click();
Thread.sleep(1500);
// 获得“导入客户”元素,该元素直接点击会报“element not visible”,所以用js来执行点击事件
WebElement importBtn = driver.findElement(By.xpath("//ul[@class='el-dropdown-menu']//li[text()='导入客户']"));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click()", importBtn);
// 获取输入用户名文本框,并输入客户名
WebElement cusName = driver.findElementByXPath("(//*[@id='con-wraper']//form//input)[1]");
cusName.sendKeys(customerName);
// 点击确定按钮
driver.findElement(By.xpath("//*[@id='con-wraper']/div[14]/div/div[3]/span/button[2]")).click();
// 获取新增客户成功的提示语
String successTip = driver.findElement(By.xpath("//div[@class='el-message__group']//p[text()='新增客户成功']")).getText();
// 验证提示语是否正确
Assert.assertEquals(successTip, "新增客户成功");
System.out.println("导入的客户名:" + customerName);
Customer.setCustomerName(customerName);
}
@Test
public static void testSearchCustomer() throws Exception {
Thread.sleep(1000);
// 设置要搜索的客户名
String customerName =Customer.getCustomerName();
driver.findElement(By.xpath("//span[text()='代账服务']")).click();
// 获取搜索文本框,并输入用户名
WebElement searchInput = driver.findElement(By.xpath("//input[@placeholder='企业名称/编号']"));
searchInput.clear();
searchInput.sendKeys(customerName);
// 点击搜索
driver.findElement(By.xpath("//div[@class='el-input el-input--small el-input-group el-input-group--append']"
+ "//button[@class='el-button el-button--default']")).click();
Thread.sleep(3000);
// 获取搜索结果的第一个客户名称
String resultName = driver.findElement(By.xpath(".//*[@id='con-wraper']/div[1]/div[5]/div/div[2]/div[1]")).getText();
// 验证搜索结果的第一个客户名称是否和输入的客户名相同
Assert.assertEquals(resultName, customerName);
}
}
TestNG注解:使用@BeforeClass注解的方法会在该类的所有测试方法之前执行,@Test注解的方法表示该方法是一个测试用例,使用@AfterClass注解的方法会在该类的所有测试方法之后执行
<suite name="web自动化测试" >
<test name="代账服务自动化测试">
<classes>
<class name="com.kdzwy.case3.AgencyServiceCase" />
<methods>
<include name="testImportCustomer" />
<include name="testSearchCustomer" />
methods>
classes>
test>
suite>
……下次介绍PageObject模式及用例失败自动截图