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);
相关推荐
ly1569 小时前
pytest-selenium的作用和常用操作-来自ai-个人留存
测试
VyrnSynx13 小时前
CodeBuddy IDE震撼来袭:让开发更高效的全新工具,前沿内测大揭秘!
测试·笔记测评
胡斌附体2 天前
linux测试端口是否可被外部访问
linux·运维·服务器·python·测试·端口测试·临时服务器
智云软件测评服务2 天前
第三方软件测试检测机构能提供啥测试服务?功能测试了解下
测试·软件·
June bug3 天前
【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
经验分享·分布式·职场和发展·架构·学习方法·测试·软考
郝同学的测开笔记13 天前
从 "不支持的URL" 错误谈 IPv6 兼容性与 HTTPDNS 优化
测试
chao_78915 天前
作为测试人员,平时用什么大模型?怎么用?
面试·大模型·测试
chao_78917 天前
死锁相关知识
网络协议·游戏·测试·死锁
cooldream200918 天前
pytest 框架详解与实战指南
pytest·测试