Selenium日历操作异常:循环停在九月而非八月,日期打印未截止15日
Selenium日历自动化问题修正
问题1:循环期望停在八月却停在九月
错误原因
- 方向逻辑错误:你使用了
nextButton(下一个月按钮),如果当前月份晚于八月(比如九月),点击后只会跳到更晚的月份,永远无法到达八月;若当前月份早于八月,可能因页面元素加载延迟,导致代码重复点击一次,跳过八月到九月。 - 未处理元素加载延迟:点击月份切换按钮后,直接获取月份文本,可能页面还未更新,拿到的仍是旧月份值,引发多余点击。
修正方案
- 切换到上一个月按钮(
flatpickr-prev-month),而非下一个月按钮; - 点击后添加短暂等待,确保月份文本更新后再获取。
问题2:for循环打印所有日期而非到15日停止
错误原因
日期元素定位错误://div[@class='dayContainer']是整个日历的容器元素,而非单个日期元素。你的dates列表仅包含一个容器元素,调用getText()会取出容器内所有日期的文本,导致打印全部日期,且判断条件equals("15")永远不成立,无法触发break。
修正方案
定位单个日期元素,比如//div[@class='dayContainer']//div[@class='day'](适配flatpickr日历的元素结构),这样dates列表会包含所有单个日期元素,循环时逐个判断即可。
修正后的完整代码
package class1; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; public class calendar { public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.chrome.driver", "C:\\Users\\A0885643\\Desktop\\Selenium-Java\\Day1\\DriverWeb1\\drivers\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("https://www.path2usa.com/travel-companion/"); driver.manage().window().maximize(); Actions ac1 = new Actions(driver); JavascriptExecutor js = (JavascriptExecutor) driver; WebElement language = driver.findElement(By.xpath("//select[@name='form_fields[travel_comp_airline]']")); js.executeScript("arguments[0].scrollIntoView(true);", language); Thread.sleep(5000); WebElement calendar = driver.findElement(By.xpath("//input[@id='form-field-travel_comp_date']")); ac1.click(calendar).build().perform(); String months = driver.findElement(By.xpath("//span[@class='cur-month']")).getText(); // 替换为上一个月按钮 WebElement prevButton = driver.findElement(By.xpath("//span[@class='flatpickr-prev-month']")); while(!months.equals("August")) { prevButton.click(); // 点击后等待元素更新 Thread.sleep(1000); months = driver.findElement(By.xpath("//span[@class='cur-month']")).getText(); System.out.println("Current month: " + months); } Thread.sleep(2000); // 定位单个日期元素 List<WebElement> dates = driver.findElements(By.xpath("//div[@class='dayContainer']//div[@class='day']")); for(int i = 0;i<dates.size();i++) { String dateText = dates.get(i).getText().trim(); System.out.println(dateText); if(dateText.equals("15")) { break; } } driver.quit(); } }
内容的提问来源于stack exchange,提问作者Anshul Thakur
相关产品推荐
相关产品推荐

