2016-12-01 8 views
1

このコードは、ページ上の要素を見つけて抽出するために、いくつかのページを繰り返します。ループが完了すると、HashMapからこれらの要素を含むログファイルが生成されますが、結果は追加されず、上書きされます。テキストファイルに追加する

 int d = new Integer(0); 
     for (int i = 0; i <= 100; d += 10) { 
      String url = Constants.FilterUrl + "&startIndex=" + d; 
      this.getAuthors(); 
      driver.get(url); 
      if (!driver.getPageSource().contains("h3")) break; 
      } 

     /* Send HashMap values to text file */ 
     File file = new File(Constants.FILEPATH + Constants.dateFormat.format(new Date()) + ".txt"); 

     try{ 
      if(!file.exists()){ 

       System.out.println("We had to make a new file."); 
       file.createNewFile(); 
      } 
       PrintWriter out = new PrintWriter(new FileWriter(file), true); 
       map.forEach((k, v) -> out.println(k + ", " + v)); 
       out.append("************** " + "\n"); 
       out.close(); 
      } catch(IOException e) { 
       System.out.println("COULD NOT LOG!!"); 
      } 
} 

public void getAuthors(){ 
    List<WebElement> allElements = driver.findElements(By.tagName("h3")); 
    /* Create HashMap and store H3 elements in the key set */ 
    this.map = new HashMap<String, String>(); 
    for (WebElement element1 : allElements) { 
     map.put(element1.getText(), element1.findElement(By.tagName("a")).getAttribute("href")); 

    } 

    /* Visit pages for H3 elements and retrieve names of the authors */ 
    for (Map.Entry<String, String> entry : map.entrySet()) { 
     driver.get(entry.getValue()); 
     entry.setValue(driver.findElement(By.className("userlink-0")).getText()); 
    } 
} 

答えて

1

map.put(element1.getText(), element1.findElement(By.tagName("a")).getAttribute("href"));

HashMapに同じテキスト(element1.getText())のエントリがある場合、そのエントリは上書きされます。

また、コールごとにマップを作成すると、毎回新しいマップが作成され、以前のコンテンツのデータが失われる可能性があります。

/* Create HashMap and store H3 elements in the key set */ 
this.map = new HashMap<String, String>(); 

これはインスタンスレベルで作成する必要があります。

ユニークキーを生成するには、インスタンスレベルで数値変数を定義し、各プットで変数を増分します。

long counter = 0; 
map.put(counter++, element1.findElement(By.tagName("a")).getAttribute("href")); 

文字列ではなくキーとして長く取るようにHashMapを変更することがあります。

+0

オーケーを上書きdoes notのよう++私を追加しますか? – Nazrod12

+0

これはどうやって解決しますか? – Nazrod12

+0

2つのこと、各呼び出しでマップを初期化しないと、古いデータが失われます。第二に、一意のキーを生成するためには、int/long型のインスタンス変数を取って、各put呼び出しの後にインクリメントしてください。 – ManishKr

0
for (WebElement element1 : allElements) { 
i++ 
     map.put(element1.getText()+i, element1.findElement(By.tagName("a")).getAttribute("href")); 

    } 

それはどのように私はそれを回避することができ、

関連する問題