软件测试之自动化测试

  🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

1.什么是自动化测试

将人工测试手段转换为机器执行的过程

自动化测试金字塔

自动化测试分类: 

单元测试:

最大的投入应该在单元测试上,单元测试运行的频率也更加高。java的单元测试框架是Junit

接口测试:

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

接口自动化的有以下特点:

可在产品前期,接口完成后介入

用例维护量小

适合接口变动较小,界面变动频繁的项目

常见的接口自动化测试工具有,RobotFramework,JMeter,SoapUI,TestNG+HttpClient,Postman等。

UI测试:

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

UI自动化的特点:

用例维护量大

页面相关性强,必须后期项目页面开发完成后介入

UI测试适合与界面变动较小的项目

selenium介绍

什么是selenium?

是web应用中基于UI的自动化测试框架

特点

支持多平台、多浏览器、多语言

原理

 三个对象:

自动化脚本代码:编写的代码

浏览器驱动:需要下载驱动

浏览器:各种浏览器

2.selenium+java环境搭建

1.安装chrome浏览器并察看其版本

 2.下载浏览器驱动,要和对应的版本相同的驱动

3.将驱动放在浏览器应用目录下,并且配置Path环境

 4.验证是否搭建好环境

导入依赖文件

 
  1. <dependencies>

  2. <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->

  3. <dependency>

  4. <groupId>org.seleniumhq.selenium</groupId>

  5. <artifactId>selenium-java</artifactId>

  6. <version>3.141.59</version>

  7. </dependency>

  8. </dependencies>

编写代码

 
  1. import org.openqa.selenium.WebDriver;

  2. import org.openqa.selenium.chrome.ChromeDriver;

  3. import org.openqa.selenium.chrome.ChromeOptions;

  4. public class Main {

  5. public static void main(String[] args) {

  6. ChromeOptions options = new ChromeOptions();

  7. options.addArguments("--remote-allow-origins=*");

  8. WebDriver webDriver = new ChromeDriver(options);

  9. webDriver.get("https://www.baidu.com");

  10. }

  11. }

 

 至此环境搭建成功

此时打开chromedriver.exe

3.熟悉selenium的API

定位元素

模拟点击对象:click

清除对象输入的文本:clear

提交 :submit(如果在form标签中,和click效果相同。非form标签中使用会报错!)

获取元素文本信息:text

获取元素属性值:getAttribute

 定位方式1:

 

 定位方式2:

 

 启动成功

css选择语法:

css语法选择器

id选择器:#id值

类选择器:.类名

标签选择器:标签名

后代选择器:父级选择器,子级选择器

xpath:
绝对路径:/开头,效率比较低,不常用 /html/head/title

相对路径://开头   经常用到

相对路径+索引://form/span[1]/input

 相对路径+属性值://input[@class="s_ipt"]

 相对路径+通配符://*[@*="su"]

 相对路径+文本匹配://a[text()="新闻"]

getAttribute的使用

获取"百度一下"

 
  1. private static void test(){

  2. ChromeOptions options = new ChromeOptions();

  3. //参数意义:允许所有的请求

  4. options.addArguments("--remote-allow-origins=*");

  5. WebDriver webDriver = new ChromeDriver(options);

  6. //打开百度首页

  7. webDriver.get("https://www.baidu.com");

  8. String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");

  9. if (button_value.equals("百度一下")){

  10. System.out.println("测试通过");

  11. }else{

  12. System.out.println(button_value);

  13. System.out.println("测试不通过");

  14. }

  15. }

  

添加等待

1.sleep休眠

引入time包,就可以在脚本中添加休眠时间了,固定性休眠

2.隐式等待

隐式等待是在整个测试脚本的执行过程中设置一个默认的等待时间。当查找元素时,如果元素未立即可用,则会等待一段预定的时间,直到元素可见或超过最大等待时间为止。不需要在代码中显式指定等待条件。

假设等待三天时间:

sleep会持续等待固定时间

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

对比

 
  1. private static void test2() throws InterruptedException {

  2. ChromeOptions options = new ChromeOptions();

  3. //参数意义:允许所有的请求

  4. options.addArguments("--remote-allow-origins=*");

  5. WebDriver webDriver = new ChromeDriver(options);

  6. //打开百度首页

  7. webDriver.get("https://www.baidu.com");

  8. //等待3s

  9. sleep(3000);

  10. //找到输入框并输入java

  11. webDriver.findElement(By.cssSelector("#kw")).sendKeys("java");

  12. //获取提交按钮并且提交

  13. webDriver.findElement(By.cssSelector("#su")).submit();

  14. //进行隐式等待

  15. webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);

  16. //清空

  17. webDriver.findElement(By.cssSelector("#kw")).clear();

  18. }

 运行程序,等待3s后,立即输入java并且清空了。

