自动化常见函数

在当今快速发展的软件开发领域,自动化测试已成为确保软件质量和提高开发效率的关键环节。Java 作为一门广泛使用的编程语言,在自动化测试中扮演着重要角色,本文将深入探讨 Java 自动化测试中常用的函数,从基础的元素定位到高级的浏览器参数设置。

一、元素定位

cssSelector 是一种基于 CSS 样式选择器定位方法,web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector,其中cssSelector和xpath最常用。

1、cssSelector

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

选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位

以定位"百度热搜"为例:

2、xPath

XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点

xpath使用路径表达式来选择xml文档中的节点

xpath语法中:

//* 获取HTML页面所有节点

//[指定节点] 获取HTML页面指定节点

//div :获取HTML页面所有的div节点

//input:获取HTML页面所有的input节点

③**/**获取⼀个节点中的直接子节点

④**..**获取一个节点的父节点

⑤**[@...]**实现节点属性的匹配

//*[@id=\"hotsearch-content-wrapper\"] 匹配HTML页面中id属性为hotsearch-content-wrapper的节点

⑥ 使用指定索引的方式获取对应的节点内容

注意:xpath的索引是从1开始的

二、操作测试对象

获取到了页面的元素之后,接下来就是要对元素进行操作了,常见的操作有点击、提交、输⼊、清除、获取文本

1、点击/提交对象

click()

java 复制代码
//找到百度⼀下按钮并点击
driver.findElement(By.cssSelector("#chat-submit-button")).click();

2、模拟按键输入

sendKeys(" ")

java 复制代码
driver.findElement(By.cssSelector("#chat-textarea")).sendKeys("输⼊⽂字");

3、清除文本内容

clear() 输入文本后又想换⼀个新的关键词

java 复制代码
driver.findElement(By.cssSelector("#chat-textarea")).sendKeys("星期一");
driver.findElement(By.cssSelector("#chat-textarea")).clear();
driver.findElement(By.cssSelector("#chat-textarea")).sendKeys("星期二");

4、获取文本信息

getText()

java 复制代码
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]"));    
for (WebElement e : elements){
        System.out.println(e.getText());
      }

注意:文本和属性值不要混淆,获取属性值需要使用方法 getAttribute("属性名称") ;

5、获取当前页面标题

getTitle()

java 复制代码
        String title = driver.getTitle();
        System.out.println(title);

6、获取当前页面URL

getCurrentUrl()

java 复制代码
        String currentUrl = driver.getCurrentUrl();
        System.out.println(currentUrl);

三、窗口

打开⼀个新的页面之后获取到的title和URL仍然还是前⼀个页面的:

当我们手工测试的时候,我们可以通过眼睛来判断当前的窗口是什么,但对于程序来说它是不知道当前最新的窗口应该是哪⼀个,那么它怎么来识别每⼀个窗口呢?每个浏览器窗口都有⼀个唯⼀的属性句柄(handle)来表示,我们就可以通过句柄来切换。

1、切换窗口

① 获取当前页面句柄:

driver.getWindowHandle();

② 获取所有页面句柄:

driver.getWindowHandles()

③切换当前句柄为最新页面:

java 复制代码
        String currentHandle = driver.getWindowHandle();
        // 获取所有窗口句柄
        Set<String> allHandles = driver.getWindowHandles();
        // 切换到新窗口(百度图片)
        for (String handle : allHandles) {
            if (!handle.equals(currentHandle)) { // 这里应该是"不等于"当前窗口
                // 切换到新窗口
                driver.switchTo().window(handle);
                break; // 找到第一个非当前窗口后跳出循环
            }
        }

2、窗口设置大小

java 复制代码
//窗⼝最⼤化
driver.manage().window().maximize();
//窗⼝最⼩化
driver.manage().window().minimize();
//全屏窗⼝
driver.manage().window().fullscreen();
//⼿动设置窗⼝⼤⼩
driver.manage().window().setSize(new Dimension(1024, 768));

3、屏幕截图

自动化脚本一般部署在机器上自动去运行,如果出现报错我们不知道,但是我们可以通过抓拍来记录当时的错误场景

屏幕截图方法需要导入依赖:

java 复制代码
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
java 复制代码
        File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(file,new File("test_001.png"));

图片保存在项目下:

这里有个弊端,因为我们固定了文件名为"test_001.png",那如果我们需要批量截图的话前一次的截图都会被覆盖,保存下来的截图只有最后一张,为了解决这个问题,我们可以使用时间戳命名,在文件名中加入时间戳(精确到秒),确保每次截图名称唯一。

java 复制代码
/**
         * image/
         *      2025-12-04/
         *                  funcName_120440500.png
         *                  ......
         *      2025-12-05/
         *                  funcName_120440500.png
         *                  ......
         */
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");

        String dirTime = sim1.format(System.currentTimeMillis());
        String fileTime = sim2.format(System.currentTimeMillis());

        //image/2025-12-04/funcName-120440500.png
        String filename = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";
        File srcfile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(srcfile , new File(filename));

4、关闭窗口

java 复制代码
driver.close();

注意:窗口关闭后driver要重新定义

close() :关闭标签页

quit() :关闭浏览器

四、等待

通常代码执行的速度比页面渲染的速度要快,想要避免因为渲染过慢出现自动化报错的问题可以使用seleniu提供的三种方法:

1、强制等待

java 复制代码
Thread.sleep();

优点:使用简单,调试的时候比较有效

缺点:影响运行效率,浪费大量时间

2、隐式等待

隐式等待是一种智能等待,可以规定在查找元素时,在指定的时间内不断查找元素,如果查到则代码继续执行,直到超时没找到元素才会报错。

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

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

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

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

3、显示等待

