Mam test, w którym muszę uzyskać href linku i zapisać go w dalszej części testu, aby uzyskać do niego dostęp.

Działa dobrze, jeśli napiszę dwa różne testy: jeden do pobierania href i drugi do uzyskiwania dostępu do href. Ale jeśli zrobię to wszystko w tym samym teście, to nie działa, dlaczego?

// commands.js
Cypress.Commands.add('getInvitationLink', () => {
  cy.get('a.invitation-link')
    .should('have.attr', 'href')
    .then((href) => {
      assert.isOk(href, 'invitation is found')
      return cy.wrap(href)
    })
})

// invitation.spec.js - working

let invitationLink

it('get the invitation link', () => {
  cy.visit('/')

  cy.getInvitationLink().then(href => {
    invitationLink = href
  })

  // assert other stuff on the page...
})

it('access the invitation link', () => {
  cy.visit(invitationLink) // it works!
})
// invitation.spec.js - not working

let invitationLink

it('get the invitation link and access it', () => {
  cy.visit('/')


  cy.getInvitationLink().then(href => {
    invitationLink = href
  })

  // assert other stuff on the page...

  cy.visit(invitationLink) // it doesn't work! invitationLink is undefined

})
0
sandrina-p 19 grudzień 2019, 02:20

2 odpowiedzi

invitationLink jest zdefiniowany w kontekście obietnicy. Spróbuj przesunąć polecenie cy.visit wewnątrz .then:

// invitation.spec.js - not working

let invitationLink;

it('get the invitation link and access it', () => {
  cy.visit('/');


  cy.getInvitationLink().then(href => {
    invitationLink = href;
    cy.visit(invitationLink);
    // assert other stuff on the page...

  });
});
0
colefner 19 grudzień 2019, 02:28
To nie ma sensu @colefner. Jeśli odwiedzę zaproszenieLink, strona jest inna i nie mogę potwierdzić innych rzeczy na stronie. Kolejność musi być następująca: pobierz link, zrób inne rzeczy, odwiedź link.
 – 
sandrina-p
19 grudzień 2019, 13:46
1
W porządku. Następnie dokonaj swoich asercji na bieżącej stronie przed odwiedzeniem nowej strony. InvitationLink nie jest jeszcze zdefiniowany ze względu na sposób, w jaki Cypress wykonuje swoje polecenia (async). Wykonujesz polecenie asynchronicznie, a następnie synchronizujesz, próbując uzyskać dostęp do wyniku. Ten link lepiej wyjaśnia to: stackoverflow.com/questions/59341731/…
 – 
colefner
19 grudzień 2019, 19:02
Dzięki @colefner. Zajmuję się już sprawdzaniem wszystkiego przed odwiedzeniem linku. Różnica polega na tym, że muszę to zrobić wewnątrz .then(). Zrozumiałem.
 – 
sandrina-p
20 grudzień 2019, 13:02

Jeśli chodzi tylko o przechowywanie i używanie wartości, utwórz taką właściwość

const asyncLocalStorage = {
    setItem: async function (key, value) {

        return localStorage.setItem(key, value);
    },
    getItem: async function (key) {

        return localStorage.getItem(key);
    }
};

Następnie ustaw wartość jako

asyncLocalStorage.setItem('storedName', name)

I uzyskaj wartość jako

asyncLocalStorage.getItem('storedName').then((storedName) => {})

Lub tylko

  const name = asyncLocalStorage.getItem('storedName')
0
Prany 20 grudzień 2019, 16:54
Używanie localstorage wydaje się zbyt trudne dla czegoś tak prostego jak dostęp do zmiennej. A poza tym nadal miałbym ten sam problem. Odpowiedź @colefner była jak dotąd najlepsza.
 – 
sandrina-p
20 grudzień 2019, 20:40
Możesz przechowywać zmienne w plikach cookie, jeśli chcesz prostego rozwiązania
 – 
Prany
23 grudzień 2019, 12:21