#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 })
Или, если вы хотите подтвердить содержание:
- Точное совпадение:
cy.get('.notification-content') .should('be.visible') .and('have.text', 'Ref (REF123456789) created successfully')
- Частичное Совпадение
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. Я обновил свой ответ.