3.显示等待

显示等待是在代码中明确地指定等待条件并设置等待时间。测试脚本会在特定条件满足或超过最大等待时间之前一直等待。常见的等待条件包括元素可见、元素可点击、元素存在等。具体的等待时间需要根据系统响应时间而定。如果等待条件在超过最大等待时间后仍未满足,会抛出异常。

 
  1. //显示等待API使用

  2. private static void test4() {

  3. ChromeOptions options = new ChromeOptions();

  4. //参数意义:允许所有的请求

  5. options.addArguments("--remote-allow-origins=*");

  6. WebDriver webDriver = new ChromeDriver(options);

  7. //打开百度首页

  8. webDriver.get("https://www.baidu.com");

  9. //判断元素是否可以被点击

  10. WebDriverWait wait = new WebDriverWait(webDriver,3000);

  11. wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div > p:nth-child(7) > a")));

  12. }

执行后说明可以点击,如果出现定位不到的信息,就会报错

显示等待和隐式等待的区别:

隐式等待:当前页面的所有元素都加载了后才进行向下执行

显示等待:只针对确定的条件进行等待,所有元素是否加载不影响

打印信息

打印title和url

 
  1. private static void test3() {

  2. ChromeOptions options = new ChromeOptions();

  3. //参数意义:允许所有的请求

  4. options.addArguments("--remote-allow-origins=*");

  5. WebDriver webDriver = new ChromeDriver(options);

  6. //打开百度首页

  7. webDriver.get("https://www.baidu.com");

  8. String url = webDriver.getCurrentUrl();

  9. String title = webDriver.getTitle();

  10. if (url.equals("https://www.baidu.com/") && title.equals("百度一下,你就知道")){

  11. System.out.println("url: "+url);

  12. System.out.println("title: "+title);

  13. System.out.println("测试通过");

  14. }else {

  15. System.out.println("测试不通过");

  16. }

  17. }

 浏览器的相关操作

1.浏览器前进

2.浏览器后退

 
  1. private static void test5() throws InterruptedException {

  2. ChromeOptions options = new ChromeOptions();

  3. //参数意义:允许所有的请求

  4. options.addArguments("--remote-allow-origins=*");

  5. WebDriver webDriver = new ChromeDriver(options);

  6. //打开百度首页

  7. webDriver.get("https://www.baidu.com");

  8. //搜索后强制等待3s

  9. webDriver.findElement(By.cssSelector("#kw")).sendKeys("hello");

  10. webDriver.findElement(By.cssSelector("#su")).submit();

  11. sleep(3000);

  12. //浏览器后退

  13. webDriver.navigate().back();

  14. //等待3s

  15. webDriver.navigate().refresh();

  16. sleep(3000);

  17. //浏览器前进

  18. webDriver.navigate().forward();

  19. }

搜索后休眠,然后后退、刷新、前进到搜索hello页面 

3.浏览器滚动条操作

 
  1. private static void test5() throws InterruptedException {

  2. ChromeOptions options = new ChromeOptions();

  3. //参数意义:允许所有的请求

  4. options.addArguments("--remote-allow-origins=*");

  5. WebDriver webDriver = new ChromeDriver(options);

  6. //打开百度首页

  7. webDriver.get("https://www.baidu.com");

  8. //搜索后强制等待3s

  9. webDriver.findElement(By.cssSelector("#kw")).sendKeys("hello");

  10. webDriver.findElement(By.cssSelector("#su")).submit();

  11. sleep(3000);

  12. //浏览器后退

  13. webDriver.navigate().back();

  14. //等待3s

  15. webDriver.navigate().refresh();

  16. sleep(3000);

  17. //浏览器前进

  18. webDriver.navigate().forward();

  19. //滚动条

  20. ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");

  21. }

 
  1. //设置最浏览器为最大尺寸

  2. webDriver.manage().window().maximize();

  3. sleep(3000);

  4. //设置满屏

  5. webDriver.manage().window().fullscreen();

  6. sleep(3000);

  7. //高1000宽600

  8. webDriver.manage().window().setSize(new Dimension(600,1000));

