【问题标题】:How to compare elements inside List of strings with Array List of string?如何将字符串列表中的元素与字符串数组列表进行比较?
【发布时间】:2019-05-02 04:17:42
【问题描述】:

我已将产品添加到我的购物篮并在列表中列出了它们的 URL,并希望根据给定的 String[] 产品验证这些产品 这些项目向后存储在 z String[] 中,因此这里的最后一项是 List 中的第一项 .. 项目数为 3,下面的代码适用于 2 个项目,并在第三项的 assert 方法中引发调用程序异常

public void verifyBag(String[] goods) {
    actions.clickOn(By.xpath(bagLocator));
    Arrays.sort(goods);
    List<WebElement> listItems = actions.driver.findElements(By.xpath(bagItems));
    List <String> actualItems = new ArrayList<String>();
    for(int i=0;i<listItems.size();i++)
    {
        actualItems.add(listItems.get(i).getAttribute("href"));
    }
    int j = goods.length-1;
    for(int i=0;i<goods.length;i++) 
    { 

        String actualItem = actualItems.get(i);
        String product = goods[j];
        System.out.println(product);
        //assertTrue(actualItems.get(i).contains(goods[j]));
        assertTrue(actualItem.equals(product));
            j--;        
        } 
        assertEquals(listItems.size(), goods.length,"Assert Number of Items in the Bag");
    }

【问题讨论】:

  • 并在第三项的 assert 方法中引发调用程序异常 ...请分享堆栈跟踪和引发异常的行的详细信息
  • 首先,我认为你应该在循环之前检查数量。其次,您可以使用list.contains()。第三,如果你只是想知道一切是否正确,可以将数组转换为列表,然后对两者进行排序,使用equals()
  • 顺便说一句,在前三行之后,您的代码可以很好地优化可读性,如List&lt;String&gt; actualItems = listItems.stream() .map(listItem -&gt; listItem.getAttribute("href")) .collect(Collectors.toList()); IntStream.range(0, goods.length).forEach(i -&gt; assertEquals(goods[goods.length - i - 1], actualItems.get(i))); assertEquals(listItems.size(), goods.length, "Assert Number of Items in the Bag");

标签: java selenium automation


【解决方案1】:

如果您不关心顺序,而关心提供的goodsactualItems 列表之间的匹配,您可以这样做:

  1. 将输入数组String[] goods 转换为某个集合,例如List。让我们称之为goodsList
  2. goodsList 中删除所有也在actualItems 中的项目。

    • 如果结果集为空,则表示来自goodsList 的所有项目都是 也在actualItems
    • 如果结果集不为空,它将包含 actualItemsgoodsList 相比缺失的项目列表
  3. 您也可以执行相反的操作:从actualItems 中删除也包含在goodsList 中的所有项目。这为您提供了提供列表中不存在的项目列表。

代码:

public void verifyBag(String[] goods) {
    actions.clickOn(By.xpath(bagLocator));
    List<WebElement> listItems = actions.driver.findElements(By.xpath(bagItems));
    List <String> actualItems = new ArrayList<String>();
    for(int i=0;i<listItems.size();i++)
    {
        actualItems.add(listItems.get(i).getAttribute("href"));
    }
    List<String> goodsList = new ArrayList(Arrays.asList(goods));
    goodsList.removeAll(actualItems);
    if(goodsList.size() == 0) {
        // All goods from provided goods list are also in actualItems
    }
    else {
        // Some items didn't match
    }

【讨论】:

  • 我试过你的 cod @Kiril 但它在 java.util.AbstractList.remove(AbstractList.java:161) 的 java.util.AbstractList$Itr.remove 处抛出了以下异常 java.lang.UnsupportedOperationException (AbstractList.java:374) 在 java.util.AbstractCollection.removeAll(AbstractCollection.java:376) 在 POM.NisnassProduct.verifyBag(NisnassProduct.java:72)
  • 显然这是 Arrays.asList 的一个已知问题。我更新了一个代码来解决它
【解决方案2】:
  1. 在执行循环之前,您必须检查 goodsactualItems 的大小。确保数组和列表的大小相同,并且它们都不为 null 或为空。

  2. 函数listItems.get(i)getAttribute("href")可以返回空值,添加列表前请检查。

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多