Cypress: Как скопировать/вставить одно текстовое слово из строки, чтобы вставить его позже

#javascript #testing #automation #cypress #copy-paste

Вопрос:

Я новичок в stackoverflow, поэтому приношу извинения, если это немного распространено, но я, похоже, не могу найти в Интернете простого ответа на то, что кажется довольно маленькой задачей! 🙁

Я пытаюсь скопировать некоторые данные из всплывающего окна, в котором говорится что-то вроде «Поздравляю, ваша ссылка (REF1234) успешно завершена» (только часть REF1234) и скопируйте ее, чтобы вставить в другое поле на следующем экране… Это то, что у меня есть до сих пор, и, надеюсь, для кого-то это имеет смысл…

 export function addRefToThing() {   cy.get('[class="ref-success"]').find(':selected').contains('REF').then(($clipboard) =gt; {  const copiedRef = $clipboard[0]._vClipboard.clipboardAction.text;  // lt;lt;filler steps, moving around pagesgt;gt; //   webpage.RefNo().type(copiedRef)})  

Это в значительной степени все, что я смог сделать, и вытащить свои волосы … Похоже, он зацикливается на -find :selected этом, но на самом деле не уверен, что он даже копирует нужные мне данные…

Я довольно новичок в cypress, так что это довольно запутанно, и если у кого-нибудь есть хороший учебный материал по такого рода запросам, это было бы потрясающе! Заранее спасибо!

HTML:

 lt;div class="notification-group" style="width: 300px; bottom: 0px; right: 0px;"gt;  lt;spangt;  lt;div data-id="1" class="notification-wrapper" style="transition: all 300ms ease 0s;"gt;  lt;div class="notification-template notification success"gt;  lt;div class="notification-title"gt;Successfullt;/divgt;  lt;div class="notification-content"gt;Ref (REF123456789) created successfullylt;/divgt;  lt;/divgt;  lt;/divgt;  lt;/spangt; lt;/divgt;  

Комментарии:

1. Можно ли было бы поделиться html-кодом элемента. Или, если ваша веб-страница общедоступна, можете ли вы добавить это к вопросу?

2. @AlapanDas lt;div class=»vue-notification-group» style=»width: 300px; bottom: 0px; right: 0px;»gt;lt;spangt;lt;div data-id=»1″ class=»vue-notification-wrapper» style=»transition: all 300ms ease 0s;»gt;lt;div class=»vue-notification-template vue-notification success»gt;lt;div class=»notification-title»gt;Успешногоlt;/divgt; lt;div class=»notification-content»gt;Реф (REF12345678) успешно создан lt;/divgt;lt;/divgt;lt;/divgt;lt;/spangt;lt;/divgt;

Ответ №1:

Попробуйте сделать это с помощью регулярного выражения для анализа ссылки.

Используя /(REF([0-9] ))/ вы получаете два совпадения,

  • совпадения[0] — это все «(REF123456789)»»
  • совпадения[1] — это внутренняя группа «123456789».
 cy.get('div.notification-content')  .then($el =gt; $el.text().match(/(REF([0-9] ))/)[1]) // parsing step  .then(ref =gt; {  webpage.RefNo().type(ref)  })  

В вашей функции,

 export function addRefToRef() {   cy.get('[class="ref-success"]').find(':selected').contains('REF')  .then(($clipboard) =gt; {  const copiedRef = $clipboard[0]._vClipboard.clipboardAction.text;  const innerRef = copiedRef.match(/(REF([0-9] ))/)[1];   // lt;lt;filler steps, moving around pagesgt;gt; //   webpage.RefNo().type(innerRef)  }) }  

Комментарии:

1. Потрясающе — я думаю, что это прогресс, спасибо! Однако теперь у меня другая проблема, я не уверен, что мне нужно будет сделать новый билет :’) Теперь я не могу прочитать свойства undefined (чтение ‘clipboardAction’) на моем шаге const copiedRef … У меня установлена видеокарта, но я не уверен, что забыл или пропустил что-нибудь глупое… Есть какие-нибудь идеи?

2. Я действительно не мог сказать тебе, что const copiedRef = $clipboard[0]._vClipboard.clipboardAction.text происходит, лол. Я ожидаю, что это копия текста, но я совершенно новичок во всем этом и не уверен, что только что взял этот фрагмент откуда-то, не глядя на зависимости…

3. Cannot read properties of undefined (reading 'match')

4. Хорошо, я тоже немного подозрительно относился к этому коду буфера обмена. cy.get('div.notification-content') Блок будет работать.

5. Эй, так что теперь я прошел этот этап, но я получаю cy.type() can only accept a string or number. You passed in: null , когда пытаюсь выполнить шаг типа(ref)… Есть какие-нибудь идеи? О_о

Ответ №2:

Вы можете напрямую сохранить значение внутреннего текста из notification-content div и использовать его позже. Вам не нужно использовать метод буфера обмена.

 //Some code that will trigger the notification cy.get('.notification-content')  .should('be.visible')  .invoke('text')  .then((text) =gt; {  cy.log(text) //prints Ref (REF123456789) created successfully  })  

В случае, если вы хотите сохранить его, а затем использовать позже в тесте, вы можете использовать псевдоним .as :

 //Some code that will trigger the notification cy.get('.notification-content')  .should('be.visible')  .invoke('text')  .as('notificationText') //Some other code cy.get('@notificationText').then((notificationText) =gt; {  cy.log(notificationText) //prints Ref (REF123456789) created successfully })  

Или, если вы хотите подтвердить содержание:

  1. Точное совпадение:
 cy.get('.notification-content')  .should('be.visible')  .and('have.text', 'Ref (REF123456789) created successfully')  
  1. Частичное Совпадение
 cy.get('.notification-content')  .should('be.visible')  .and('include.text', 'REF123456789')  

Если вы просто хотите извлечь номер ссылки, то вам нужно сначала использовать, split чтобы получить второй текст, а затем slice удалить открывающие и закрывающие скобки, что-то вроде этого:

 //Some code that will trigger the notification  cy.get('.notification-content').should('be.visible').invoke('text').as('notificationText') //Some other code cy.get('@notificationText').then((notificationText) =gt; {  cy.log(notificationText.split(' ')[1].slice(1,-1)) //REF123456789  })  

Комментарии:

1. Спасибо за предложения, определенно поможет сохранить его в чистоте спасибо! Да, я экспериментировал с этим, но, похоже, смог скопировать только весь элемент («Ref (REF123456789) успешно создан»)… В то время как я хочу взять содержимое в скобки только в том виде, в каком оно будет использоваться на следующем шаге. Я не могу указать полный номер ссылки, так как он меняется при каждом запуске.

2. Я обновил свой ответ.