Chrome Selenium如何使用多窗口切换标签并提取临时邮箱OTP验证码
解决方法
1. 保留临时邮箱页面不被覆盖
你之前在同一个标签页调用driver.get()访问Twitter,自然会覆盖临时邮箱页面,改用多标签页+窗口句柄管理的方案即可,核心逻辑是:
- 打开临时邮箱页面后,先保存该标签页的窗口句柄
- 通过执行JS打开新标签页访问Twitter,所有Twitter操作都在新标签页完成
- 需要收验证码时,切换回之前保存的临时邮箱句柄即可,不会生成新邮箱
2. 提取OTP纯数字内容
拿到OTP文本后,用正则匹配提取所有连续数字即可,直接过滤掉所有非数字字符。
修改后的完整代码
import org.openqa.selenium.*; import org.openqa.selenium.support.ui.*; import java.util.Set; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.concurrent.TimeUnit; // 自行补全ChromeDriver初始化逻辑 WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(300, TimeUnit.SECONDS); WebDriverWait wait = new WebDriverWait(driver, 30); // 打开临时邮箱,保存当前窗口句柄 driver.get("https://tempail.com/en/"); String tempMailHandle = driver.getWindowHandle(); // 提取邮箱地址 WebElement copyButton = driver.findElement(By.xpath("//input[@id='eposta_adres']")); String email = copyButton.getAttribute("value"); System.out.println("生成的临时邮箱:" + email); // 打开新标签页访问Twitter ((JavascriptExecutor) driver).executeScript("window.open('https://mobile.twitter.com/','_blank');"); // 切换到新打开的Twitter标签页 Set<String> allHandles = driver.getWindowHandles(); for (String handle : allHandles) { if (!handle.equals(tempMailHandle)) { driver.switchTo().window(handle); break; } } // 原有Twitter注册逻辑 driver.findElement(By.xpath("//div[@dir='auto']//*[contains(text(),'Sign up with phone or email')]")).click(); wait.until(ExpectedConditions.visibilityOfElementLocated(By.name("name"))).sendKeys("abc5643754"); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[text()='Use email instead']"))).click(); wait.until(ExpectedConditions.visibilityOfElementLocated(By.name("email"))).sendKeys(email); Select month = new Select(wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("SELECTOR_1")))); Select day = new Select(wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("SELECTOR_2")))); Select year = new Select(wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("SELECTOR_3")))); month.selectByValue("10"); day.selectByValue("14"); year.selectByValue("1992"); for(int i=0; i<2; i++) { Thread.sleep(1000); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@dir='auto']//*[contains(text(),'Next')]"))).click(); } wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@dir='auto']//*[contains(text(),'Sign up')]"))).click(); // 提交注册后切回临时邮箱标签页收验证码 driver.switchTo().window(tempMailHandle); // 等待Twitter邮件加载,最多等待60秒,可自行调整时长 wait.withTimeout(60, TimeUnit.SECONDS).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(text(),'Twitter') or contains(text(),'X')]"))).click(); // 定位OTP元素,可根据临时邮箱实际渲染结构调整XPath WebElement otpElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(@class,'mail-content')]"))); String otpText = otpElement.getText(); // 提取纯数字OTP Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(otpText); String otpCode = ""; if (matcher.find()) { otpCode = matcher.group(); } System.out.println("提取到的纯数字OTP:" + otpCode); // 后续可再次切换回Twitter标签页输入验证码完成注册
内容的提问来源于stack exchange,提问作者Shankar R
相关产品推荐
相关产品推荐

