How to get all attribute value in array variable with product name?

Viewed 170

In parent div, there are 2 products available. I want to get product title name & product price. Product price will get by attribute value & product name will get by h4 tag within same div

<span class="price-bg"><div><input type="number" minlength="9" value="22.95"></div></span>
<h4>Men Basic T-shirt</h4>

Here is the whole div's HTML

<div class="product-list-sidebar">
   <div class="box-product">
      <h4>Men Basic T-shirt</h4>
      <span class="close-img"><i class="fas fa-times"></i></span>
      <div class="row">
         <div class="col-md-8">
            <div class="pro-title-sidebar">Define Product Colors (1/21)</div>
            <div class="color-select-list">
               <div class="list-color" style="background-color: rgb(191, 0, 0); color: rgb(255, 255, 255);"><i class="fa fa-check" style="color: rgb(255, 255, 255);"></i></div>
               <div class="list-color-add"><i class="fa fa-plus" aria-hidden="true"></i></div>
            </div>
            <div class="row price-profit">
               <div class="col-md-6">
                  <form>
                     <label for="">Price</label>
                     <span class="price-bg">
                        <div><input type="number" minlength="9" value="22.95"></div>
                     </span>
                  </form>
               </div>
               <div class="col-md-6"><label for="">Profit Per Sale</label><span>€ 13.95</span></div>
            </div>
         </div>
         <div class="col-md-4">
            <div class="pro-sidebar-img text-center">
               <div class="product-design">
                  <div class="product-design-output"><img src="https://pci-designer-steps-server.shirtee.cloud/product-images/51/837?backgroundColor=%2300000&amp;size=s" style="width: 150px; height: 150px; background-color: rgb(0, 0, 0);"></div>
               </div>
            </div>
         </div>
      </div>
      <div class="d-none">
         <span class="close-img"><i class="fas fa-times"></i></span>
         <div class="favourite-product-color">
            <h5>Please select your favourite product colors</h5>
            <div class="fav-color-list">
               <div class="list-color" style="background-color: rgb(191, 0, 0); color: rgb(255, 255, 255);"><i class="fa fa-check" style="color: rgb(255, 255, 255);"></i></div>
               <div class="list-color" style="background-color: rgb(0, 0, 0); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(5, 57, 12); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(33, 5, 0); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(2, 65, 80); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(245, 217, 2); color: rgb(0, 0, 0);"></div>
               <div class="list-color" style="background-color: rgb(0, 92, 9); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(6, 8, 43); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(206, 206, 206); color: rgb(0, 0, 0);"></div>
               <div class="list-color" style="background-color: rgb(224, 184, 110); color: rgb(0, 0, 0);"></div>
               <div class="list-color" style="background-color: rgb(145, 211, 237); color: rgb(0, 0, 0);"></div>
               <div class="list-color" style="background-color: rgb(197, 2, 66); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(42, 88, 110); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(212, 35, 0); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(21, 147, 158); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);"></div>
               <div class="list-color" style="background-color: rgb(11, 37, 128); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(205, 205, 207); color: rgb(0, 0, 0);"></div>
               <div class="list-color" style="background-color: rgb(71, 0, 20); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(255, 78, 0); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(42, 42, 1); color: rgb(255, 255, 255);"></div>
            </div>
         </div>
         <div class="favourite-product-color">
            <h5>Please select your main product colors</h5>
            <div class="fav-color-list color-select-list">
               <div class="list-color" data-optionid="89" style="background-color: rgb(191, 0, 0);"><i class="fa fa-check" style="color: rgb(255, 255, 255);"></i></div>
            </div>
         </div>
      </div>
   </div>
   <div class="box-product">
      <h4>Women Basic T-shirt</h4>
      <span class="close-img"><i class="fas fa-times"></i></span>
      <div class="row">
         <div class="col-md-8">
            <div class="pro-title-sidebar">Define Product Colors (1/10)</div>
            <div class="color-select-list">
               <div class="list-color" style="background-color: rgb(44, 187, 222); color: rgb(0, 0, 0);"><i class="fa fa-check" style="color: rgb(0, 0, 0);"></i></div>
               <div class="list-color-add"><i class="fa fa-plus" aria-hidden="true"></i></div>
            </div>
            <div class="row price-profit">
               <div class="col-md-6">
                  <form>
                     <label for="">Price</label>
                     <span class="price-bg">
                        <div><input type="number" minlength="9" value="22.95"></div>
                     </span>
                  </form>
               </div>
               <div class="col-md-6"><label for="">Profit Per Sale</label><span>€ 13.95</span></div>
            </div>
         </div>
         <div class="col-md-4">
            <div class="pro-sidebar-img text-center">
               <div class="product-design">
                  <div class="product-design-output"><img src="https://pci-designer-steps-server.shirtee.cloud/product-images/333/857?backgroundColor=%2300000&amp;size=s" style="width: 150px; height: 150px; background-color: rgb(0, 0, 0);"></div>
               </div>
            </div>
         </div>
      </div>
      <div class="d-none">
         <span class="close-img"><i class="fas fa-times"></i></span>
         <div class="favourite-product-color">
            <h5>Please select your favourite product colors</h5>
            <div class="fav-color-list">
               <div class="list-color" style="background-color: rgb(44, 187, 222); color: rgb(0, 0, 0);"><i class="fa fa-check" style="color: rgb(0, 0, 0);"></i></div>
               <div class="list-color" style="background-color: rgb(28, 165, 31); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(0, 0, 0); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(6, 8, 43); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(191, 0, 0); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);"></div>
               <div class="list-color" style="background-color: rgb(4, 38, 150); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(255, 203, 0); color: rgb(0, 0, 0);"></div>
               <div class="list-color" style="background-color: rgb(255, 78, 0); color: rgb(255, 255, 255);"></div>
               <div class="list-color" style="background-color: rgb(205, 205, 207); color: rgb(0, 0, 0);"></div>
            </div>
         </div>
         <div class="favourite-product-color">
            <h5>Please select your main product colors</h5>
            <div class="fav-color-list color-select-list">
               <div class="list-color" data-optionid="1026" style="background-color: rgb(44, 187, 222);"><i class="fa fa-check" style="color: rgb(0, 0, 0);"></i></div>
            </div>
         </div>
      </div>
   </div>
   <div class="empty-box-product">&nbsp;</div>
   <div class="bottom-btn">
      <div class="row">
         <div class="col-md-6"><a class="back-btn">Back</a></div>
         <div class="col-md-6"><a class="next-btn">Next</a></div>
      </div>
   </div>
