2017-10-07 64 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的控制檯窗口中看到它。 –

相關問題