我的收藏

Web自动化测试(Java语言)

2019-08-13  本文已影响0人  DayBreakL

UI自动化的价值

自动化测试工具选型

框架名称 支持语言 支持浏览器 是否可录制 费用 入门成本 IDE 优缺点
selenium 多语言 多浏览器 支持 开源免费 selenium IDE 开源免费,多语言,跨平台,比较重,需要掌握一门编程语言
QTP vbscript IE、火狐 支持 商业收费(无限试用) UFT http://www.51testing.com/html/35/n-863435.html
watir Ruby 多浏览器 不支持 开源免费 ruby代码库,无IDE 小巧灵活、收费、学习成本高
sahi 多语言 多浏览器 支持 开源收费(有免费版) Twist https://sahipro.com/sahi-vs-selenium/

Selenium介绍

是一个用于Web应用程序测试的工具,直接运行在浏览器中,模拟真实用户操作。

  • Selenium 1(又叫Selenium RC或遥控器),需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。Selenium 1已被弃用。
  • Selenium 2(又叫Selenium WebDriver),是Selenium和WebDriver这两个项目合并而成,主要新功能是集成WebDriver API。除了解决Selenium-RC API中的一些限制之外,WebDriver还旨在提供更简单,更简洁的编程接口。由于使用的是浏览器原生的API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身.然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提供不同的实现。

环境搭建

IDEA+Maven+selenium+TestNG

浏览器及浏览器驱动

Chrome浏览器+Chrome浏览器驱动

前置知识-HTML、CSS

Demo演示

public class FirstDemo {
    public static void main(String[] args) {
        //设置系统变量(浏览器驱动名称,相对路径)
        System.setProperty("webdriver.chrome.driver","src/main/resources/driver/chromedriver");
        //实例化WebDriver,启动浏览器
        WebDriver driver = new ChromeDriver();
        //在浏览器中输入网址,并打开网页
        driver.get("https://www.jianshu.com/");
        //找到要操作的元素,该元素的id是sign_up
        WebElement welcome =driver.findElement(By.id("sign_up"));
        //点击该元素
        welcome.click();
        //关闭浏览器
        driver.quit();
        //关闭浏览器驱动
        driver.close();
    }
}

元素定位基础

通过id定位
通过name定位
通过classname定位
通过linkText定位

WebDriver基础API

动作-无返回值
获取属性值-有返回值

自动化流程控制

小练习

使用上面的知识进入testerhome社区,输入用户名、密码进行登录。

public class SecondDemo {
    public static void main(String[] args) {
        //设置系统变量(浏览器驱动名称,相对路径)
        System.setProperty("webdriver.chrome.driver","src/main/resources/driver/chromedriver");
        //实例化WebDriver,启动浏览器
        WebDriver driver = new ChromeDriver();
        //设置隐式等待
        driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
        //在浏览器中输入网址,并打开网页
        driver.get("https://testerhome.com/");
        //进入登录页面
        driver.findElement(By.linkText("登录")).click();
        //用户名

            //设置隐式等待
        try {
            WebDriverWait wait = new WebDriverWait(driver, 3);
            WebElement name=wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("user_login")));
            name.clear();
            name.sendKeys("leitianxiao");
        }catch (Exception e){
            System.out.println("找不到元素,错误信息为:"+e);
        }
        //密码
        WebElement pwd=driver.findElement(By.id("user_password"));
        pwd.clear();
        //打码了,自己填入自己的密码
        pwd.sendKeys("*******");
        //点击提交登录信息
        driver.findElement(By.name("commit")).click();
        //关闭浏览器
        driver.quit();
        //打印是否执行完所有代码
        System.out.println("passed");
    }
}

Chrome Headless模式(无头浏览器)

多浏览器

元素定位进阶CSS

元素定位进阶XPath

CSS定位和XPath定位

测试框架引入-TestNG

PageObject设计模式

Page Object模式是使用Selenium的广大同行最为公认的一种设计模式。在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织。
Page Object模式的核心理念是,以页面(Web Page或Native App Page)为单位来封装页面上的控件以及控件的部分操作。而测试用例,更确切的是操作函数,基于页面封装对象来完成具体的界面操作,最典型的模式“XXXPage.YYYComponent.ZZZOperation”

代码改造

public class HomePage {
    //页面需要操作的元素
    @FindBy(linkText="登录")
    WebElement loginLink;
    //构造器
    public HomePage(WebDriver driver){
        PageFactory.initElements(driver,this);
    }
    public void clickLogin(){
        //对元素的操作
        loginLink.click();
        //日志
        Reporter.log("点击登录链接",true);
    }
}
public class LoginPage {
    WebDriver driver;
    //页面的元素
    @FindBy(id="user_login")
    WebElement inputUserName;

    @FindBy(id="user_password")
    WebElement inputPassword;

    @FindBy(name="commit")
    WebElement buttonLogin;

    //构造器
    public LoginPage(WebDriver driver){
        this.driver=driver;
        PageFactory.initElements(driver,this);
    }

    //对元素的操作
    public void inputUserName(String loginName){
        //显式等待
        WebDriverWait wait = new WebDriverWait(driver, 3);
        wait.until(ExpectedConditions.visibilityOf(inputUserName));
        inputUserName.clear();
        inputUserName.sendKeys(loginName);
        Reporter.log("输入用户名",true);
    }
    public void inputPassword(String loginPwd){
        inputPassword.clear();
        inputPassword.sendKeys(loginPwd);
        Reporter.log("输入密码",true);
    }
    public void buttonLogin(){
        buttonLogin.click();
        Reporter.log("点击登录按钮",true);
    }
}
public class Business {
    WebDriver driver;
    @BeforeMethod
    public void startUp(){
        //设置系统变量(浏览器驱动名称,相对路径)
        System.setProperty("webdriver.chrome.driver","src/main/resources/driver/chromedriver");
        driver = new ChromeDriver();
        //设置隐式等待
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    @Test()
    public void login(){
        //在浏览器中输入网址,并打开网页
        driver.get("https://testerhome.com/");
        //PO模式改造部分分割线 ----------
        //进入首页
        HomePage homePage=new HomePage(driver);
        //点击登录链接
        homePage.clickLogin();
        //进入登录页面
        LoginPage loginPage=new LoginPage(driver);
        //用户名
        loginPage.inputUserName("leitianxiao");
        //密码
        loginPage.inputPassword("******");
        //点击提交登录信息
        //PO模式改造部分分割线 ----------
        loginPage.buttonLogin();
        //点击个人头像
        driver.findElement(By.cssSelector("a[href='#']>img")).click();
        //获取用户名
        String actual=driver.findElement(By.cssSelector("a[href='/leitianxiao']")).getText();
        //断言用户名
        Assert.assertEquals(actual,"leitianxiao");
    }
    @AfterMethod
    public void quit(){
        //关闭浏览器
        driver.quit();
        //打印是否执行完所有代码
        System.out.println("passed");
    }
}

Selenium进阶API

public void actionsDemo(){
        Actions actions=new Actions(driver);
        //鼠标单击
        actions.click();
        //双击
        actions.doubleClick();
        //保持单击
        actions.clickAndHold();
        //鼠标松开,与clickAndHold搭配使用
        actions.release();
        //鼠标右击
        actions.contextClick();
        //按下enter键
        actions.keyDown(Keys.ENTER);
        //松开enter键
        actions.keyUp(Keys.ENTER);
        //按下、松开enter键
        actions.sendKeys(Keys.ENTER);
    }
上一篇下一篇

猜你喜欢

热点阅读