Как бы вы перенаправили вызовы на верхний объект в Cypress? - PullRequest
0 голосов
/ 23 января 2020

В моем коде приложения есть много вызовов (например, 100+) к «верхнему объекту» со ссылкой на window.top, например, top.$("title") и так далее. Теперь я столкнулся с проблемой использования Cypress для проведения сквозного тестирования. При попытке войти в приложение некоторые вызовы top.$(...), но DevTools показывает Uncaught TypeError: top.$ is not a function. Это привело к тому, что моя команда и я обнаружили, что «вершиной», которую пытается достичь наше приложение, является сама среда Cypress.

Вещи, которые я пробовал , прежде чем прийти сюда:

1) Попытка заглушить window.top объектом window, ссылающимся на наше приложение. В результате нам сказали, что window.top является объектом только для чтения.

2) Исследование, если Cypress имеет какую-то конфигурацию, которая бы умно перенаправляла вызовы top в нашем коде, чтобы быть самой верхней средой в пределах наше приложение. Мы подумали, что, возможно, мы не единственные, кто сталкивался с этой проблемой.

Если бы были статьи, я бы не смог их найти, поэтому пришел спросить, есть ли способ сделать это, или кто-нибудь хотел бы знать альтернативное решение?

Другое решение, которое мы рассмотрели: Изучение объектов именования окон, чтобы мы могли ссылаться на них по имени вместо «окна» или «вершины». Если нет способа сделать то, что я пытаюсь сделать с помощью Cypress, я думаю, что мы готовы сделать это в крайнем случае, но, надеюсь, нам не нужно это менять, так как мы не точно знаю, сколько приложения оно сломает заранее.

@ Mikkel Не совсем уверен, какой код я могу предоставить, чтобы быть полезным, но вот код, который заставляет Cypress выдать необработанное исключение

if (sample_condition) {
  top.$('title').text(...).find('content') // Our iframe
} else {
  top.$('title').text(page_title)
}

И в нашем коде есть еще несколько экземпляров, где мы получаем доступ к верхнему объекту, но в целом они похожи. Мы выяснили, что root причина проблемы в том, что внутри Cypress вызовы «top» на самом деле взаимодействуют с Cypress вместо их предполагаемой среды, которая является нашим приложением.

1 Ответ

0 голосов
/ 23 января 2020

Это не может быть прямым ответом на ваш вопрос, он просто расширяет ваш запрос для получения дополнительной информации о технике, которую я использовал для передачи информации из одного сценария в другой. Я попытался сделать это в том же сценарии безуспешно - в основном потому, что асин c природа .then() остановила его работу.

В этом фрагменте я читаю пару идентификаторов из sessionStorage и сохраняю их в файл json.

  //
  // At this point the cart is set up, and in sessionStorage
  // So we save the details to a fixtures file, which is read
  // by another test script (e2e-purchase.js)
  //
  cy.window().then(window => {
    const contents = {
      memberId: window.sessionStorage.getItem('memberId'),
      cartId: window.sessionStorage.getItem('mycart')
    }
    cy.writeFile(`tests/cypress/fixtures/cart.json`, contents)
  })

В другом скрипте он загружает файл как фиксатор (fixtures/cart.json), чтобы получить пару идентификаторов

cy.fixture(`cart`).then(cart  => {
    cy.visit(`/${cart.memberId}/${cart.cartId}`)
})    
...