'Javascript: Cypress: select sample with not contain value

I want to select a random value from a dropdown, with the restriction that a specific value should not be selected.

    const initialOrderReason = cy.xpath("//tbody/tr[1]/td[4]");
    tkm
      .dropdownOptions()
      .should("be.visible")
      .then((options) => {
        cy.get(Cypress._.sample(options))
          .not.contain(initialOrderReason)
      });

how is it possible?



Solution 1:[1]

There's a lot relevant code that you have not shown, including the HTML but here's my solution based on what you've given

cy.xpath("//tbody/tr[1]/td[4]") should be accessed it via .then() instead of the returned value.

And for all elements extract the text of the elements.

cy.xpath('//tbody/tr[1]/td[4]')
  .invoke('text')                   // extract text
  .then(initial => {

  tkm.dropdownOptions().should("be.visible")
    .then((options) => {
      const texts = [...options].map(option => option.innerText)    // extract texts

      const notInitial = texts.filter(text => text !== initial)     // filter out initial

      const random = Cypress._.sample(notInitial)   // random other value
      
      // Assuming "//tbody/tr[1]/td[4]" gives a <select> element
      cy.xpath('//tbody/tr[1]/td[4]').select(random)

    });

  cy.xpath('//tbody/tr[1]/td[4]')       // requery the dropdown
    .should("not.have.text", initial);  // to allow DOM to change 
})

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Fody