大数跨境
0
0

UI自动化常用库介绍及示例(三)

UI自动化常用库介绍及示例(三) AllTests软件测试
2025-12-07
1
1、TestCafe

1.1 简介

TestCafeDevExpress推出的一款基于JavaScriptWeb自动化测试工具,无需依赖浏览器驱动(如ChromeDriver),直接通过浏览器原生API与页面交互。它支持ChromeFirefoxSafariEdge等所有主流浏览器,且可在WindowsmacOSLinux跨平台运行,适合快速构建稳定的Web端到端测试用例。


1.2 特点

  • 无驱动依赖:无需安装浏览器驱动,简化环境配置,降低入门门槛。

  • 自动等待机制:智能等待页面元素加载和用户操作完成,无需手动添加sleep语句,提升测试稳定性。

  • 跨浏览器与设备测试:支持本地浏览器、远程浏览器及移动设备模拟器,可一次运行多浏览器测试。

  • 内置断言与报告:集成丰富的断言方法,自动生成HTML测试报告,包含详细的错误信息和截图。


1.3 安装

TestCafe基于Node.js,需先安装Node.jsv14及以上),再通过npm全局安装:
npm install -g testcafe

1.4 示例:Web百度搜索测试

1. 创建测试文件baidu-search.test.js

import { Selector, t } from'testcafe';

fixture('百度搜索测试')
    .page('https://www.baidu.com/')
    .beforeEach(async () => {
        // 每次测试前最大化窗口
        await t.maximizeWindow();
    });

test('搜索关键词"TestCafe"并验证结果'async () => {
    // 定位搜索框并输入关键词
    const searchInput = Selector('#kw');
    await t.typeText(searchInput, 'TestCafe', { paste: true })
           .pressKey('enter'); // 提交搜索

    // 等待搜索结果加载,验证结果包含目标文本
    const resultArea = Selector('#content_left');
    await t.expect(resultArea.textContent).contains('TestCafe')
           .wait(2000); // 等待查看结果

    // 验证第一个搜索结果可点击
    const firstResult = Selector('.result-op .c-container h3 a').nth(0);
    await t.expect(firstResult.exists).ok()
           .expect(firstResult.isVisible).ok();
});

2. 运行测试(指定Chrome浏览器):

testcafe chrome baidu-search.test.js

关键说明:fixture用于组织测试用例,Selector用于定位页面元素,t对象提供用户操作API;测试执行完成后,会在终端输出结果,并自动生成报告文件。



2、Pygetwindow & Pyrect

2.1 简介

Pygetwindow是一款轻量级的Python库,专注于Windows窗口管理,支持获取窗口列表、调整窗口大小、移动窗口位置、最小化/最大化窗口等操作;Pyrect作为辅助库,提供矩形区域计算功能,常与Pygetwindow配合使用,实现更精准的窗口控制。二者结合适用于Windows桌面自动化中窗口级别的操作场景。


2.2 特点

  • API简洁易用:窗口操作方法直观(如moveTo()resizeTo()),学习成本低。

  • 轻量级无依赖:安装包体积小,无需复杂配置,可快速集成到桌面自动化脚本中。

  • 精准窗口控制:支持通过窗口标题、类名定位窗口,结合Pyrect可实现窗口区域的精确计算。

  • 兼容性好:支持Windows 7及以上系统,与PyAutoGUI等桌面操作库可无缝配合。


2.3 安装

使用pip命令同时安装PygetwindowPyrect

pip install pygetwindow pyrect

2.4 示例:Windows窗口管理操作

# 公众号:AllTests软件测试
import pygetwindow as gw
import time
from pyrect import Rect

