【测试】自动化测试

目录

1.自动化测试

1.1简介

1.2分类

1.2.1单元测试

1.2.2接口自动化

1.2.3UI自动化

2.Selenium

2.1简介

[2.2webdriver API](#2.2webdriver API)

2.2.1css定位器

2.2.2Xpath定位

2.2.3标签定位

2.2.4关闭浏览器

2.3操作测试对象

2.4添加等待

2.4.1sleep休眠

2.4.2隐式等待

2.5打印信息

2.6浏览器操作

2.7键盘事件

2.7.1键盘按键

2.7.2键盘组合键

2.8鼠标事件

2.9切换窗口

2.10截图

2.11定位一组元素

2.12下拉框

[2.13alert、confirm、prompt 的处理](#2.13alert、confirm、prompt 的处理)


1.自动化测试

1.1简介

定义:即软件测试的自动化,将人为驱动的测试行为转化为机器执行的过程。在预设状态下运行 应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。

1.2分类

自动化测试包括UI自动化,接口自动化,单元测试自动化。按照这个金字塔模型来进行自动化测试规划,可以产生最佳的自贡话测试产出投入比(ROI),用较少的投入获得很好的收益。

1.2.1单元测试

投入成本最大的测试,运行评率较高。

tips:java的单元测试框架是Junit。

1.2.2接口自动化

即API测试,相对于UI自动化,API自动化更加容易实现,执行起来也更稳定。

接口自动化特点:

  • 可在产品前期,接口完成后介入
  • 用例维护量小
  • 适合接口变动较小,界面变动频繁的项目

常见测试工具:RobotFramework,JMeter,SoapUI,TestNG+HttpClient,Postman

1.2.3UI自动化

虽然测试金字塔告诉我们尽量多做API层(即接口层)的自动化测试,但是UI层的自动化测试更加贴近用户的需求和软件系统的实际业务。且有时候不得不进行UI层的测试。

UI自动化特点:

  • 页面相关性强,必须后期项目页面开发完成后介入
  • 用例维护量大
  • 适合界面变动较小的项目

UI自动化优点:

  • 降低大型系统由于变更或多期开发引起的大量回归测试的人力投入
  • 减少重复测试的时间,实现快速回归测试
  • 创建优良可靠的测试过程,减少人为错误
  • 可以运行更多更繁琐的测试
  • 可执行一些手工测试困难或不可能进行的测试
  • 更好的利用资源
  • 测试脚本的重用性

UI自动化适用对象:需求变动不频繁、项目周期足够长、自动化测试脚本可重复使用。

UI自动化测试框架:框架较多,如Windows客户端测试的AutoIT,Web测试的selenium以及 TestPlant eggPlant,Robot framework,QTP等。

下面以 Web UI自动化测试框架的Selenium为例进行详细介绍。

2.Selenium

2.1简介

定义:Web应用中基于UI的自动化测试框架,即做UI自动化测试的一个工具。

优点:

  • 免费,可查看源码
  • 支持各大浏览器(Edge、Chrome、Opera)
  • 跨平台(Linux、Windows、Mac)
  • 有丰富的API

三个角色:

  • 自动化脚本代码(IDEA中编写)
  • 驱动,有驱动可对页面进行操作
  • 浏览器

2.2webdriver API

元素的定位:对象的定位是自动化测试的核心,想要操作一个对象,首先要识别该对象。对象和 人一样,有各种的特征(属性),我们可以通过这些特征找到对象。

2.2.1css定位器

css选择器参考手册

  • 类选择器:.class值(.s_ipt)
  • id选择器:#id值(#kw)
  • 父类选择器 子类选择器:父类选择器表达式 子类选择器表达式(#s_kw_wrap #kw)
  • 标签选择器:标签名(form)

2.2.2Xpath定位

xpath参考手册

绝对路径:以 / 开头 (/html/body/div/div/div)

相对路径:以 // 开头

  • +索引://form/span[1]/input
  • +属性值://input[@class="s_ipt"]
  • +通配符://*[@*="s_ipt"]
  • +文本匹配://span[text()="百度一下"]

2.2.3标签定位

顾名思义,写入标签名即可,如input,button......

2.2.4关闭浏览器

  • quit():关闭浏览器窗口,并彻底退出webdriver,释放与driverserver之间的连接。
  • close():关闭浏览器窗口。

java 复制代码
public class Main {
    private static void Test01() {
        //创建一个驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com");

        // 定位百度搜索框
        // 1.通过css选择器定位
//      WebElement search_input =  webDriver.findElement(By.cssSelector(".s_ipt"));
        // 2.通过Xpath定位
//      WebElement search_input = webDriver.findElement(By.xpath("//form/span[1]/input"));
        // 3.通过标签定位
        WebElement search_input = webDriver.findElement(By.tagName("input"));

        // 判断是否查找成功
        if (search_input == null) {
            System.out.println("测试失败");
        }else {
            System.out.println("测试通过");
        }

        // 关闭浏览器
        webDriver.quit(); // 关的更彻底,所有信息全部删除(推荐)
//      webDriver.close();
    }
}

2.3操作测试对象

定位之后就可以对这个元素进行操作,常见操作方法如下:

  • click:点击对象
  • send_keys:在对象上模拟按键输入
  • clear:清除对象输入的文本内容
  • submit:提交
  • text:获取元素的文本信息
  • get:打开网页
java 复制代码
private static void Test02() throws InterruptedException {
    // 创建一个浏览器驱动
    WebDriver webDriver = new ChromeDriver();
    // 打开百度首页
    webDriver.get("https://www.baidu.com/");
    // 找到搜索输入框
    WebElement search_input = webDriver.findElement(By.cssSelector("#kw"));
    // 向搜索输入框中输入"软件测试"
    search_input.sendKeys("软件测试");
    // 找到"百度一下"
    WebElement baidu_button = webDriver.findElement(By.cssSelector("#su"));
    // 点击"百度一下"按钮
    baidu_button.click();
    // 等待
    sleep(3000);
    // 找到页面上所有与"软件测试"相关的元素
    List<WebElement> search_results = webDriver.findElements(By.cssSelector("a em"));
    // 遍历List
    for (int i = 0; i < search_results.size(); i++) {
        if (search_results.get(i).getText().equals("软件测试")){
            System.out.println("测试通过");
        }else {
            System.out.println("测试失败");
        }
    }
}

click() 与 submit() 的区别:submit操作的元素需要放到form标签中,否则会报错;click没有 这个限制,所以推荐使用click。

  • getText:获取文本
  • getAttribute:获取元素属性值
java 复制代码
private static void Test03() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("互联网各大行业");
    webDriver.findElement(By.cssSelector("#su")).click();
    sleep(3000);
    webDriver.findElement(By.cssSelector("#kw")).clear();
    sleep(3000);
    webDriver.findElement(By.cssSelector("#result_logo > img.index-logo-src")).click();
    sleep(3000);
//      String baidu_button_txt = webDriver.findElement(By.cssSelector("#su")).getText(); //测试不通过
    String baidu_button_txt = webDriver.findElement(By.cssSelector("#su")).getAttribute("value"); //测试通过
    if (baidu_button_txt.equals("百度一下")) {
        System.out.println("测试通过");
    }else {
        System.out.println("测试不通过");
    }
    webDriver.quit();
}

2.4添加等待

2.4.1sleep休眠

引入 time 包,添加固定休眠时间,单位秒(s)。

java 复制代码
import time
time.sleep(3)

2.4.2隐式等待

添加 implicitly_wait() 方法,实现智能等待。

java 复制代码
selenium.webdriver.remote.webdriver.implicitly_wait(time_to_wait)

time_to_wait 是设置的等待时长。

隐式等待并非等待固定的时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则以轮询的方式不断判断元素是否被定位到,直到超出设置的等待时长。

2.5打印信息

  • 打印title:getTitle ()
  • 打印url:getCurrentUrl ()
java 复制代码
private static void Test04() {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    
    String title = webDriver.getTitle();
    if (title.equals("百度一下,你就知道")) {
        System.out.println("测试通过");
    }else {
        System.out.println("测试不通过");
    }
    
    String url = webDriver.getCurrentUrl();
    if (url.equals("https://www.baidu.com/")) {
        System.out.println("测试通过");
    }else {
        System.out.println("测试不通过");
    }
    webDriver.quit();
}

2.6浏览器操作

  • 浏览器最大化:manage().window().maximize()
  • 设置浏览器大小:manage().window().setSize(new Dimension(x, y))
  • 浏览器前进:navigate().forward()
  • 浏览器后退:navigate().back()
  • 操作浏览器滚动条:executeScript("document.documentElement.scrollTop= x ")
java 复制代码
private static void Test05() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    //浏览器最大化
    webDriver.manage().window().maximize();
    sleep(3000);
    //设置浏览器大小200*200
    webDriver.manage().window().setSize(new Dimension(800,600));
    sleep(3000);
    //输入"张三"
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("张三");
    //点击"百度一下"按钮
    webDriver.findElement(By.cssSelector("#su")).submit();
    //浏览器后退
    webDriver.navigate().back();
    sleep(3000);
    //浏览器前进
    webDriver.navigate().forward();
    sleep(3000);
    //浏览器滚动条划到最下面
    ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
    sleep(3000);
    //浏览器滚动条划到最上面
    ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=0");
    sleep(3000);
    //定位到"换一换"这个元素
    String expect_str = webDriver.findElement(By.cssSelector("#hotsearch-refresh-btn > span")).getText();
    //如果这个按钮存在,测试通过
    if (expect_str.equals("换一换")) {
        System.out.println("测试通过");
    }else {
        System.out.println("测试不通过");
    }
    webDriver.quit();
}

2.7键盘事件

2.7.1键盘按键

  • TAB:tab
  • ENTER:回车
  • SPACE:空格键
  • ESCAPE:回退键

这里只拿ENTER举例:

java 复制代码
private static void Test06() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    //输入蛋糕
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("蛋糕");
    sleep(3000);
    //回车
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.);
    sleep(3000);
    //校验
    List<WebElement> webElements = webDriver.findElements(By.xpath("//font[text()=\"蛋糕\"]"));
    sleep(3000);
    //寻到搜索结果
    int flag = 0;
    for (int i = 0; i < webElements.size(); i++) {
        if (webElements.get(i).getText().equals("蛋糕")) {
            flag = 1;
            break;
        }
    }
    if (flag == 1) {
        System.out.println("测试通过");
    }else {
        System.out.println("测试不通过");
    }
    webDriver.quit();
}

