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

Подсчет суммы всех элементов и сравнения с итоговой


(streLer) #1

ребят помогите плиз. нужно проверить как считается итогая сумма. Есть элементы в Корзине

к ним можно обртатиться след. образом 

List <WebElement> TR = driver.findElements(By.xpath(".//*[@id='main']/div/div[2]/div/form/div[1]/div[2]/ul[2]/li/div[2]/div[3]"));

 

как просуммировать этот список? 


(AlexAlex) #2

Так как WebDriver не берет со страницы ничего кроме веб-элементов (вот можно почитать ветку Xpath for counting number of rows in a table (WebDriver)), то как бы ни хотелось, применить sum Function (XPath) не получится.

Так что итерируйте по полученной коллекции, берите у каждого элемента коллекции текст, разбирайте в число и суммируйте. Это очевидный и более легкий вариант.

Либо, сочините javaScript, чтобы он все это делал прямо на странице, и дергайте его через JavascriptExecutor.


(mamax) #3

 

это можно сделать проще
хpath этих элементов будет одинаков кроме одного значения
это значение можно выделить в отдельную переменную и сделать цикл подсчета цен элементов  и потом проверить с фактической суммой

приблизительный код

String_xpath_start = ".//*[@id='main']/div/div[2]/div/form/div[1]/div[2]/ul[2]/li/div[";

String_xpath_end = "]/div[3]";

int amount = "someth"

int sum =0;

for(int i=0; i<amount; i++ )

{

String cena =  driver.findElement(By.xpath(String_xpath_start +amount +String_xpath_end)).getText();
// перевести string  в int

sum +=cena;

}

где то так
думаю главную идею я подал 

 


(Taras) #4

в int не получиться , там коп после коми, - нужно в double , при етом отрезать текст "руб" - ничего сложного здесь нету....парсер написать нужно и функцию суми.


(streLer) #5

Ребят сделал так :

 

List <WebElement> TR = driver.findElements(By.xpath(".//*[@id='main']/div/div[2]/div/form/div[1]/div[2]/ul[2]/li/div[2]/div[3]"));
 
for(int x =0 ; x < TR.size() ; x++)
   {
   String t5 = TR.get(x).getText();
 t5 = t5.replace(" ", "");
 t5 = t5.replace("руб", "");
 
   System.out.println(t5);
   }
 
теперь надо все это сложить =) как?)))

(AlexAlex) #6
List<WebElement> TR = driver.findElements(By.xpath(".//*[@id='main']/div/div[2]/div/form/div[1]/div[2]/ul[2]/li/div[2]/div[3]"));
int sum = 0;
for (int x = 0; x < TR.size(); x++) {
    sum += Integer.parseInt(TR.get(x).getText().replace(" руб", ""));
}
System.out.println(sum);

Без кода страницы не понятно, на что указывает селектор, так что я принял за основу, что он выдает нам целые части цены.


(Taras) #7

имхо откинет копейки и подсчитает неверно, вместо int - double используйте или float


(Sergey Korol) #8

Для финансовых операций желательно использовать BigDecimal. Дальше, думаю, разберетесь.

    private static final String currency = "руб";
 
    public static String fixPrice(String price) {
        return price.replace(currency, "").replaceAll("\\s", "");
    }
 
    public static void main(String[] args) {
        String[] prices = new String[] { "151.39 руб", "22 498.48 руб", "91.84 руб" };
        BigDecimal result = new BigDecimal(fixPrice("22 741.71 руб"));
        BigDecimal sum = new BigDecimal("0.00");
 
        for (String price : prices) {
            sum = sum.add(new BigDecimal(fixPrice(price)));
        }
 
        System.out.println(sum.compareTo(result) == 0);
    }

 


(streLer) #9

Спасибо Большое AlexAlex .

Код поправил , все считает, :

 

List <WebElement> TR = driver.findElements(By.xpath(".//*[@id='main']/div/div[2]/div/form/div[1]/div[2]/ul[2]/li/div[2]/div[3]"));
float sum = 0;
 
for (int x = 0; x < TR.size(); x++) 
  {
String t5 = TR.get(x).getText();
 t5 = t5.replace(" ", "");
 t5 = t5.replace("руб", "");
   sum += Float.parseFloat(t5);
  }
System.out.println(sum);
 
 

(streLer) #10

Ребят а как мне вырезать "руб" при помощи регулярного выражения??


(streLer) #11

помощи не ждать?))