2016-03-28 3 views
3

検索結果のすべてのタイトルをページごとに印刷しようとしています。次のボタンを使用してGoogle検索ページをナビゲートし、WebDriverでリンクタイトルを印刷する

Googleを検索し、最初のページのタイトルを印刷すると成功します。しかし、次のボタンをクリックして2番目のページのタイトルを印刷しようとすると、エラーが発生します。

最初のページの次のボタンをクリックして2番目のページタイトルを印刷するにはどうすればよいですか?

マイコード:

public class goopick { 

public static void main(String[] args) { 

    WebDriver driver = new FirefoxDriver(); 

    searchGoogle(driver, "Selenium Interview Questions");  

    printSiteNames(getSiteNames(driver));  

    clickNextButton(driver); 

    printSiteNames(getSiteNames(driver));  

} 

private static List<WebElement> getSiteNames(WebDriver driver){ 
    return driver.findElements(By.xpath("//*[@id='rso']/div/div/div[@class='rc']/h3/a")); 
} 

private static void searchGoogle(WebDriver driver, String searchString) { 
    driver.get("https://www.google.co.in/?gfe_rd=cr&ei=LSX1VvXDLKmumQW7irJw&gws_rd=ssl"); 
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
    driver.findElement(By.id("lst-ib")).sendKeys(searchString); 
    driver.findElement(By.className("lsb")).click(); 
} 

private static void printSiteNames(List<WebElement> sitenames) { 
    int i = 1; 
    System.out.println("----------------------------------xxxx----------------------------"); 
    for (WebElement sitename : sitenames) { 
     String site = sitename.getText(); 
     System.out.println(i + ") " + site); 
     i++; 
    } 
    System.out.println("----------------------------------xxxx----------------------------"); 
} 

private static void clickNextButton(WebDriver driver) { 
    WebElement NextButton = driver.findElement(By.xpath("//a[@id='pnnext']/span[2]")); 
    NextButton.click(); 
    System.out.println("Next Button Clicked"); 
    driver.navigate().forward(); 
    } 
} 

出力およびエラー:プラビーン・クマール@

Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up 
Command duration or timeout: 30.79 seconds 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html 
+0

デバッグがお手伝いします!! –

+0

次のページボタンがXHR要求を開始することに注意してください。つまり、Seleniumはリクエストの完了を待たず、単に実行を続行します。ボタンを押すと、おそらく最初のページから要素が取得されます(更新は即時ではありません)。タイトルを手に入れようとすると、ページは既に新しい結果で更新されており、最初のページのタイトルはもう存在しません。続行する前に2ページ目が読み込まれるまで待ちます。 – skandigraun

+0

[次へ]ボタンをクリックした後で待ちます。 – noor

答えて

-1

は最初の古い要素がexception.A古い要素参照例外が2例1でスローされているかを理解してください、

1.The element has been deleted entirely.(more common) 
2.The element is no longer attached to the DOM. 

詳細はセレン公式サイトをご覧ください。今

public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     System.setProperty("webdriver.chrome.driver", "D:\\eclipseProject\\StackOverFlow\\chromedriver_win32 (1)\\chromedriver.exe"); 
     WebDriver driver = new ChromeDriver(); 
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
     driver.get("https://www.google.co.in/?gfe_rd=cr&ei=OhT5VrLwE-iK8QfV74WwCA"); 

     // performing google search 
     driver.findElement(By.name("q")).sendKeys("Selenium Interview Questions"); 
     driver.findElement(By.name("btnG")).click(); 

     // printing all sites name 

     List<WebElement> allsites = driver.findElements(By.xpath("//*[@id='rso']/div/div/div[@class='rc']/h3/a")); 
     for(int i =0;i<allsites.size();i++){ 
      System.out.println("All Sites Name is : " + allsites.get(i).getText()); 
      // now clicking link to go to the next page 
      allsites.get(i).click(); 

      // getting title of the opened URL 
      System.out.println("Title of the Next Page is : "+ driver.getTitle()); 

      // navigating back to the previous page 
      driver.navigate().back(); 

      // now when you will try to click the next link in the line you will face 
      // Stale Element Exception as element is not attached to the page document 
      // so re-attached it we have to redefine it. 
      allsites = driver.findElements(By.xpath("//*[@id='rso']/div/div/div[@class='rc']/h3/a")); 

      // now it will work like a charm. Hope this solves the issue 
     } 

    } 

あなたの問題を解決

が、これはあなたの問題を解決を願っています。

0

@praveen kumar - あなたは次のページに到達したらコードを更新できます。下のコードでxpath/class id/link idを印刷して更新するテキストのxpathを確認してください。

@Test(priority=2) 
     public void printPageHeader() throws InterruptedException{ 

      java.util.List<WebElement> allText = driver.findElements(By.xpath("//*[@id='app']/div/header/nav[1]/div/div/span/span")); 
      for (WebElement element: allText) { 
       System.out.println(element.getText()); 
     } 
     } 
関連する問題