使用Selenium+JUnit框架测试时如何检测网页弹窗是否已显示
问题原因
手动测试时浏览器会留存cookie、本地存储记录,网站会通过这类标记判断用户已经关闭过弹窗,所以只会触发一次。而LambdaTest每次执行自动化用例都会生成全新的干净浏览器实例,没有历史存储记录,因此每次都会触发弹窗加载。
解决方案
1. 不依赖文案的通用弹窗检测逻辑
不要基于弹窗文案做匹配,优先抓取弹窗的稳定共性特征:
- 外层容器固定的类名前缀(如
popup、modal、notice这类通用模态框类名) - 固定的高z-index属性(通常弹窗z-index会设置在9999以上)
- 统一的关闭按钮元素特征(如关闭按钮的类名、图标标签属性)
2. Selenium+JUnit 实现代码
将弹窗检测逻辑封装为通用方法,放在测试用例的前置执行逻辑中,每次页面加载完成后先执行检测:
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; // 通用弹窗检测关闭方法 public void checkAndClosePopup(WebDriver driver) { // 替换为目标网站弹窗的稳定外层容器选择器,可添加多个可能的选择器覆盖不同营销弹窗 By[] popupLocators = { By.cssSelector("div[class*='popup']"), By.cssSelector("div[class*='modal']"), By.cssSelector("div[class*='marketing-notice']") }; // 替换为目标网站关闭按钮的稳定选择器 By[] closeBtnLocators = { By.cssSelector("button[class*='close']"), By.cssSelector("svg[class*='close-icon']"), By.cssSelector(".popup-close-btn") }; WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5)); for (By popupLocator : popupLocators) { try { // 检测弹窗是否可见 if (wait.until(ExpectedConditions.visibilityOfElementLocated(popupLocator)).isDisplayed()) { // 匹配可用的关闭按钮点击 for (By closeBtnLocator : closeBtnLocators) { try { wait.until(ExpectedConditions.elementToBeClickable(closeBtnLocator)).click(); wait.until(ExpectedConditions.invisibilityOfElementLocated(popupLocator)); break; } catch (Exception ignored) {} } } break; } catch (Exception ignored) { // 未匹配到当前类型弹窗则跳过,检测下一类 } } }
在JUnit的前置钩子中调用该方法即可:
import org.junit.jupiter.api.BeforeEach; import org.openqa.selenium.chrome.ChromeDriver; public class SiteTest { private WebDriver driver; @BeforeEach public void init() { driver = new ChromeDriver(); driver.get("你的目标测试页面地址"); // 页面加载后先检测关闭弹窗 checkAndClosePopup(driver); } }
3. 优化方案:从根源避免弹窗触发
如果需要进一步减少等待时间,可以手动抓取网站标记弹窗已关闭的存储字段,在测试启动时直接植入浏览器,跳过弹窗触发逻辑:
- 手动打开目标网站,关闭弹窗后打开浏览器控制台-应用面板,查看Cookie和LocalStorage中新增的字段,通常为
popup_closed=1、modal_showed=true这类格式 - 在测试前置逻辑中,页面加载完成后手动写入对应Cookie或LocalStorage字段,后续操作就不会再触发弹窗
内容的提问来源于stack exchange,提问作者Edijs Bergs
相关产品推荐
相关产品推荐

