Java Webdriver HashMap元素数组

时间:2016-05-13 19:52:21

标签: java selenium selenium-webdriver

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"));

    }

我正在尝试从页面返回所有图片,但它只返回页面上的最后一张图片?

5 个答案:

答案 0 :(得分:1)

HashMap只能为每个键存储一个值。如果您多次使用相同的密钥呼叫put,则每次呼叫都会覆盖之前的呼叫。您在循环中多次调用attributes.put("name", ...),因此附加到键的值#34; name&#34;一遍又一遍地替换,并在循环结束时留下最后一个图像。如果您确实希望返回所有图像,则每个图像都需要唯一的键,或者每个图像需要一个完全独立的HashMap,具体取决于您希望如何构建它。

编辑:看了你的代码之后,看起来你确实需要一个HashMaps列表。但是你只需要向该List添加一个HashMap。相反,您可以更改第一个循环以为每个图像添加新的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