2.7.2键盘组合键

  • CONTROL,''a'':全选
  • CONTROL,''c'':复制
  • CONTROL,''x'':剪切
  • CONTROL,''v'':粘贴
java 复制代码
private static void Test07() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    //输入蛋糕
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("蛋糕");
    sleep(3000);
    //Ctrl+A
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"a");
    sleep(3000);
    //Ctrl+X
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"x");
    sleep(3000);
    //Ctrl+V
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"v");
    sleep(3000);
    //点击"百度一下"按钮
    webDriver.findElement(By.cssSelector("#su")).click();
    //校验
    String no_expected_url = "https://www.baidu.com/";
    String cur_url = webDriver.getCurrentUrl();
    //此时已经不在百度首页界面了
    if (cur_url.equals(no_expected_url)) {
        System.out.println("测试不通过");
    }else {
        System.out.println("测试通过");
    }
    webDriver.quit();
}

2.8鼠标事件

  • contextClick:右击
  • doubleClick:双击
  • dragAndDrop:拖动
  • moveToElement:移动

这里只拿contextClick举例:

java 复制代码
private static void Test08() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    //输入"企业微信"并搜索
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("企业微信");
    webDriver.findElement(By.cssSelector("#su")).click();
    sleep(3000);
    //鼠标操作
    //先创建一个actions
    Actions actions = new Actions(webDriver);
    sleep(3000);
    //找到目标元素(按钮)
    WebElement target = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
    sleep(3000);
    //鼠标挪动到按钮上右击
    actions.moveToElement(target).contextClick().perform();
    webDriver.quit();
}