显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码

new WebDriverWait(driver, Duration.ofSeconds(3)).until($express)

$express:涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类

返回值:boolean

java 复制代码
WebDriverWait foo = new WebDriverWait(driver, Duration.ofSeconds(3))
foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#chat-submit-button")));

ExpectedConditions预定义方法的⼀些示例:

  • elementToBeClickable(By locator) ---- 用于检查元素的期望是可见的并已启用,以便您可以单击它
  • textToBe(Bylocator,String str) ---- 检查元素
  • presenceOfElementLocated(Bylocator) ---- 检查页⾯的 DOM 上是否存在元素
  • urlToBe(java.lang.String url) ---- 检查当前页面的 URL 是⼀个特定的 URL

3.1、 隐显区别

特性 隐式等待 显式等待
作用范围 全局(整个Driver生命周期) 局部(针对特定条件/操作)
触发条件 元素查找(如 find_element 自定义条件(可见、可点击等)
灵活性 较低,无法处理复杂条件 高,支持多种条件组合
性能影响 可能增加不必要的等待时间 按需等待,效率更高
异常类型 NoSuchElementException TimeoutException

避免混合使用:隐式和显式等待同时使用可能导致不可预测的等待时间(如两者超时时间叠加)

优先使用显式等待:更精确、灵活,能有效减少测试执行时间

隐式等待慎用:仅在简单项目或静态页面中使用,并设置合理超时时间(一般不超过10秒)

默认设置:禁用隐式等待(设为0),全程使用显式等待

五、浏览器导航

打开网站:

java 复制代码
// 更⻓的⽅法
driver.navigate().to("https://selenium.dev");
// 简洁的⽅法
driver.get("https://selenium.dev");

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

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

六、弹窗

弹窗不属于页面元素,无法对弹窗进行元素定位,使用selenium提供的Alert接口

1、警告弹窗+页面弹窗

弹窗的操作有:

① 切换弹窗

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

② 点击确认按钮

java 复制代码
alert.accept();

③ 点击取消按钮

java 复制代码
alert.dismiss();

当弹窗上只有一个按钮时,accept和dismiss的效果一样

2、提示弹窗

④ 输入文本消息

java 复制代码
alert.sendKeys("张三");

在弹窗输入文本的过程看不到,但实际上有在输入

⑤ 获取弹窗上的提示文本

java 复制代码
String text = alert.getText();
        System.out.println(text);

七、文件上传

点击文件上传的场景下会弹窗系统窗口,进行文件的选择

selenium无法识别非web的控件,上传文件窗口为系统自带,所以selenium无法识别窗口元素,但是可以使用sendkeys来上传指定路径的文件,达到的效果与手动上传是⼀样的

java 复制代码
driver.findElement(By.cssSelector("body > div > div > input[type=file]"))
                .sendKeys("文件地址");

八、浏览器参数设置

java 复制代码
//edge浏览器配置
WebDriverManager.edgedriver().setup();
EdgeOptions options = new EdgeOptions();
java 复制代码
//谷歌浏览器配置
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
java 复制代码
//火狐浏览器配置
WebDriverManager.firefoxdriver().setup();
FirefoxOptions options = new FirefoxOptions();

在工作中经常使用 "-headless" 无痕模式

设置浏览器加载策略:

在做自动化测试的过程中会发现自动化打开页面加载的速度很慢,drive.get() 方法默认页面所有元素加载完成在执行下一步,为了提升效率,可以使用options.setPageLoadStrategy()。

options.setPageLoadStrategy() 是 Selenium 控制页面加载策略的方法,用来告诉浏览器:"页面加载到什么程度就算完成?"

setPageLoadStrategy 有三种类型的页面加载策略:

① NORMAL(默认)

java 复制代码
options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
  • 等整个页面完全加载完(包括图片、CSS、JS等)

  • 最慢,但最稳定

  • 适用于需要完整页面的场景

  • 不建议使用

② EAGER

java 复制代码
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
  • 只要 DOM 加载完成(HTML结构好了)就继续

  • 不等图片、CSS等

  • 最常用,速度快很多

③ NONE

java 复制代码
options.setPageLoadStrategy(PageLoadStrategy.NONE);
  • 完全不等待页面加载

  • 立即执行下一步操作

  • 风险最高,容易出错

相关推荐
月亮!20 小时前
移动端测试重磅升级:跨平台自动化测试框架深度对比
运维·网络·人工智能·测试工具·容器·自动化·测试用例
m_136871 天前
n8n 企业级自动化 · 专栏完整目录树(50+ 节点级规划)
自动化·n8n
m_136871 天前
《Code 节点实战:用 JavaScript 接管自动化系统的核心逻辑(企业级实战)》
自动化·n8n
谷粒.1 天前
自动化测试覆盖率从30%到80%的演进历程:策略、挑战与未来展望
运维·网络·深度学习·架构·自动化·transformer·测试覆盖率
科普瑞传感仪器1 天前
航空航天领域青睐:复杂曲面机器人抛光为何必须采用六维力控?
运维·人工智能·机器人·自动化·无人机
谷粒.1 天前
让缺陷描述更有价值:测试报告编写规范的精髓
java·网络·python·单元测试·自动化·log4j
科士威传动1 天前
滚珠导轨平行度安装的关键步骤
人工智能·科技·机器学习·自动化·制造
北京耐用通信1 天前
电磁阀通讯频频“掉链”?耐达讯自动化Ethernet/IP转DeviceNet救场全行业!
人工智能·物联网·网络协议·安全·自动化·信息与通信
吃喝不愁霸王餐APP开发者2 天前
霸王餐API文档自动化:Spring REST Docs与Asciidoctor多模块聚合
数据库·spring·自动化