You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Selenium WebDriver与Java的谷歌动态两步验证码自动化处理咨询

我之前在做Selenium自动化的时候也碰到过这个问题!谷歌的两步验证确实会给自动化脚本添点麻烦,但好在有几个可行的方案,结合你用Java的场景,给你详细说说:

方法1:用TOTP算法直接生成动态验证码

谷歌的两步验证本质上是基于TOTP(时间-based一次性密码)算法的,只要你能拿到测试账号设置2FA时的那个密钥(就是当初扫二维码时的一串字符,通常是32位左右的Base32字符串),就能用Java库实时生成当前的验证码。

步骤:

  1. 首先添加Maven依赖(用这个专门处理谷歌Auth的库):
<dependency>
    <groupId>com.warrenstrange</groupId>
    <artifactId>googleauth</artifactId>
    <version>1.5.0</version>
</dependency>
  1. 编写生成验证码的代码,直接在Selenium脚本里调用:
import com.warrenstrange.googleauth.GoogleAuthenticator;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class TOTPExample {
    public static void main(String[] args) {
        // 替换成你的测试账号的2FA密钥
        String totpSecret = "YOUR_TEST_ACCOUNT_TOTP_SECRET";
        
        WebDriver driver = new ChromeDriver();
        driver.get("目标网站登录页");
        
        // 先完成账号密码登录(这里省略账号密码输入的代码)
        // ...
        
        // 生成当前时刻的动态验证码
        GoogleAuthenticator ga = new GoogleAuthenticator();
        int currentCode = ga.getTotpPassword(totpSecret);
        
        // 把验证码填入输入框
        driver.findElement(By.id("totp-input")).sendKeys(String.valueOf(currentCode));
        
        // 点击登录按钮
        // ...
    }
}

优缺点:

  • ✅ 完全自动化,不需要人工干预
  • ❌ 必须拿到测试账号的TOTP密钥,要注意保密,别硬编码在代码里(可以存在配置文件或者环境变量中)
方法2:复用已登录的浏览器会话

如果测试环境的会话不会频繁过期,你可以先手动完成一次2FA登录,然后把浏览器的Cookie保存下来,后续Selenium启动时直接加载这些Cookie,就能跳过登录和2FA步骤。

代码示例:

import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.io.*;
import java.util.Set;

public class CookieReuseExample {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        File cookieFile = new File("test-account-cookies.data");
        
        if (cookieFile.exists()) {
            // 加载已保存的Cookie,跳过登录
            try (FileInputStream fis = new FileInputStream(cookieFile);
                 ObjectInputStream ois = new ObjectInputStream(fis)) {
                @SuppressWarnings("unchecked")
                Set<Cookie> cookies = (Set<Cookie>) ois.readObject();
                driver.get("目标网站首页"); // 先打开网站再添加Cookie
                for (Cookie cookie : cookies) {
                    driver.manage().addCookie(cookie);
                }
                driver.navigate().refresh(); // 刷新后就自动登录了
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        } else {
            // 第一次运行,手动完成登录和2FA,然后保存Cookie
            driver.get("目标网站登录页");
            // 这里手动操作完成登录和2FA...
            
            // 保存Cookie到文件
            try (FileOutputStream fos = new FileOutputStream(cookieFile);
                 ObjectOutputStream oos = new ObjectOutputStream(fos)) {
                oos.writeObject(driver.manage().getCookies());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        // 后续的自动化操作...
    }
}

优缺点:

  • ✅ 不需要处理验证码逻辑,实现简单
  • ❌ 如果测试环境定期清理会话,Cookie过期后需要重新手动登录一次
方法3:通过备用验证渠道获取验证码(如果支持)

如果你的测试账号的2FA允许选择邮件、短信这类备用验证方式,你可以用Java自动读取这些渠道的验证码。比如用JavaMail API连接测试邮箱,查找最新的包含验证码的邮件,提取后填入输入框;或者调用短信接收的API(如果有)获取验证码。

这个方法的前提是测试环境支持备用验证方式,而且你能访问对应的邮箱或短信接口。


最后提醒:

不管用哪种方法,都要和项目经理确认测试环境的安全策略,确保自动化方案符合团队的安全要求,同时注意保护测试账号的敏感信息(密钥、Cookie等),别泄露出去。

内容的提问来源于stack exchange,提问作者Asmaa Elhussainy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:25:17