07.自动化测试常用函数

自动化测试常用函数

  • [1. 元素定位](#1. 元素定位)
  • [2. 操作测试对象](#2. 操作测试对象)
  • [3. 窗口](#3. 窗口)
  • [4. 等待](#4. 等待)
  • [5. 浏览器导航](#5. 浏览器导航)
  • [6. 弹窗](#6. 弹窗)
  • [7. 文件上传](#7. 文件上传)
  • [8. 浏览器参数设置](#8. 浏览器参数设置)

1. 元素定位

​ web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体操作。常见的元素定位方式有:id、classname、tagname、xpath、cssSelector

cssSelector:

cssSelector(CSS选择器: 是自动化测试中用于定位网页元素的一种强大方式。基于HTML元素的结构和属性来匹配并选中页面上的某个或某写元素。

选择器:选中页面中指定的标签元素

选择器的种类分为基础选择器和复合原则器,常见的元素定位方式通过 i选择器和子类选择器进行经纬。

XPath:

XPath(XML Path language): 是一种用于在 Xml 或 HTML文档中定位和选择节点的语言。

语法:

  • 获取HTML页面所有的节点: //*
  • 获取HTML页面制定的节点://[指定节点]
    • //ul:获取HTML页面所有的 ul节点
    • //input:获取HTML页面所有的 input节点
  • 获取一个节点中的直接字节点:/
    • //span/input
  • 获取一个节点的父节点: ...
    • //input/...
  • 实现节点属性的匹配:[@...]
    • //*[@id='kw'] 匹配HTML页面中id属性值为 kw的节点
  • 使用指定索引的方式获取对应的节点内容:XPath的索引是从1开始的
    • 百度首页通过://div/ul/li[3] 定位到第三个百度热搜标签

2. 操作测试对象

​ 在自动化测试中,操作测试对象是指页面上的元素进行各种交互行为。

点击/提交对象:

  • click()

    java 复制代码
    //找到百度一下按钮并点击
    driver.findElement(By.xpath("//*[@id=\"su\"]")).click();

模拟按键输入:

  • sendKeys("")

    java 复制代码
     //找到输入框并输入"迪丽热巴"
    driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("迪丽热巴"); 

清除文本内容:

  • 输入文本后再换一个关键词,需要使用clear()

    java 复制代码
    driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("迪丽热巴");
    driver.findElement(By.xpath("//*[@id=\"kw\"]")).click();
    driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("博客");

获取文本内容:

  • getText()

    java 复制代码
    String text = driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]")).getText();
    System.out.println("打印的内容是:"+ text);

3. 窗口

​ 在自动化测试中,窗口(Window)操作时常见需求之一。当用户点击链接或按钮时,有时会打开新的浏览器窗口或标签页(Tab),此时就需要进行窗口的切换、管理等操作。

每个浏览器窗口都有一个唯一的属性句柄(handle)来表示

切换窗口:

  • 获取当前页面句柄:driver.getWindowHandle();

  • 获取所有页面的句柄:driver.getWindowHandles();

    java 复制代码
    String curWindow = driver.getWindowHandle();
    Set<String> allWindow = driver.getWindowHandles();
    for (String w : allWindow) {
        //切换窗口
        driver.switchTo().window(w); 
    }

    执行了 diver.close() 之前需要切换到未被关闭的窗口

窗口设置大小:

  • 窗口大小设置

    java 复制代码
    //窗口最大化
    driver.manage().window().maximize();
    //窗口最小化
    driver.manage().window().minimize();
    //全名窗口
    driver.manage().window().fullscreen();
    //手动设置窗口大小
    driver.manage().window().setSize(new Dimension(1024, 768));

屏幕截图:

  • 导入工具包:commons-io主要用于简化文件、流、和目录的操作;

    xml 复制代码
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>
    java 复制代码
    // 将 WebDriver 对象转换为 TakesScreenshot 接口对象
    // getScreenshotAs() 方法用于获取当前页面的截图,并以 File 形式返回
    File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
    // 使用 Apache Commons IO 的 FileUtils 工具类,将截图文件复制到指定路径和文件名
    FileUtils.copyFile(file, new File("my.png"));
    java 复制代码
    //升级版
    // 调用 getTime() 方法,获取一个包含两个时间字符串的 List
    // 例如:["2025-07-05", "20250705-143045"]
    List<String> times = getTime();
    
    // 构建截图要保存的目录路径
    // 格式为:./src/test/autotest-2025-07-05
    String directoryPath = "./src/test/autotest-" + times.get(0);
    
    
    // 定义截图文件名
    // 格式为:-20250705-143045.png 
    String fileName = "-" + times.get(1) + ".png";
    
    // 使用 Selenium 的 TakesScreenshot 接口获取当前浏览器窗口的屏幕截图
    // 返回的是一个临时文件对象
    File srcfile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
    
    // 使用 Apache Commons IO 提供的 FileUtils.copyFile() 方法
    // 将截图从临时路径复制到指定的目标路径下
    FileUtils.copyFile(srcfile, new File(filePath));
    
    
    
    public static List<String> getTime() {
        List<String> times = new ArrayList<>();
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss");
        
        String time1 = LocalDateTime.now().format(formatter1); // 如:2025-07-05
        String time2 = LocalDateTime.now().format(formatter2); // 如:20250705-143045
    
        times.add(time1);
        times.add(time2);
    
        return times;
    }

关闭窗口:

  • driver.close();

4. 等待

​ 由于web页面是动态加载的,通常代码执行的速度比页面渲染的速度要快,元素不会立刻出现或准备好,需要通过等待(Wait)机制来确保脚本执行时能过正确找到和操作页面的元素。

强制等待:

  • Thread.slepp()
    • 优点:使用简单,调用时比较有效
    • 缺点:影响运行效率,浪费大量的时间

隐式等待:

​ 隐式等待(Implicit Wait)是一种全局性的智能等待机制。它规定在查找元素时,如果当前未找到目标元素,Selenium 会在指定的时间内不断尝试查找该元素。一旦找到元素,立即继续执行后续代码;如果在超时时间内仍未找到元素,则抛出 NoSuchElementException 异常并终止当前操作。

  • implicitlyWait() 参数:Duration 类中提供的毫秒、秒、分钟等方法。

    java 复制代码
    //隐式等待 1000毫秒
    driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
    
    //隐式等待 5秒
    driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

    作用域是整个脚本的 所有元素。即只要driver对象没有别释放掉(driver.quit()),隐式等到一直生效。

    优点:智能等待,作用与全局

显示等待:

​ 显式等待(Explicit Wait) 是一种智能的、条件驱动的等待机制。它会在指定的最大超时时间范围内不断检查某个条件是否成立,一旦条件满足,就立即继续执行后续代码;如果在超时后仍未满足条件,则抛出 TimeoutException异常。

​ 与隐式等待不同,显式等待是针对特定条件的等待,适用于更复杂和精确的自动化测试场景。

  • 基本语法结构

    java 复制代码
    WebDriverWait foo = new WebDriverWait(driver, Duration.ofSeconds(3))
    foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));
    • WebDriverWait:设置最大等待时间。
    • ExpectedConditions:提供一系列预定义的等待条件判断方法。
    • until(...):执行等待,直到条件为真或超时。
  • ExpectedConditions 是 Selenium 提供的一个工具类,它包含了一系列用于显式等待的条件判断方法 ,可以与 WebDriverWait 搭配使用。

常见方法 描述
elementToBeClickable(By locator) 等待元素可见且可点击(常用于按钮、链接等)
textToBe(By locator, String text) 等待指定元素中包含指定文本内容
presenceOfElementLocated(By locator) 等待元素出现在 DOM 中(不一定可见)
urlToBe(String url) 等待当前页面 URL 等于指定的 URL
visibilityOfElementLocated(By locator) 等待元素在页面上可见(显示且宽高 > 0)
invisibilityOfElementLocated(By locator) 等待元素不可见(如加载动画消失)
alertIsPresent() 等待弹窗(alert)出现
java 复制代码
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
boolean ispass = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-topleft > a:nth-child(1)"), "新闻"));
if(ispass){
    System.out.println("测试通过");
}else {
    System.out.println("测试失败");
}
  • 创建了一个最大等待时间为 10 秒WebDriverWait
  • 使用ExpectedConditions.textToBe(...)方法:
    • 等待 CSS 选择器为 #s-topleft > a:nth-child(1) 的元素中出现文本 "新闻"
    • 如果在 10 秒内找到匹配文本,则返回 true;否则抛出 TimeoutException
  • 根据返回值打印测试结果。

5. 浏览器导航

打开网站:

java 复制代码
//更长的方法
driver.navigate().to("https://www.baidu.com/");
//简洁的方法
 driver.get("https://www.baidu.com/");

浏览器的前进、后退、刷新:

java 复制代码
driver.navigate().back();

driver.navigate().forward();

driver.navigate().refresh();

6. 弹窗

​ 当页面弹出一个 JavaScript 弹窗(如 alertconfirmprompt),这些弹窗实际上是独立于页面 DOM 的,无法通过常规的 Selenium 查找元素方法(例如 findElement)来与它们交互。Selenium 提供了专门的 Alert 接口来处理这类弹窗。

警告弹窗+确认弹窗:

java 复制代码
Alert alert = driver.switchTo().alert();

//确认
alert.accept();

//取消
alert.dismiss();

提示弹窗:

java 复制代码
Alert alert = driver.switchTo().alert();

alert.sendKeys("hello");

//确认
alert.accept();

//取消
alert.dismiss();

7. 文件上传

​ 点击⽂件上传的场景下会弹窗系统窗⼝,进⾏⽂件的选择。 selenium⽆法识别⾮web的控件,上传⽂件窗⼝为系统⾃带,⽆法识别窗⼝元素 可以使⽤sendkeys来上传指定路径的⽂件,达到的效果是⼀样的。

java 复制代码
// 使用 CSS 选择器定位页面中的文件上传控件(input 标签,type 属性为 "file")
// 路径表示:body 下第一个 div,再下一个 div 中的 type 为 file 的 input 元素
WebElement ele = driver.findElement(By.cssSelector("body > div >div > input[type=file]"));

// 向该文件上传控件发送本地文件路径,模拟用户选择文件的操作
// 路径必须是文件系统中存在的绝对路径
ele.sendKeys("C:\\Users\\31681\\Desktop\\chromedriver-win64.html");

8. 浏览器参数设置

设置无头模式:

​ 在自动化测试中,无头模式(Headless Mode) 是一种在不打开真实浏览器窗口的情况下运行浏览器的方式。它非常适合用于服务器环境、CI/CD 流程或希望减少资源占用的场景。

​ Selenium 支持通过浏览器选项、来设置浏览器以无头模式运行。

  • 无界面浏览器模式,即没有图形化界面
  • 所有操作在都在后台进行,用户无法看到浏览器窗口
java 复制代码
//配置本地驱动
System.setProperty("webdriver.chrome.driver", "C:\\Users\\31681\\Desktop\\chromedriver-win64\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
      
//允许访问所有链接
options.addArguments("--remote-allow-origins=*");

//设置无头模式
options.addArguments("-headless");

//打开浏览器
WebDriver driver = new ChromeDriver(options);

//输入百度网络
driver.get("https://www.baidu.com/");

设置浏览器的加载策略:

​ 设置浏览器的页面加载策略(Page Load Strategy),允许你控制 WebDriver 等待页面加载的方式。

​ Selenium 提供了三种不同的页面加载策略:normaleagernone

页面加载策略选项

  1. normal(默认)
    • 等待整个页面,包括所有子资源(如图片、样式表等)加载完成。
  2. eager
    • 交互状态加载,即当初始 HTML 文档已被完全加载和解析,但不等待样式表、图片和其他子资源完成加载时立即返回控制权。
  3. none
    • 不等待任何资源加载完成,一旦 DOM 被接收到就返回控制权。
java 复制代码
//例
 // 设置页面加载策略为 NONE
options.setPageLoadStrategy(PageLoadStrategy.NONE);
相关推荐
前端工作日常1 天前
平台价值与用户规模的共生关系
electron·测试·puppeteer
CrissChan4 天前
AI赋能软件工程让测试左移更加可实施
人工智能·python·llm·软件工程·测试
努力奋斗的Tom4 天前
Air test框架与appium的优势
测试
瑞士龙珠5 天前
JMeter 多台压力机分布式测试(Windows)
测试
Apifox6 天前
如何在 Apifox 中正确使用前置 URL?
前端·后端·测试
陈哥聊测试7 天前
软件工程3.0时代,为什么人工测试仍必不可少?
人工智能·测试
檀檀19937 天前
测试抓包工具2-whistle抓包
测试
用户3521802454758 天前
靶场:Breach3.0攻略
安全·测试
ZoeLandia9 天前
前端自动化测试:Jest、Puppeteer
前端·自动化测试·测试
霍格沃兹测试开发10 天前
Playwright系列课(2) | 元素定位四大法宝:CSS/文本/XPath/语义化定位实战指南
开源·测试