2016-05-13 20 views
0
String name = ""; 
    String width = ""; 
    String height = ""; 



    List<WebElement> imageName = driver.findElements(By.cssSelector("div.card-arago div.hover-info div.name")); 
    List<HashMap> imageInfo = new ArrayList<HashMap>(); 
    HashMap<String, String> attributes = new HashMap<String, String>(); 
    imageInfo.add(attributes); 
    for (WebElement image : imageName) { 
     attributes.put("name",image.getText()); 
    } 
    List<WebElement> images = driver.findElements(By.cssSelector("div.card-arago a img")); 
    for (WebElement image : images) { 
     attributes.put("width", image.getAttribute("width")); 
     attributes.put("height", image.getAttribute("height")); 

    } 

ページからすべてのイメージを返そうとしていますが、ページ上の最後のイメージカードのみを返しますか?Java Webdriver HashMap要素配列

答えて

1

HashMapは各キーに1つの値しか格納できません。同じキーを使用してputを複数回呼び出すと、各コールは前のものを上書きします。ループ内でattributes.put("name", ...)を複数回呼び出しているので、キー "name"に付加された値が何度も何度も置き換えられ、ループの最後には最後のイメージが残されます。実際にすべてのイメージが返されるようにするには、イメージを構成する方法に応じて、イメージごとに一意のキーか、イメージごとに完全に別々のHashMapが必要です。

EDIT:コードをもう少し見て、HashMapのListが必要なように見えます。しかし、あなたはただ一つのHashMapをそのリストに追加するだけです。その代わりに、最初のループを変更して各イメージに新しいHashMapを追加することができます。

+0

これは最も簡単な方法と思われます。どのように各画像のための新しいHashMapを追加するでしょうか? –

0

put(k、v);を呼び出すと、キーが保存され、値は追加のメタデータです。ちょうどキーと価値。 私がput(1、2)を呼び出すと、 put(1、3)を呼び出します。 get(1)によって返される値。 3になります。put(k、v);関数は、HashMap内の異なるオブジェクトのみを格納します。同じHashMap内で同じ値を持つことはできませんが、同じHashMap内で同じ値を持つことができます。あなたの問題を解決するために

(、私はあなたがあなたがマップを使用しているように

attributes.put("width" + someIntIdentifier, image.getAttribute("width"); 
0

のような識別子を使用することをお勧めして一つのキーマップは一つの値だけを持つことができるため、キー値を更新し続けることは置き換え前の値)。代わりに、あなたはマップのリストを使ってみることもできます。マップには、イメージに関する情報を含むマップが含まれています。ここで

String name = ""; 
String width = ""; 
String height = ""; 


List imageNameList = new ArrayList(); // creating list to store imageName 
List imageAttributesList = new ArrayList(); // creating list to store image height and width 


List<WebElement> imageName = driver.findElements(By.cssSelector("div.card-arago div.hover-info div.name")); 
List<HashMap> imageInfo = new ArrayList<HashMap>(); 
imageInfo.add(attributes); 
for (WebElement image : imageName) { 
    HashMap<String, String> attributes = new HashMap<String, String>(); 
    attributes.put("name",image.getText()); 

    imageNameList.add(attributes); // adding map to list 
} 
List<WebElement> images = driver.findElements(By.cssSelector("div.card-arago a img")); 
for (WebElement image : images) { 

    HashMap<String, String> attributes = new HashMap<String, String>(); 

    attributes.put("width", image.getAttribute("width")); 
    attributes.put("height", image.getAttribute("height")); 

    imageAttributesList.add(attributes); // adding map to list 
} 


System.out.println(imageNameList); // this will give you a list of Map having "name" key 
System.out.println(imageAttributesList); // this will give you a list of Map having "height" and "width" of image 

私は、イメージの名前と高さ&幅を保存するために2つのリストを作成しました。このように、必要なすべての画像の属性を取得できます。

0

あなたがしようとしていることを理解していれば、私はHashMapsのリストを返すことに関するjthomasに同意します。さらに、名前のテキストを持つ要素のリストを管理してループし、イメージ要素の寸法を別々に見つけてループさせるのではなく、それらの要素の両方が共通のdiv内にあると仮定すれば、 。私はこのような何かをするだろう:

List<HashMap> images = new ArrayList<HashMap>(); 
List<WebElement> imageDivs = driver.findElements(By.cssSelector("div.card-arago"); 

for (WebElement imageDiv : imageDivs) { 
    HashMap<String, String> attributes = new HashMap<String, String>(); 
    attributes.put("name", imageDiv.findElement(By.cssSelector("div.name").getText(); 

    WebElement image = imageDiv.findElement(By.tagName("img"); 
    attributes.put("width", image.getAttribute("width")); 
    attributes.put("height", image.getAttribute("height")); 
    images.add(attributes); 
} 

画像リストは、あなたにそのイメージの名前、高さ、および幅が含まれているそれぞれのページ上の各画像カード用のハッシュマップを与えるだろう。その後、あなたが好きなようにそのリストを反復することができます。