2.9切换窗口

情景:在"百度首页"窗口点击"新闻"超链接,在"新闻"界面搜索框中输入"经济头条"并搜索。

结果:报错,错误原因是 没找到 #ww 这个css

原因:这是因为点击"新闻"超链接后打开了新的页面,而css检索还是在原来的"百度一下"界面中, 这时候就需要切换窗口。

java 复制代码
private static void Test09() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    //找到"新闻"按钮
    webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
    sleep(3000);
    //获得当前的窗口句柄
    String cur_handle = webDriver.getWindowHandle();
    System.out.println("当前窗口句柄:" + cur_handle);
    //获取浏览器当前所有的窗口句柄
    Set<String> all_handles = webDriver.getWindowHandles();
    String target = "";
    //遍历浏览器当前所有的窗口句柄
    for (String tmp : all_handles) {
        if (!tmp.equals(cur_handle)) {
            webDriver.switchTo().window(tmp);
        }
    }
    sleep(3000);
    //找到新闻搜索框并输入"经济头条"
    webDriver.findElement(By.cssSelector("#ww")).sendKeys("经济头条");
    //点击"百度一下"
    webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
    sleep(3000);
    //找到搜索结果
    List<WebElement> webElements = webDriver.findElements(By.xpath("//em[text=\"经济\"]"));
    sleep(3000);
    //遍历搜索结果
    int flag = 0;
    for (int i = 0; i < webElements.size(); i++) {
        if (webElements.get(i).getText().equals("经济") || webElements.get(i).getText().equals("头条")) {
            flag = 1;
            break;
        }
    }
    if (flag == 1) {
        System.out.println("测试通过");
    }else {
        System.out.println("测试不通过");
    }
    webDriver.quit();
}