键盘组合键用法

 
  1. private static void test8() throws InterruptedException {

  2. ChromeOptions options = new ChromeOptions();

  3. //参数意义:允许所有的请求

  4. options.addArguments("--remote-allow-origins=*");

  5. WebDriver webDriver = new ChromeDriver(options);

  6. //打开百度首页

  7. webDriver.get("https://www.baidu.com");

  8. //搜索后强制等待3s

  9. webDriver.findElement(By.cssSelector("#kw")).sendKeys("hello");

  10. //CONTROL+A

  11. webDriver.findElement(By.cssSelector("kw")).sendKeys(Keys.CONTROL,"A");

  12. sleep(3000);

  13. //CONTROL+X

  14. webDriver.findElement(By.cssSelector("kw")).sendKeys(Keys.CONTROL,"X");

  15. sleep(3000);

  16. //CONTROL+V

  17. webDriver.findElement(By.cssSelector("kw")).sendKeys(Keys.CONTROL,"V");

  18. sleep(3000);

  19. }

sendKeys(Keys.CONTROL,"A"):全选
sendKeys(Keys.CONTROL,"C"):复制
sendKeys(Keys.CONTROL,"V"):粘贴
sendKeys(Keys.CONTROL,"X"):剪切

鼠标事件

perform():执行所有存储的行为
contextClick():右击
doubleClick():双击
moveToElement():移动
 
  1. private static void test9() throws InterruptedException {

  2. ChromeOptions options = new ChromeOptions();

  3. //参数意义:允许所有的请求

  4. options.addArguments("--remote-allow-origins=*");

  5. WebDriver webDriver = new ChromeDriver(options);

  6. //打开百度首页

  7. webDriver.get("https://www.baidu.com");

  8. webDriver.findElement(By.cssSelector("#kw")).sendKeys("hello");

  9. webDriver.findElement(By.cssSelector("#su")).click();

  10. sleep(3000);

  11. //找到图片按钮

  12. WebElement webElement = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));

  13. //鼠标右击

  14. Actions actions = new Actions(webDriver);

  15. sleep(3000);

  16. actions.moveToElement(webElement).contextClick().perform();

  17. }

输入hello,然后将鼠标移动到图片上,并点击右键 

特殊场景 

定位一组元素

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

定位一组对象一般用于以下场景:

批量操作对象,比如将页面上所有的checkbox 都勾上

先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个 

get_attribute:获得属性值

实现自动选中所有复选框,就是定位一组元素

使用input标签定位一组元素,然后遍历 ,是checkbox就勾选,否则不做处理

 
  1. private static void page1() {

  2. ChromeOptions options = new ChromeOptions();

  3. //参数意义:允许所有的请求

  4. options.addArguments("--remote-allow-origins=*");

  5. WebDriver webDriver = new ChromeDriver(options);

  6. webDriver.get("file:///D:/IDEA2021/test-class106-107-master/code/_20230512testcode/src/main/Page/test01.html");

  7. //获取所有input框

  8. List<WebElement> elements = webDriver.findElements(By.cssSelector("input"));

  9. //遍历

  10. //getAttribute是获取属性的值,type就是元素的类型

  11. for (int i = 0; i < elements.size(); i++) {

  12. if(elements.get(i).getAttribute("type").equals("checkbox")){

  13. elements.get(i).click();

  14. }

  15. }

  16. }

getAttribute是获取属性的值,type就是元素的类型

运行后:

多层框架定位

对于一个web 应用,经常会出现框架(frame)或窗口(window)的应用,这也就给我们的定位带来了一定的困难

定位一个frame :switch_to.frame(name_or_id_or_frame_element)

定位一个窗口window:switch_to.window(name_or_id_or_frame_element)

多层框架的定位

switch_to.frame(name_or_id_or_frame_element):通过frame的id或者name或者frame自带的其它属性来定位框架,这里switch_to.frame()把当前定位的主体切换了frame里。switch_to.default_content:从frame中嵌入的页面里跳出,跳回到最外面的默认页面中。

 实现自动点击click

 可见看到herf是在iframe中的,不能直接用选择器获取然后操作

 switch_to.frame

点击成功

下拉框处理

下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框对下拉框进行操作后,再定位到下拉框内里的选项。

 和之前的操作有所不同,首先要定位到下拉框的元素,然后选择下拉列表中的选项进行点击操作。

 
  1. private static void page3() {

  2. WebDriver webDriver = new ChromeDriver();

  3. webDriver.get("file:///D:/IDEA2021/test-class106-107-master/code/_20230512testcode/src/main/Page/test03.html");

  4. WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));

  5. Select select = new Select(webElement);

  6. select.selectByIndex(3);//从0开始的

  7. }

