使用Selenium Java操作MakeMyTrip无法定位出发日历元素该如何解决
MakeMyTrip网站Selenium动态选择当前日期解决方案
元素不可点击问题主要来自两个原因:一是用了固定时长的
Thread.sleep,无法保证元素加载完成且处于可交互状态;二是MakeMyTrip首页默认会弹出登录浮层,遮挡了下方的出发日期输入控件,直接操作输入框会被拦截。
以下是完全无需硬编码日期的实现方案:
- 使用Selenium显式等待替换
Thread.sleep,自动等待元素达到可交互状态再执行操作 - 优先处理页面遮挡的登录浮层,避免操作被拦截
- 利用日历控件的内置类名匹配当前日期元素,无需写死任何日期数值
完整实现代码
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; public class MmtDatePicker { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C:\\Users\\rutsahoo\\Documents\\chromedriver.exe" ); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get("https://www.makemytrip.com/"); // 显式等待设置,最长等待10秒 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // 点击空白处关闭弹出的登录浮层 wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("body"))).click(); // 等待出发日期输入框可点击后触发日历弹窗 wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//label[@for='departure']"))).click(); // 直接定位日历中当天的元素(自带固定类名无需硬编码日期) wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(".react-datepicker__day--today"))).click(); // 后续业务逻辑... driver.quit(); } }
扩展通用日期选择方案(可选)
如果需要选择非当日的其他日期,可通过Java时间类动态计算目标日期,同样无需硬编码:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Locale; // 示例:选择当前日期后7天的日期 String targetDate = LocalDate.now().plusDays(7) .format(DateTimeFormatter.ofPattern("EEE MMM dd yyyy", Locale.ENGLISH)); // 匹配日历控件中对应日期的属性点击 wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("[aria-label='" + targetDate + "']"))).click();
内容的提问来源于stack exchange,提问作者Anjali
相关产品推荐
相关产品推荐

