我正试图将与价格不同的商品添加到购物车中,以下是我的代码:
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)
答案 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应该可以帮助您,但是以防万一...