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"));
}
我正在尝试从页面返回所有图片,但它只返回页面上的最后一张图片?
答案 0 :(得分:1)
HashMap只能为每个键存储一个值。如果您多次使用相同的密钥呼叫put
,则每次呼叫都会覆盖之前的呼叫。您在循环中多次调用attributes.put("name", ...)
,因此附加到键的值#34; name&#34;一遍又一遍地替换,并在循环结束时留下最后一个图像。如果您确实希望返回所有图像,则每个图像都需要唯一的键,或者每个图像需要一个完全独立的HashMap,具体取决于您希望如何构建它。
答案 1 :(得分: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");
答案 2 :(得分: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
这里我创建了两个List来存储图像名称和高度&amp;宽度。像这样你可以得到你需要的所有图像的属性。
答案 3 :(得分:0)
如果我理解你正在尝试做什么,我同意jthomas关于返回HashMaps的列表。此外,不是管理和循环具有名称文本的元素列表,然后单独查找和循环图像元素的维度,如果我认为这两个元素都在公共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);
}
然后,图像列表会为页面上的每个图像卡提供一个哈希图,每个图像卡都包含该图像的名称,高度和宽度。然后你可以随意迭代该列表。
答案 4 :(得分:0)
您可以尝试使用为单个键存储多个值的Multimap。 https://guava.dev/releases/23.0/api/docs/com/google/common/collect/Multimap.html