【WebDriver】selenium自动化测试入门到进阶 一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/galen2016/article/details/72730754
很多没有语言基础小伙伴学了一点selenium,会写“打开浏览器->输入搜索内容->点击百度一下”这种简单用例后就不知道怎么进阶了,下面以一个实际的例子介绍selenium怎么一步步进阶

环境搭建

安装eclipse或其他IDE
安装JDK,并配置系统变量(不会的百度)
创建Java项目,导入selenium的jar包

两个最基本用例

为了保护公司隐私,已改动url,所以该例子不能运行,参考代码即可

1、导入客户用例

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();
    }
}

2、搜索客户用例

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;
    }
}

进一步封装,通过main方法调用多个用例

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);
    }
}

JavaBean的编写

可以看到搜索客户的用例中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();
        // 获取搜索文本框,并输入用户名
        ...
    }
}

执行测试,脱离脚本阶段

使用testng框架组织测试用例

为测试方法加上testng注解

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注解的方法会在该类的所有测试方法之后执行

在src目录下创建testng.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<suite name="web自动化测试" >
    <!-- <parameter name ="url" value="mgray"/> -->
     <test name="代账服务自动化测试">
        <classes>
             <class name="com.kdzwy.case3.AgencyServiceCase" />
                <methods>
                    <include name="testImportCustomer" />
                    <include name="testSearchCustomer" />
                </methods>
        </classes>
    </test>   
</suite>

选中testng.xml右键->运行->TestNG Suite,查看测试结果

这里写图片描述

项目的目录结构如下

这里写图片描述

……下次介绍PageObject模式及用例失败自动截图

没有更多推荐了,返回首页