2016-12-15 1 views
0

選択フライトページからフライトを選択しようとしていますが、ページ。私は別の要素ロケータを使用しようとしましたが、それでも動作しません。あなたは助けてもらえますか?要素がWebページで認識されない - キャッシュに要素が見つかりません - ページが参照されてから変更されている可能性があります

public class Cal_AA { 
static WebDriver driver; 

public static void main(String[] args) throws ParseException, InterruptedException { 


    driver = new FirefoxDriver(); 
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 
    driver.manage().window().maximize(); 
    driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS); 
    driver.get("https://www.americanairlines.ie/intl/ie/index.jsp?locale=en_IE"); 

    driver.findElement(By.xpath("//*[@id='bookingModule']/div[1]/div[1]/ul/li[2]/label/span[2]")).click(); 
    driver.findElement(By.xpath("//*[@id='reservationFlightSearchForm.originAirport']")).sendKeys("LHR"); 
    driver.findElement(By.xpath("//*[@id='reservationFlightSearchForm.destinationAirport']")).sendKeys("DFW"); 

    driver.findElement(By.xpath("//*[@id='aa-leavingOn']")).click(); 
    selectDate("12/06/2017"); 

} 


public static void selectDate(String date) throws ParseException, InterruptedException{ 

    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
     Date dateToBeSelected = df.parse(date); 
     Date currentDate = new Date(); 
     String monthYearDisplayed = driver.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[1]/div/div")).getText(); 

     System.out.println("month year displayed " + monthYearDisplayed); 
     String month = new SimpleDateFormat("MMMM").format(dateToBeSelected); 
     String year = new SimpleDateFormat("yyyy").format(dateToBeSelected); 
     String day = new SimpleDateFormat("dd").format(dateToBeSelected); 
     String monthYearToBeSelected=month+ " "+year; 
     System.out.println(monthYearToBeSelected); 


     while(true){ 
    if (monthYearToBeSelected.equals(monthYearDisplayed)) { 
       //select date 
       driver.findElement(By.xpath("//a[text()='"+day+"']")).click(); 
       System.out.println("Found and Selected"); 
       break; 

     }else{//if you are not in the right month & year, you have to then navigate to the right month & year 

      if(dateToBeSelected.after(currentDate)){ 


       driver.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[2]/div/a")).click();//click fowardicon 

      }else{ 
       driver.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[1]/div/a")).click();//click backicon 
      } 

     } 
    monthYearDisplayed = driver.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[1]/div/div")).getText(); 
} 



    driver.findElement(By.xpath("//*[@id='bookingModule-submit']")).click(); 

    //driver.findElement(By.xpath("//*[@id='table-bound0-column0']")).click(); 
    //driver.findElement(By.cssSelector("*[id='table-bound0-column0']")).click(); 

    Thread.sleep(5000); 
    driver.findElement(By.xpath("//*[@id='tpl3_table-bound0-cell00-available']")).click(); 

    //driver.findElement(By.cssSelector("*[id='tpl3_table-bound0-cell00-available']")).click(); 
    //driver.findElement(By.id("tpl3_table-bound0-cell01-available")).click(); 

    //WebDriverWait wait = new WebDriverWait(driver, 50); 

    //WebElement tpl3 = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("tpl3_table-bound0-cell01-available"))); 
    //tpl3.click(); 



} 



} 

答えて

0

StaleElementExceptionは、私は要素を見つけた場合、DOMは、私はJavascriptがfindElement呼び出した後、私はStaleElementExceptionを取得しますクリックコールの間にページを更新しelement.fと対話しようとし、その後更新されますが発生します。現代のWebページでこれが起きることは珍しいことではありません。しかし、一貫して起こることはありません。このバグが発生するタイミングはちょうど正しいものでなければなりません。

次のコードは、あなた

パブリッククラスCal_AA {

static WebDriver driver; 
public static void main(String[] args) throws Exception { 
    driver = new FirefoxDriver(); 
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
    driver.manage().window().maximize(); 
    driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS); 
    driver.get("https://www.americanairlines.ie/intl/ie/index.jsp?locale=en_IE"); 

    driver.findElement(By.xpath("//*[@id='bookingModule']/div[1]/div[1]/ul/li[2]/label/span[2]")).click(); 
    driver.findElement(By.xpath("//*[@id='reservationFlightSearchForm.originAirport']")).sendKeys("LHR"); 
    driver.findElement(By.xpath("//*[@id='reservationFlightSearchForm.destinationAirport']")).sendKeys("DFW"); 

    driver.findElement(By.xpath("//*[@id='aa-leavingOn']")).click(); 
    selectDate("12/06/2017"); 

} 


public static void selectDate(String date) throws Exception{ 

    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
    Date dateToBeSelected = df.parse(date); 
    Date currentDate = new Date(); 
    String monthYearDisplayed = driver.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[1]/div/div")).getText(); 

    System.out.println("month year displayed " + monthYearDisplayed); 
    String month = new SimpleDateFormat("MMMM").format(dateToBeSelected); 
    String year = new SimpleDateFormat("yyyy").format(dateToBeSelected); 
    String day = new SimpleDateFormat("dd").format(dateToBeSelected); 
    String monthYearToBeSelected=month+ " "+year; 
    System.out.println(monthYearToBeSelected); 


    while(true){ 
     if (monthYearToBeSelected.equals(monthYearDisplayed)) { 
      //select date 
      driver.findElement(By.xpath("//a[text()='"+day+"']")).click(); 
      System.out.println("Found and Selected"); 
      break; 

     }else{//if you are not in the right month & year, you have to then navigate to the right month & year 

      if(dateToBeSelected.after(currentDate)){ 


       driver.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[2]/div/a")).click();//click fowardicon 

      }else{ 
       driver.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[1]/div/a")).click();//click backicon 
      } 

     } 
     monthYearDisplayed = driver.findElement(By.xpath("//*[@id='ui-datepicker-div']/div[1]/div/div")).getText(); 
    } 



    driver.findElement(By.xpath("//*[@id='bookingModule-submit']")).click(); 

    //driver.findElement(By.xpath("//*[@id='table-bound0-column0']")).click(); 
    //driver.findElement(By.cssSelector("*[id='table-bound0-column0']")).click(); 

    Thread.sleep(20000); 

    int attempts = 0; 
    while(attempts < 4) { 
     try { 
      driver.findElement(By.xpath("//div[@class='availability-container row']/descendant::div[contains(@id,'table-bound0-cell00-available-content')][1]")).click(); 
      System.out.println("CLICKED !!"); 
      break; 
     } catch(Exception e) { 
      System.out.println("EXCEPTION OCCURED..RETRY !!"); 
     } 
     attempts++; 
    } 


    //driver.findElement(By.cssSelector("*[id='tpl3_table-bound0-cell00-available']")).click(); 
    //driver.findElement(By.id("tpl3_table-bound0-cell01-available")).click(); 

    //WebDriverWait wait = new WebDriverWait(driver, 50); 

    //WebElement tpl3 = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("tpl3_table-bound0-cell01-available"))); 
    //tpl3.click(); 



} 

}

+0

こんにちはShubhamのために、これはうまく機能し動作します。どうもありがとうございました。上で使用したxpathをどのように導いたかについて、より多くの光を投げてください。 – Osa101

+0

こんにちはShubham Mathur、私はSeleniumが任意の利用可能なセルをランダムにクリックすべきスクリプトを書いています。どうすれば利用可能なすべてのセルを処理するxpathを構築できますか? – Osa101

関連する問題