def window_automation():
    # 1. 启动记事本(先手动打开或通过PyAutoGUI启动)
    time.sleep(2# 等待记事本启动
    
    # 2. 通过窗口标题定位记事本窗口
    notepad_window = gw.getWindowsWithTitle("无标题 - 记事本")[0]
    
    # 3. 窗口基本操作
    print("当前窗口标题:", notepad_window.title)
    print("窗口是否激活:", notepad_window.isActive)
    
    # 激活窗口
    notepad_window.activate()
    time.sleep(1)
    
    # 调整窗口大小(宽800,高600)
    notepad_window.resizeTo(800600)
    time.sleep(1)
    
    # 移动窗口到屏幕坐标(100, 100)
    notepad_window.moveTo(100100)
    time.sleep(1)
    
    # 最大化窗口
    notepad_window.maximize()
    time.sleep(1)
    
    # 最小化窗口
    notepad_window.minimize()
    time.sleep(1)
    
    # 恢复窗口正常大小
    notepad_window.restore()
    time.sleep(1)
    
    # 4. 获取窗口矩形区域信息
    window_rect = notepad_window.rect
    print("窗口矩形区域:", window_rect)
    # 计算窗口中心坐标
    center_x = window_rect.left + window_rect.width // 2
    center_y = window_rect.top + window_rect.height // 2
    print("窗口中心坐标:", (center_x, center_y))

if __name__ == "__main__":
    window_automation()

关键说明:getWindowsWithTitle()通过标题模糊匹配窗口,返回窗口列表;rect属性获取窗口的位置和大小信息(left/top/width/height),结合Pyrect可实现复杂的窗口布局控制。



3、React Testing Library

3.1 简介

React Testing Library是一款专注于React组件UI测试的库,由Kent C. Dodds创建,核心思想是测试组件的行为而非实现细节。它基于DOM Testing Library,提供了简洁的API用于查询和交互DOM元素,模拟用户真实操作场景,帮助开发者编写更健壮、易维护的React组件测试用例。


3.2 特点

  • 行为驱动测试:鼓励测试组件在用户操作下的表现(如点击、输入),而非组件内部状态或方法,降低测试与实现的耦合度。

  • 贴近用户操作:提供的查询方法(如getByRole()getByLabelText())模拟用户寻找元素的方式(如通过角色、标签),更符合真实使用场景。

  • 轻量级集成:可与JestVitest等测试运行器无缝集成,无需复杂配置,快速融入React项目开发流程。

  • 支持异步测试:内置对异步渲染(如API请求后的组件更新)的支持,提供waitFor()findBy*等方法处理异步场景。


3.3 安装

React项目中,通过npm安装核心库及断言扩展库:

npm install --save-dev @testing-library/react @testing-library/jest-dom

注意:@testing-library/jest-dom提供了DOM相关的断言方法(如toBeInTheDocument()),需在测试文件中导入或配置全局引入。


3.4 示例:React按钮组件测试

1. 待测试的React按钮组件(Button.jsx):

import { useState } from 'react';

function Button({
  const [count, setCount] = useState(0);
  return (
    <div>
      <button onClick={() => setCount(count + 1)}>
        点击次数:{count}
      </button>
      <p role="status">当前计数:{count}</p>
    </div>

  );
}

2. 测试文件(Button.test.jsx):

// 公众号:AllTests软件测试
import { render, screen, fireEvent } from'@testing-library/react';
import'@testing-library/jest-dom';
import Button from'./Button';

describe('Button组件测试'() => {
  test('组件初始渲染时显示正确文本'() => {
    // 渲染组件
    render(<Button />);
    
    // 验证按钮和状态文本初始内容
    const button = screen.getByRole('button', { name: /点击次数:0/i });
    const statusText = screen.getByRole('status');
    
    expect(button).toBeInTheDocument();
    expect(statusText).toHaveTextContent('当前计数:0');
  });

  test('点击按钮后计数正确更新'() => {
    render(<Button />);
    const button = screen.getByRole('button');
    
    // 模拟点击按钮2次
    fireEvent.click(button);
    fireEvent.click(button);
    
    // 验证计数更新
    expect(button).toHaveTextContent('点击次数:2');
    expect(screen.getByRole('status')).toHaveTextContent('当前计数:2');
  });
});

3. 运行测试(通常与Jest配合,执行项目中的test脚本):

npm test

关键说明:render()用于渲染React组件到虚拟DOMscreen对象提供全局查询方法;fireEvent用于模拟用户交互(如点击);断言方法需依赖@testing-library/jest-dom扩展。



4、Selenium Grid

4.1 简介

Selenium GridSelenium生态中的分布式测试框架,用于实现多浏览器、多平台、多设备的并行测试执行。它采用“Hub-Node”架构:Hub作为中心节点接收测试请求,Node作为执行节点注册到Hub并实际运行测试用例。通过Selenium Grid可大幅缩短测试套件的总执行时间,是大规模UI自动化测试的核心组件。


4.2 特点

  • 分布式架构:Hub统一管理测试请求,Node分散执行测试,支持跨机器、跨网络部署节点。

  • 多环境覆盖:可同时在不同浏览器(Chrome/Firefox/Edge等)、不同版本、不同操作系统(Windows/macOS/Linux)上执行测试。

  • 并行测试执行:多个测试用例可在不同Node上同时运行,显著提升测试效率,尤其适合大型测试套件。

  • 无缝集成Selenium:与Selenium WebDriver API完全兼容,现有Selenium脚本只需少量修改即可适配分布式执行。


4.3 安装

Selenium Grid基于Java,需先安装JDK11及以上),再通过以下步骤部署:
# 1. 下载Selenium Server(jar包)
# 从官网https://www.selenium.dev/downloads/下载最新版本的selenium-server-standalone.jar

#
 2. 启动Hub节点(中心节点)
java -jar selenium-server-standalone.jar hub

#
 3. 启动Node节点(执行节点,需与Hub网络互通)
# Windows示例(注册到本地Hub,指定支持Chrome浏览器)
java -jar selenium-server-standalone.jar node --hub http://localhost:4444/grid/register --capabilities "browserName=chrome,platform=WINDOWS"

#
 macOS/Linux示例
java -jar selenium-server-standalone.jar node --hub http://[HubIP]:4444/grid/register --capabilities "browserName=firefox,platform=LINUX"

注:启动前需确保Node节点已安装对应浏览器及驱动,且驱动路径配置到环境变量。


4.4 示例:分布式百度搜索测试

修改原有Selenium脚本,指定Hub地址执行分布式测试:

# 公众号:AllTests软件测试
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time

# 配置测试所需的浏览器能力(与Node节点注册的capabilities匹配)
desired_caps = DesiredCapabilities.CHROME.copy()
desired_caps["platform"] = "WINDOWS"

# 连接Selenium Grid Hub(而非直接启动本地浏览器)
driver = webdriver.Remote(
    command_executor="http://localhost:4444/wd/hub"# Hub地址
    desired_capabilities=desired_caps
)

try:
    # 执行百度搜索测试
    driver.get("https://www.baidu.com")
    driver.maximize_window()
    
    search_input = driver.find_element(By.ID, "kw")
    search_input.send_keys("Selenium Grid 分布式测试")
    search_input.send_keys(Keys.ENTER)
    
    time.sleep(3)
    assert"Selenium Grid"in driver.title, "搜索结果页面标题不包含目标文本"
    print("分布式测试执行成功!")
finally:
    # 关闭浏览器会话(释放Node资源)
    driver.quit()

关键说明:webdriver.Remote()用于连接Hub而非启动本地浏览器;desired_caps需与Node节点注册的能力匹配,Hub会自动分配符合条件的Node执行测试;可通过Hub管理界面(http://localhost:4444/grid/console)查看节点状态和测试执行情况。



5、AutoIt

5.1 简介

AutoIt是一款专为Windows平台设计的免费开源UI自动化工具,主要用于Windows图形用户界面(GUI)的自动化操作。它支持模拟键盘输入、鼠标操作、窗口控制及系统对话框(如文件上传、打印对话框)处理,拥有自己的脚本语言,可编译为独立EXE文件运行,广泛应用于Windows桌面应用自动化测试、系统运维脚本编写等场景。


5.2 特点

  • Windows原生适配:深度集成Windows API,对系统级控件(如按钮、文本框、对话框)的识别和操作稳定性极高。

  • 系统对话框专长:特别擅长处理Windows原生对话框(如打开”“保存”“打印对话框),解决其他工具定位困难的问题。

  • 脚本轻量易写:语法类似BASIC,简洁直观,学习成本低,支持条件判断、循环、函数等基础编程特性。

  • 可独立运行:脚本可编译为64/32EXE文件,无需依赖AutoIt环境即可在其他Windows机器上执行。


5.3 安装

安装步骤如下:

1.AutoIt官网下载最新版本的安装包(如AutoIt Full Installation)。

官网地址:

https://www.autoitscript.com/site/

2.双击安装包,按向导完成安装,默认会同时安装AutoIt脚本编辑器(SciTE Script Editor)。

3.验证安装:打开SciTE编辑器,新建脚本文件,输入MsgBox(0, "Test", "AutoIt安装成功"),按F5运行,弹出提示框即安装正常。


5.4 示例:Windows记事本自动化与保存对话框处理

创建AutoIt脚本文件NotepadAutomation.au3,内容如下:

; AutoIt 记事本自动化脚本
; 1. 启动Windows记事本
Run("notepad.exe")
; 等待记事本窗口打开(最多等待5秒)
WinWaitActive("无标题 - 记事本", "", 5)
If @error Then
    MsgBox(0, "错误", "记事本窗口未找到!")
    Exit
EndIf

; 2. 在记事本中输入文本
Send("AutoIt 自动化示例:\n专注Windows GUI操作,擅长处理系统对话框。")

; 3. 触发保存操作(Ctrl+S)
Send("^s")
; 等待“另存为”对话框打开
WinWaitActive("另存为", "", 5)
If @error Then
    MsgBox(0, "错误", "另存为对话框未找到!")
    Exit
EndIf

; 4. 处理“另存为”对话框:输入文件名并保存
; 定位文件名输入框(类名Edit,实例1)
ControlSetText("另存为", "", "Edit1", "autoit_notepad_demo.txt")
; 定位“保存”按钮(类名Button,标题“保存”)
ControlClick("另存为", "", "Button2")

; 5. 等待保存完成,关闭记事本
Sleep(2000)
WinClose("无标题 - 记事本")
; 处理关闭确认对话框(若文件已保存则不弹出)
WinWaitActive("记事本", "是否保存对", 3)
If Not @error Then
    ControlClick("记事本", "", "Button1") ; 点击“是”
EndIf

MsgBox(0, "完成", "记事本自动化操作执行成功!")

运行脚本:在SciTE编辑器中按F5运行,或右键脚本文件选择“Run Script”,即可自动完成记事本操作。


关键说明:WinWaitActive()用于等待窗口激活;ControlSetText()ControlClick()通过窗口标题+控件类名/实例/标题定位元素,避免坐标依赖;Send()用于模拟键盘输入,^s表示Ctrl+S组合键。



6、Espresso

6.1 简介

EspressoGoogle官方推出的Android原生UI自动化测试框架,基于Android Instrumentation API构建,专注于Android应用的UI交互测试。它支持对ActivityFragmentViewAndroid组件的操作与验证,能精准模拟用户在设备上的真实操作(如点击、输入、滑动),是Android原生应用UI自动化测试的标准工具。


6.2 特点

  • 系统级深度集成:与Android系统和应用组件紧密结合,无需额外依赖第三方驱动,测试稳定性高。

  • 自动同步机制:智能等待UI元素加载完成和主线程空闲,无需手动添加Thread.sleep(),避免异步操作导致的测试失败。

  • 简洁API设计:核心APIonView()perform()check())逻辑清晰,上手快,可快速编写可读性强的测试用例。

  • JUnit无缝兼容:基于JUnit测试框架,支持JUnit 4/5,可直接在Android Studio中运行,集成IDE的调试和报告功能。

  • 录制功能支持:Android Studio内置Espresso Recorder,可录制用户操作并自动生成测试代码,降低脚本编写成本。


6.3 安装

Android Studio项目中配置Espresso依赖,步骤如下:

1.打开模块级build.gradle(通常是app/build.gradle)。

2.dependencies闭包中添加Espresso核心依赖:

androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
testImplementation 'junit:junit:4.13.2'

3. 同步项目(Sync Now),依赖会自动下载并集成。


6.4 示例:Android登录按钮交互测试

假设Android应用有一个登录界面,包含登录按钮(idbtn_login)和登录状态提示文本(idtv_status),点击按钮后提示文本变为登录成功。测试用例如下:

// 公众号:AllTests软件测试
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

// 指定测试运行器为AndroidJUnit4
@RunWith(AndroidJUnit4::class)
class LoginActivityTest 
{

    // 声明测试规则,指定要测试的Activity(LoginActivity为目标Activity)
    @get:Rule
    val activityRule = ActivityTestRule(LoginActivity::class.java)

    // 测试登录按钮点击后状态文本更新
    @Test
    fun testLoginButtonClick() 
{
        // 1. 定位登录按钮并执行点击操作
        onView(withId(R.id.btn_login)) // 通过id定位按钮
            .perform(click()) // 模拟点击操作

        // 2. 定位状态文本并验证内容是否为“登录成功”
        onView(withId(R.id.tv_status))
            .check(matches(withText("登录成功"))) // 断言文本匹配
    }
}

运行测试:在Android Studio中右键测试类,选择“Run 'LoginActivityTest'”,或通过Gradle命令./gradlew connectedAndroidTest执行设备/模拟器上的测试。


关键说明:onView()用于通过匹配器(如withId()withText())定位Viewperform()执行用户操作(如click()typeText());check()结合断言方法(如matches())验证View状态;ActivityTestRule负责启动和管理测试Activity的生命周期。



7、XCTest

7.1 简介

XCTest是苹果官方推出的测试框架,专为iOSmacOSwatchOStvOS平台的应用测试设计,支持单元测试、UI测试、性能测试等多种测试类型。其中UI测试模块(XCTest UI Testing)可模拟用户在iOS设备/模拟器上的真实操作(如点击、滑动、输入),对应用UI组件进行交互与验证,是iOS原生应用UI自动化测试的标准解决方案,与Xcode开发环境深度集成。


7.2 特点

  • 官方原生支持:与iOS系统及Xcode工具链无缝衔接,兼容性极佳,能稳定识别系统及自定义UI组件。

  • Xcode集成度高:测试用例可直接在Xcode中编写、运行和调试,支持断点调试、测试报告可视化等IDE特性。

  • 用户操作模拟精准:提供XCUIElement类封装UI元素,支持点击、输入、滑动、缩放等复杂用户交互操作。

  • 测试录制功能:Xcode内置UI测试录制工具,可实时录制用户操作并自动生成Swift/Objective-C测试代码,降低脚本编写成本。

  • 多类型测试支持:除UI测试外,还可实现单元测试、性能测试(如启动时间、内存占用监控),满足全流程测试需求。


7.3 安装

XCTest无需单独安装,随Xcode自带,步骤如下:

1.Mac App Store下载并安装最新版本的Xcode(需macOS系统)。

2.打开iOS项目,在Xcode中通过“File > New > Target”创建测试目标:选择“iOS > Testing > UI Testing Bundle”,配置目标名称后点击“Finish”

3.创建完成后,Xcode会自动生成测试文件模板,即可开始编写UI测试用例。


7.4 示例:iOS登录按钮交互测试

假设iOS应用有一个登录界面,包含登录按钮(accessibilityIdentifierloginButton)和登录状态提示标签(accessibilityIdentifierstatusLabel),点击按钮后标签文本变为登录成功。测试用例(Swift语言)如下:

// 公众号:AllTests软件测试
import XCTest

// 测试类需继承自XCTestCase
class LoginUITests: XCTestCase {
    // 应用启动实例
    var app: XCUIApplication!
    
    // 每次测试前执行,启动应用
    override func setUpWithError() throws {
        continueAfterFailure = false// 测试失败后停止执行
        app = XCUIApplication()
        app.launch() // 启动应用(需确保Xcode已配置正确的Scheme)
    }
    
    // 测试登录按钮点击后状态更新
    func testLoginButtonClick() throws {
        // 1. 定位登录按钮并模拟点击
        let loginButton = app.buttons["loginButton"]
        XCTAssertTrue(loginButton.exists, "登录按钮不存在")
        loginButton.tap()
        
        // 2. 定位状态标签并验证文本内容
        let statusLabel = app.staticTexts["statusLabel"]
        XCTAssertTrue(statusLabel.waitForExistence(timeout: 2), "状态标签未出现")
        XCTAssertEqual(statusLabel.label, "登录成功""登录状态文本不匹配")
    }
    
    // 每次测试后执行,清理资源
    override func tearDownWithError() throws {
        app = nil
    }
}

运行测试:在Xcode中选择测试类或测试方法,点击左侧运行按钮,或通过“Product > Test”执行测试;也可使用Xcode命令行工具xcodebuild testCI/CD环境中运行。


关键说明:XCUIApplication代表被测试应用,launch()方法启动应用;XCUIElement通过accessibilityIdentifier(需在应用代码中为UI元素设置)定位,避免依赖坐标或文本变化;waitForExistence(timeout:)用于等待元素加载,替代固定延迟;断言方法(如XCTAssertTrueXCTAssertEqual)验证测试结果。



精彩推荐

文章合集-2025

文章合集-2024

文章合集-2023

文章合集-2022

文章合集-2021

文章合集-2020


扫码关注

获取更多精彩

alltests


扫描作者微信,交流、进群、合作!

【声明】内容源于网络
0
0
AllTests软件测试
分享软件测试、自动化测试、性能测试、测试开发等技术文章与资源,欢迎关注!
内容 246
粉丝 0
AllTests软件测试 分享软件测试、自动化测试、性能测试、测试开发等技术文章与资源,欢迎关注!
总阅读19
粉丝0
内容246