基于Selenium+Java实现WhatsApp Web首次扫码后免二维码验证
解决WhatsApp Web Selenium驱动无需重复扫码的问题
嗨,我来帮你搞定这个需求!要实现首次扫码后,后续用Selenium启动WhatsApp Web不用再扫二维码,关键是让ChromeDriver复用已保存登录会话的用户数据目录——WhatsApp的登录状态就存在这个目录的Cookie和本地存储里,只要驱动加载它,就能直接进入已登录状态。
具体实现步骤
核心思路是通过ChromeOptions配置用户数据目录(现在更推荐用ChromeOptions,它是ChromeDriver的官方推荐配置方式,替代略显过时的DesiredCapabilities):
- 选择用户数据目录:
- 可以用Chrome默认的用户数据目录(路径一般是
C:\\Users\\你的Windows用户名\\AppData\\Local\\Google\\Chrome\\User Data),但注意如果你的日常Chrome浏览器正在运行,会和驱动冲突,所以更稳妥的是自定义一个单独的目录来专门给Selenium用。
- 可以用Chrome默认的用户数据目录(路径一般是
- 修改你的Java代码:
把原来的代码调整为以下形式,添加用户数据目录的配置:
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chrome.ChromeDriverService; import java.io.File; public class DriverTester { public static void main(String[] args) { // 设置ChromeDriver的路径 System.setProperty("webdriver.chrome.driver", "C:\\whatsup\\src\\main\\resources\\chromedriver.exe"); // 配置ChromeOptions,指定用户数据目录 ChromeOptions options = new ChromeOptions(); // 替换成你自定义的目录路径,比如专门用于Selenium会话的目录 String userDataDir = "C:\\whatsup\\selenium-chrome-profile"; options.addArguments("user-data-dir=" + userDataDir); // 可选:关闭Chrome的自动化提示弹窗 options.addArguments("--disable-infobars"); // 初始化ChromeDriver服务(保持你原有的服务配置) ChromeDriverService service = new ChromeDriverService.Builder() .usingDriverExecutable(new File("C:\\whatsup\\src\\main\\resources\\chromedriver.exe")) .build(); // 用配置好的Options启动ChromeDriver ChromeDriver driver = new ChromeDriver(service, options); // 打开WhatsApp Web driver.get("https://web.whatsapp.com/"); // 首次运行需扫码登录,之后再次启动会直接加载已保存的登录状态 } }
关键注意事项
- 首次运行必做:第一次启动时还是需要扫码登录,登录状态会自动保存到你指定的
user-data-dir目录中; - 目录权限:确保Java程序有读写这个自定义目录的权限,否则无法保存或加载会话数据;
- 避免冲突:不要同时运行日常使用的Chrome和Selenium驱动的Chrome(如果用默认用户目录的话),否则会触发报错,所以优先推荐自定义单独目录;
- 版本匹配:确保ChromeDriver版本和本地安装的Chrome浏览器版本一致,否则会出现兼容性问题。
内容的提问来源于stack exchange,提问作者Roni Koren Kurtberg
相关产品推荐
相关产品推荐