</div>

How to get both value in array in cypress? My code is :

cy.get('h4').then(($ele) => {
    const texts = Array.from($ele, el => el.innerText);
    texts.forEach(text => cy.log(text));
})

// Get price value
cy.get(step.product_list_sidebar).invoke('attr', 'value').then(($style) => {
    const styl = $style
    cy.log(styl)
})
2 Answers

You can do something like this:

const productDetails = [];
cy.get('.box-product').each(($ele) => {
    productDetails.push($ele.find('h4').text())
    cy.wrap($ele).find('span.price-bg > div > input', {
        timeout: 10000
    }).should('be.visible')
    productDetails.push($ele.find('span.price-bg > div > input').attr('value'))
})
cy.log(productDetails) //product name 1, product price 1, product name 2, product price 2

I'd tackle the extraction of each data separately, then merge the results.

This assumes there's always a price for a title (same number of each).

cy.get('h4')
.then($titles => {
  return [...$titles].map(title => title.innerText)
})
.as('titles')

// Wait for prices
cy.get('.price-bg input').eq(0)
  .should('not.have.attr', 'value', '')

cy.get('.price-bg input')
.then($prices => {
  return [...$prices ].map(price => price.getAttribute('value'))
})
.as('prices')

// Merge results
cy.get('@titles').then(titles => {
  cy.get('@prices').then(prices => {
    const titlesAndPrices = titles.map((title, index) => {
      return { title, price: prices[index]}
    })
    console.log(titlesAndPrices)
  })
})

From your last comment, if you want a single string

// Merge results
cy.get('@titles').then(titles => {
  cy.get('@prices').then(prices => {
    const titlesAndPrices = titles.map((title, index) => {
      return `${title} - ${prices[index]}`
    })
    console.log(titlesAndPrices)
  })
})
Related