弹窗处理

alert、confirm、prompt 的处理

text 返回alert/confirm/prompt 中的文字信息

accept 点击确认按钮

dismiss 点击取消按钮,如果有的话

send_keys 输入值,如果alert 没有对话框就不能用了,不然会报错

 
  1. private static void page4() throws InterruptedException {

  2. WebDriver webDriver = new ChromeDriver();

  3. webDriver.get("file:///D:/IDEA2021/test-class106-107-master/code/_20230512testcode/src/main/Page/test04.html");

  4. webDriver.findElement(By.cssSelector("button")).click();

  5. sleep(3000);

  6. //取消弹窗,alert

  7. webDriver.switchTo().alert().dismiss();

  8. sleep(3000);//点击按钮

  9. webDriver.findElement(By.cssSelector("button")).click();

  10. //输入hello

  11. webDriver.switchTo().alert().sendKeys("hello");

  12. sleep(3000);//确认

  13. webDriver.switchTo().alert().accept();

  14. }

 上传文件

文件上传操作也比较常见功能之一,上传功能没有用到新有方法或函数,关键是思路。

上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。其实,在selenium webdriver 没我们想的那么复杂;只要定位上传按钮,通过send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。

 
  1. private static void page5() {

  2. WebDriver webDriver = new ChromeDriver();

  3. webDriver.get("file:///D:/IDEA2021/test-class106-107-master/code/_20230512testcode/src/main/Page/test05.html");

  4. webDriver.findElement(By.cssSelector("input")).sendKeys("C:\\ProgramData\\historyDown.xml");

  5. }

关闭浏览器

面试题:quit与close区别:     

quit关闭浏览器,close仅关闭当前 的页面(原始页面,get获取的页面)

quit会清空缓存,close不会清空缓存

 
  1. private static void test10() throws InterruptedException {

  2. WebDriver webDriver = new ChromeDriver();

  3. webDriver.get("https://www.baidu.com");

  4. webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();

  5. sleep(4000);

  6. webDriver.quit();

  7. webDriver.close();

  8. }

窗口切换

打开百度,点击新闻,输入

需要进行页面的切换,否则找不到元素,元素默认是在get打开的页面找元素

 
  1. private static void test11() throws InterruptedException {

  2. WebDriver webDriver = new ChromeDriver();

  3. webDriver.get("https://www.baidu.com");

  4. webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();

  5. sleep(4000);

  6. webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");

  7. webDriver.findElement(By.cssSelector("#s_btn_wr")).click();

  8. }

没进行页面切换就会报错,找不到跳转的页面的元素

 进行页面句柄的寻找以及窗口的切换

 
  1. private static void test11() throws InterruptedException {

  2. WebDriver webDriver = new ChromeDriver();

  3. webDriver.get("https://www.baidu.com");

  4. webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();

  5. sleep(4000);

  6. System.out.println(webDriver.getWindowHandle());//获取get后打开的窗口句柄,~s是获取所有页面的窗口句柄

  7. Set<String> handles = webDriver.getWindowHandles();

  8. String target_handle = "";

  9. //将最后一个页面的句柄找出来,防止会定位到其他页面相同的元素

  10. for (String handle:handles) {

  11. target_handle = handle;

  12. }

  13. //切换窗口

  14. webDriver.switchTo().window(target_handle);

  15. sleep(3000);

  16. webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");

  17. webDriver.findElement(By.cssSelector("#s_btn_wr")).click();

  18. }

 

截图

先导入依赖

 
  1. <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->

  2. <dependency>

  3. <groupId>commons-io</groupId>

  4. <artifactId>commons-io</artifactId>

  5. <version>2.11.0</version>

  6. </dependency>

打开百度,输入测试,然后截图

 
  1. private static void test12() throws InterruptedException, IOException {

  2. WebDriver webDriver = new ChromeDriver();

  3. webDriver.get("https://www.baidu.com");

  4. webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");

  5. webDriver.findElement(By.cssSelector("#su")).click();

  6. sleep(3000);

  7. //进行截图

  8. //类型是文件,此时存储在内存

  9. File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);

  10. //存储到硬盘中

  11. FileUtils.copyFile(file,new File("C://Users//User//Documents//2023.png"));

  12. }

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值