如何在添加到购物车时跳过重复的价格项目?

时间:2018-12-26 14:34:08

标签: selenium

我正试图将与价格不同的商品添加到购物车中,以下是我的代码:

List<WebElement> priceSpans = getDriver().findElements(By.xpath("//div[@class='m-product-mini']//a//span[(contains(text(),'$')) and not(contains(@class,'priceTag-discount'))]"));
List<Double> priceOfProducts = new ArrayList<Double>();
for (WebElement webElement : priceSpans)
{
    String priceText = webElement.getText();
    if (priceText != null && priceText.length() > 0)
    {
        Double priceValue = Double.parseDouble(priceText.replace('$', ' ').trim());
        priceOfProducts.add(priceValue);
        System.out.println("The PLP Products Price are:" + priceValue);
    }
}

使用上面的代码打印价格,下面是输出:

  

PLP产品价格为:69.99
PLP产品价格为:64.99
PLP产品价格为:59.99
PLP产品价格为:54.99
PLP产品价格:49.99
PLP产品价格:59.99
PLP产品价格:39.99
PLP产品价格:79.99
PLP产品价格:119.99
/> PLP产品价格为:69.99
PLP产品价格为:79.99
PLP产品价格为:119.99
PLP产品价格为:69.99
PLP产品价格是:119.99

所以有重复的价格,所以我如何跳过重复的一个,如何从重复的商品中仅选择一个(即2个产品的价格相同,例如ex:59.99)

4 个答案:

答案 0 :(得分:1)

最简单的解决方案,只需将当前priceText添加到伪字符串stringSoFar中,然后检查stringSoFar中是否已经存在该价格文本:

    String stringSoFar="";
    int counter=0; 

    for (WebElement webElement : priceSpans){ 

        List<WebElement> refreshedPriceSpans = getDriver().findElements(By.xpath("//div[@class='m-product-mini']//a//span[(contains(text(),'$')) and not(contains(@class,'priceTag-discount'))]"));   //to avoid stale exception

        String priceText = refreshedPriceSpans.get(counter).getText(); 

        stringSoFar = stringSoFar + priceText; 

        if (priceText != null && priceText.length() > 0 && !stringSoFar.contains(priceText)) 
            { 
Double priceValue = Double.parseDouble(priceText.replace('$', ' ').trim()); 
              priceOfProducts.add(priceValue); 
              System.out.println("The PLP Products Price are:"+ priceValue); 
            } 

           counter++;
         } 

答案 1 :(得分:1)

如果使用Set怎么办,它会避免重复的值,在这种情况下我们可以将条件最小化

  <ul class="points" NguCarouselPoint>
    <li *ngFor="let point of carousel.pointNumbers; let point = index" [class.active]="point==carousel.activePoint"
      (click)="carousel.moveTo(point)"></li>
  </ul>

答案 2 :(得分:0)

您可以使用地图来避免重复的价格,请查看下面的示例代码。
在地图中,key是价格,value是WebElement。

List<WebElement> priceSpans = getDriver().findElements(By.xpath("//div[@class='m-product-mini']//a//span[(contains(text(),'$')) and not(contains(@class,'priceTag-discount'))]"));
HashMap<Double, WebElement> priceOfProducts = new HashMap<>();
for (int i = 0; i < priceSpans.size(); i++) {
    Double priceValue = Double.parseDouble(priceSpans.get(i).getText().replace('$', ' ').trim());
    priceOfProducts.put(priceValue, priceSpans.get(i));
    //System.out.println("The PLP Products Price are: " + priceValue);
}

priceOfProducts.forEach((k,v) -> System.out.println("The PLP Products Price are: " + k));

答案 3 :(得分:-1)

开始之前的一件事,就是您的当前代码arrayCurrent永远不会等于priceText或长度为零,因为您的XPath至少需要一个'$',因此您可以删除{{ 1}}检查。

在那之后,您应该花一些时间研究Java streams。您可以使用它们来执行各种收集处理等,就像您在这里所做的一样。下面的代码注释中说明了不同的步骤。

null

由于我们没有原始的HTML,因此我以不同的价格模拟了一些HTML,并在其中留出了额外的空白,包括一个重复

if

当我在上面的HTML上运行代码(使用适当的定位符By locator = By.xpath("//div[@class='m-product-mini']//a//span[(contains(text(),'$')) and not(contains(@class,'priceTag-discount'))]"); List<Double> priceOfProducts = getDriver().findElements(locator) .stream() // turns the collection of WebElements into a stream .map(e -> e.getText().replace("$", "").trim()) // turns the collection of WebElements into a collection of string (from .getText()), removes the '$', and trim()s .distinct() // removes duplicates .map(e -> Double.parseDouble(e)) // converts String to Double .collect(Collectors.toList()); // the final piece... returns a List<Double> priceOfProducts.forEach(System.out::println); )时,我得到了输出

<div id="base">
    <span>  $0.99 </span>
    <span>$1.99  </span>
    <span> $1.99   </span>
    <span>  $2.99 </span>
</div>

注意:您将需要为By.cssSelector("#base > span")相关代码0.99 1.99 2.99 添加导入。您的IDE应该可以帮助您,但是以防万一...