2017-10-07 19 views
1

セレンのプログラムを実行しているときにセレンを学んでいます(datepickerから予定される日付を選択しています)。ページ文書。私はいくつかのオンラインソリューションを行ってきましたが、同時に動作していません。私は私のプログラムを実行している間DOMの要素を見つけることはできないと思います。解決策を教えてください。前もって感謝します。古い要素の参照:要素がページ文書に添付されていません。クロムブラウザのセレンの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

のWebページをロードするために、時間に依存するラインあなたが見ている時に '古い要素参照:要素がページ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(); 
    } 
} 

しかし、なぜだけに、この具体的な要素のために見ていません表示され、クリック可能になりますか?
使用この:webdriverをページがまだ読み込み中の要素にアクセスしようとしたとき

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を初期化した後、ページの読み込み時間を追加してみてください。

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

これは、次のページアクションに移動する前に、Webdriverにページが読み込まれるまで5秒間待機するように指示します。

また、秒数は、完全にあなたのアプリケーション

+0

このコードは私の問題を解決しませんでした。 – rocky

+0

あなたのコードのどの行にエラーが表示されているのかを分けてください。 IDEのコンソールウィンドウで見ることができます。 –

関連する問題