我正在尝试使用Selenium WebDriver Java自动执行日历。当要标识日期并单击日期时,它将引发StaleElementRefernceExeception。请查看下面的代码,并帮助我修复它。
package com.initial.selenium;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Calender2 {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\Shahid\\eclipseworkspace\\InitialSeleniumProject\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://www.path2usa.com/travel-companions");
driver.findElement(By.xpath("//*[@id='travel_from']")).sendKeys("Chicago");
driver.findElement(By.xpath("//*[@id='Rockford']")).click();
driver.findElement(By.xpath("//*[@id='travel_to']")).sendKeys("Dallas");
driver.findElement(By.xpath("//*[@id='Dallas-Fort Worth']")).click();
driver.findElement(By.xpath("//*[@id='travel_date']")).click();
WebElement DateMonth=driver.findElement(By.xpath("//div[@class='datepicker- days']/table/thead/tr/th[2]"));
WebElement datechanger=driver.findElement(By.xpath("//div[@class='datepicker- days']/table/thead/tr/th[3]"));
List<WebElement> dates=driver.findElements(By.tagName("td"));
while(!DateMonth.getText().contains("April")) {
datechanger.click();
for(int i=0;i<dates.size();i++) {
if(dates.get(i).getText().equalsIgnoreCase("23")) {
dates.get(i).click();
break;
}
}
}
}
}
答案 0 :(得分:0)
StaleElementReferenceException是当您尝试对其进行操作的元素不再存在于html中或变得陈旧时出现的。因此,要更正它,您必须再次获取元素。
根据您的情况,您可以通过在while
循环中进行以下更改来纠正此问题:
List<WebElement> dates=driver.findElements(By.tagName("td"));
while (!DateMonth.getText().contains("April")) {
datechanger.click();
dates=driver.findElements(By.tagName("td"));
for (int i = 0; i < dates.size(); i++) {
if (dates.get(i).getText().equalsIgnoreCase("23")) {
dates.get(i).click();
break;
}
}
}
此外,您要更改的xpath是月份不正确,因此请使用下面给出的xpath代替您正在使用的xpath:
WebElement datechanger=driver.findElement(By.xpath("(//th[@class='prev'])[1]"));