当我执行以下硒程序时,我正在学习硒(从日期选择器中选择预期日期)我得到过时的元素引用:元素未附加到页面文档。我已经通过了一些在线解决方案,但它不能同时工作。我认为在执行我的程序时,它找不到 DOM 中的元素。请指导我解决方案。提前谢谢。
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class skyscanner_datepicker
{
@Test
public void calender_func() throws InterruptedException
{
String expected_date = "January 2018";
String expected_day = "15";
System.setProperty("webdriver.chrome.driver", "D://rakesh//software//selenium browser//chrome 2.30//chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.skyscanner.co.in/");
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.findElement(By.id("js-depart-input")).click();
Thread.sleep(3000);
if(driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//span[@class='current']")).getText().equals(expected_date))
{
System.out.println("Date selected in if condition");
}
else
{
for(int i=1;i<=12;i++)
{
try
{
driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//div[@class='calendar-info-bar datepicker_clearfix']//button[2]")).click();
if(driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//span[@class='current']")).getText().equals(expected_date))
break;
System.out.println("date get selected");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
List<WebElement> day_list = driver.findElements(By.xpath("//div[@class='container-body']//tbody//tr//td"));
for(WebElement a : day_list)
{
if(a.getText().equalsIgnoreCase(expected_day))
{
a.click();
}
}
driver.quit();
}
}
我猜在这个循环中:
for(int i=1;i<=12;i++)
{
try
{
driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//div[@class='calendar-info-bar datepicker_clearfix']//button[2]")).click();
if(driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//span[@class='current']")).getText().equals(expected_date))
break;
System.out.println("date get selected");
}
catch (Exception e)
{
e.printStackTrace();
}
}
您正在尝试等待相同的日期值出现在元素中。
它几乎从未奏效!请改用显式等待。
熟悉:
- WebDriverWait 类
- 等待#直到函数
- 预期条件工厂方法(最常用的等待条件)
并使用此代码段代替上面的循环:
// wait up to 30 seconds
WebDriver wait = new WebDriverWait( driver, 30 );
final By element = By.xpath("//div[@class='popover skyscanner-datepicker depart']//span[@class='current']");
wait.until(ExpectedConditions.textToBePresentInElementLocated( element, expected_date ));
这将等待 30 秒让日期出现在元素中,如果该值在 30 秒内不可见,则将引发超时异常。
此代码检索所有元素,然后在循环中仅查找一个元素,然后尝试单击它:
List<WebElement> day_list = driver.findElements(By.xpath("//div[@class='container-body']//tbody//tr//td"));
for(WebElement a : day_list)
{
if(a.getText().equalsIgnoreCase(expected_day))
{
a.click();
}
}
但是为什么不寻找这个具体元素变得可见和可点击呢?
使用这个:
final String elementXpath = String.format(
"//div[@class='container-body']//tbody//tr//td[ contains( ., '%s' ) ]",
expected_day );
final By elementToClick = By.xpath( elementXpath );
// wait until element appears and becomes clickable, then click it
wait.until(ExpectedConditions.elementToBeClickable( elementToClick )).click();
Web驱动程序尝试在页面仍在加载时访问元素时,可能会导致StaleElementReference异常。尝试在初始化 Web 驱动程序后添加页面加载超时。
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
这将告诉 Web 驱动程序最多等待 5 秒钟以加载页面,然后再移动到下一页操作。
此外,秒数取决于完全加载应用程序网页的时间