Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как "кликнуть" элемент с минимальным значением...?

webdriver
java
Теги: #<Tag:0x00007f7b69fe17a8> #<Tag:0x00007f7b69fe0f38>

(Dmitry Bot) #1

Всем привет!))Помогите сдвинутся дальше))
Нужно найти минимальное значение цены и кликнуть по нему…

package com.amazon;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.util.List;

public class Test {

    public static void main(String[] args) {

        //create new driver
        WebDriver driver = new FirefoxDriver();

        //maximize window
        driver.manage().window().maximize();

        //go to URL
        driver.get("http://www.amazon.com");

        //find search field and insert text "HTC One M8 32Gb"
        driver.findElement(By.cssSelector("#twotabsearchtextbox")).sendKeys("HTC One M8 32 Gb");

        //click button "GO"
        driver.findElement(By.cssSelector(".nav-input")).click();

        //find prices on page
        List<WebElement> price = driver.findElements(By.cssSelector(".a-size-base.a-color-price.s-price.a-text-bold"));
        System.out.println(price.size());
        for (int i = 0; i < price.size(); i++) {
            WebElement min = price.get(i);
            String a = min.getText();
            System.out.println(a);
        }
        //close browser
        driver.close();
    }
}

(Keiga) #2

Можно попробовать так:

public WebElement getMinPriceElement(List<WebElement> priceList) {
    WebElement minPrice = null;
    int min = 0;
    for (WebElement e : priceList) {
        if (Integer.parseInt(e.getText()) < min) {
            min = Integer.parseInt(e.getText());
            minPrice = e;
        }
    }
    return minPrice;
}

Потом:

List<WebElement> price = driver.findElements(By.cssSelector(".a-size-base.a-color-price.s-price.a-text-bold"));
getMinPriceElement(price).click();

(Dmitry Bot) #3

Спасибо…попробую…
только я думал что после использования getText и переменной min есть след шаг…
я в этом деле новичок…только разбираюсь что к чему…


(Sergey Korol) #4

Java 8 + JavaMoney:

        driver.findElements(locator).stream()
                .min(comparing(element -> 
                        Money.of(new BigDecimal(element.getText()), currencyUnit)))
                .get()
                .click();

П.С. Это если текст не содержит спец. символа валюты. В противном случае, его придется еще распарсить предварительно.

В вашем примере будет всегда возвращаться null. К тому же, приведение цены к int никак не даст ожидаемого результата. :wink:


(Dmitry Bot) #5

В том-то и смысл-спецсимвол " $ " есть…
если бы его не было-вопрос решается очень просто…-нахождением min в массиве…

подробнее можно про спецсимволы…?)


(Sergey Korol) #6

А что именно вы хотите услышать подробнее? Как удалить символ $ из строки $123.45 при помощи replace? Вероятней всего, getText() будет вам возвращать так называемый friendly code. Т.е. его вам и нужно будет заменять на пустоту, прежде чем отдавать конструктору BigDecimal.