2.10截图

需要导入Maven中央仓库中的Apache Commons IO 到 .pom文件中。

java 复制代码
private static void Test10() throws InterruptedException, IOException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    //输入"字节跳动"并搜索
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("字节跳动");
    webDriver.findElement(By.cssSelector("#su")).click();
    sleep(3000);
    //截图,把截的图放到file临时变量中
    File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
    //把file放到指定路径D盘中
    FileUtils.copyFile(file, new File("D://截图2024-6-3.png"));
    webDriver.quit();
}

2.11定位一组元素

webdriver 可以很方便地使用findElement 方法来定位某个特定的对象,不过有时候我们需要定位一组对象,这时候就需要使用findElements 方法。

2.12下拉框

对于一般的元素,只需要一次定位,但下拉框里的内容需要进行两次定位。先定位到下拉框,对下拉框进行操作后,再定位到下拉框内里的选项。

2.13alert、confirm、prompt 的处理

  • text:返回alert/confirm/prompt 中的文字信息
  • accept:确认按钮
  • dismiss:取消按钮
  • send_keys:输入值,若alert无对话框则不可用

..........

后续见下一篇【测试】Selenium

相关推荐
奶茶精Gaaa3 小时前
AI实战(二)生成ui自动化
功能测试·学习·自动化
厦门辰迈智慧科技有限公司4 小时前
高边坡自动化监测要点分析
自动化·高边坡监测·边坡监测
酉鬼女又兒6 小时前
入门前端CSS 媒体查询全解析:从入门到精通,打造完美响应式布局(可用于备赛蓝桥杯Web应用开发)
前端·css·职场和发展·蓝桥杯·前端框架·html5·媒体
rosmis7 小时前
自动化文献检索与下载工作流:基于 Playwright 的 RPA 实践方案
运维·自动化·rpa
柯儿的天空8 小时前
【OpenClaw 全面解析:从零到精通】第 016 篇:OpenClaw 实战案例——代码开发助手,从代码生成到部署自动化的全流程
运维·人工智能·ai作画·自动化·aigc·ai写作
我科绝伦(Huanhuan Zhou)8 小时前
从自动化到自主化—AI Agent引领的运维范式变革
运维·人工智能·自动化
结网的兔子8 小时前
前端学习笔记——Element Plus 栅格布局系统示例
前端·javascript·css
Predestination王瀞潞9 小时前
5.4.1 通信->WWW万维网内容访问标准(W3C):WWW(World Wide Web)基本信息&核心设计目标&现实意义
css·网络·网络协议·html·url·www
taxunjishu10 小时前
Profinet转Modbus TCP柔性制造工业自动化集成方案
网络协议·自动化·制造