2017-10-07 44 views
1

我正在学习硒当我执行以下硒程序(从datepicker选择预期日期)我得到陈旧的元素引用:元素不附加到页面文件。我已经通过一些在线解决方案,但它不能同时工作。我认为在执行我的程序的时候,它没有找到DOM中的元素。请指导我解决方案。提前致谢。陈旧的元素引用:元素没有附加到页面文件在Chrome浏览器中的硒webdriver

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(); 
} 

}

+1

的网页,在这行你也看到'陈旧元素参考:元素没有连接到页面document'? – DebanjanB

回答

0

我想,在这个循环:

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(); 
} 
} 

您要等待同一日期值出现在元素。

它几乎从来没有工作!改用显式等待。


熟悉:

,并使用这个片段代替以上循环:

// 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(); 
0

StaleElementReference异常可能webdriver的时候尝试访问该元素;而页面仍在加载已致。尝试在初始化webdriver后添加页面加载时间。

driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS); 

这会告诉webdriver等待最多5秒钟才能加载页面,然后再转到下一页操作。

而且,秒数取决于时间完全加载应用程序

+0

这段代码没有解决我的问题。即使增加秒数,我也会得到相同的错误 – rocky

+0

然后,请分享您的代码行出现错误。您可以在IDE的控制台窗口中看到它。 –

相关问题