Selenium操作MakeMyTrip出发日期选择器触发点击拦截异常如何解决
问题原因
你遇到的ElementClickInterceptedException是Selenium常见的点击拦截异常,从错误日志可以直接定位根因:
- 页面加载完成后自动弹出了登录模态框(对应报错信息中的
<div data-cy="outsideModal" class="loginModal ..."></div>元素),该弹窗的层级高于你要点击的出发日期字段 - 你尝试点击日期字段时,点击事件被上层的登录弹窗拦截,无法触达目标元素
解决方案
推荐按优先级选择以下两种方案:
方案1:先关闭登录弹窗再操作(推荐,贴合真实用户操作)
先等待登录弹窗加载完成,点击关闭按钮清除遮挡后,再操作日期选择字段,示例代码如下:
// 导入依赖包 import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.By; import java.time.Duration; System.setProperty("webdriver.chrome.driver","C:/Users/Selenium/libs/Mar18/chromedriver.exe"); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().deleteAllCookies(); driver.get("http://www.makemytrip.com"); // 初始化显式等待,最长等待10秒 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // 等待登录弹窗关闭按钮可点击,执行关闭操作 wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("span.commonModal__close"))).click(); // 等待出发日期字段可点击后再点击 WebElement dateCal = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='font30 latoBlack']"))); dateCal.click();
提示:如果后续网站更新导致关闭按钮的class失效,可以改用data-cy等业务属性定位元素,稳定性更高
方案2:使用JavaScript点击绕过拦截
如果你的测试场景不需要验证登录弹窗的交互逻辑,可以直接通过JS执行点击,跳过元素层级拦截,示例代码如下:
// 导入依赖包 import org.openqa.selenium.JavascriptExecutor; // 原有页面操作逻辑不变 System.setProperty("webdriver.chrome.driver","C:/Users/Selenium/libs/Mar18/chromedriver.exe"); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().deleteAllCookies(); driver.get("http://www.makemytrip.com"); //定位日历元素 WebElement dateCal = driver.findElement(By.xpath("//span[@class='font30 latoBlack']")); // 用JS执行点击,绕过层级遮挡 JavascriptExecutor jsExecutor = (JavascriptExecutor) driver; jsExecutor.executeScript("arguments[0].click();", dateCal);
内容的提问来源于stack exchange,提问作者RaviS
相关产品推荐
相关产品推荐

