2017-02-26 9 views
-1

Googleにナビゲートして検索を実行し、最初の結果ページのすべての結果のタイトルを取得する課題がありました。WebElementsをループしながらリストのインデックスをスキップしました。

私はxpathでfindElementsを使用し、各結果とdriver.navigate().back()をループしようとしました。それはStaleElementReferenceExceptionを投げ、私はtry-catchブロックを書き、catchブロックのfindElementsを初期化し始めました。

私のfindElementsのsize()を取得しようとしているとき、暗黙の待機を使用したときに9と判定されていました。明示的なものを使用し、Thread.sleepとsize()も実際には13に設定されていました。これは私が期待していたものです。

すべてがうまくいくと、インデックスが6から12の後にスキップされるのがわかります。何が起きているのか分かりません。誰かが間違っていると私に言うことができますか?ありがとう!

以下

が私のコードです:あなたが述べてきたように

@BeforeClass 
    public void setup() { 
     driver = LoadWebDriver.getWebDriver(); 
    } 

    @Test(priority=0) 
    public void navigateTo() { 
     driver.manage().window().maximize(); 
     driver.get("https://www.google.co.in/"); 
    } 

    @Test(priority=1) 
    public void getTheTitles() throws InterruptedException { 

     String xPath = "//h3/a"; 
     int a = 0; 
     boolean loopThru = true; 
     driver.findElement(By.id("lst-ib")).sendKeys("Java",Keys.ENTER); 
//  WebDriverWait wait = new WebDriverWait(driver, 10); 
//  wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(xPath))); 
//  Thread.sleep(3000); 
     driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); 
     List<WebElement> dan = driver.findElements(By.xpath(xPath)); 
     System.out.println("** The fucking size is "+dan.size()+" **"); 
     while(loopThru) { 
      try { 
       dan = driver.findElements(By.xpath(xPath)); 
       for (int i = a; i < dan.size(); i++) { 
        if(i==dan.size()-1){ 
         loopThru=false; 
        } 
        dan.get(a).click(); 
        String theTitle = driver.getTitle(); 
        System.out.println(a+" "+theTitle); 
        driver.navigate().back(); 
       } 

      } 

      catch(Exception e) { 
       a++; 
       dan = driver.findElements(By.xpath(xPath)); 
       loopThru = true; 

      } 
     } 
    } 



    @AfterClass 
    public void tearDown() { 

       driver.close(); 
    } 
+0

ルックはおそらく助けるあなたはhttp://stackoverflow.com/questions/41999207/not-able-to-get-links-of-all-the-total-pages/42001030#42001030 – NarendraR

答えて

0

、リンクのいずれかをクリックすることで、検索結果ページから離れて移動すると、それは不可能後で再びその特定のページのWebElement参照を使用することができます。したがって、検索結果ページに戻ると、リンクを再度クリックすると、findのリンクが再度表示されます。ここで

は、私は(大体あなたの最初のコードに基づく)ことを行うだろう方法は次のとおりです。

driver.get("http://www.google.com"); 

driver.findElement(By.id("lst-ib")).sendKeys("Java" + Keys.ENTER); 

int size = new WebDriverWait(driver, 5).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//h3/a"))).size(); 

System.out.println(size + " links"); 

for (int idx = 0; idx < size; idx++) { 
    List<WebElement> links = new WebDriverWait(driver, 5).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//h3/a"))); 

    WebElement link = links.get(idx); 
    String href = link.getAttribute("href"); 

    link.click(); 

    System.out.println(idx + ": " + href + ": " + driver.getTitle()); 

    driver.navigate().back(); 
} 

あなたに次の出力を与えることになる:

12 links 
0: https://java.com/de/download/: Download der kostenlosen Java-Software 
1: https://www.java.com/de/download/faq/java_win64bit.xml: Welche Java-Version soll für eine 64-Bit-Version des Windows-Betriebssystems heruntergeladen werden? 
2: https://www.java.com/de/download/faq/remove_olderversions.xml: Warum sollte ich ältere Java-Versionen aus dem System deinstallieren? 
3: https://www.java.com/de/download/help/download_options.xml: Wie installiere ich Java? 
4: https://www.java.com/de/download/faq/whatis_java.xml: Was ist Java und warum brauche ich Java? 
5: https://www.java.com/de/: java.com: Java + Sie 
6: https://de.wikipedia.org/wiki/Java: Java – Wikipedia 
7: https://de.wikipedia.org/wiki/Java-Technologie: Java-Technologie – Wikipedia 
8: https://de.wikipedia.org/wiki/Java-Laufzeitumgebung: Java-Laufzeitumgebung – Wikipedia 
9: https://www.oracle.com/de/java/: Java Software | Oracle Deutschland 
10: http://stackoverflow.com/questions/tagged/java: Newest 'java' Questions - Stack Overflow 
11: http://www.javacafe.at/: JAVA Premiumcafe - Ein Zeichen gehobener Gastlichkeit 

をそのソリューションaoub物事のカップルに注意してください。

  1. 暗黙の待機ではなく明示的な待機文を使用すると、通常はより良い結果が得られますあなたは私たちが戻って検索結果ページに行き、すべてが理想的ではないが、それは古い要素の問題を回避するための最も簡単な方法だブラウザを再発見要素を有する
  2. を待ちたい正確に何を制御。より洗練された解決策は、すべてのリンクを最初に見つけて、hrefを保存し、後でページに移動してページタイトルを取得することでした。
  3. 私たちが戻ってきたたびに再度要素を見つけなければならないため、すべてのリンクが再び表示されるのを待って明示的に適用する必要があります。それがなければ、私たちはかなりランダムな結果を得るだろう。この回答へ
+0

私がやりましたリンクの事を考えるが、StaleReference事は私を他の場所に連れて行った。ありがとう。 :) –