使用 Cypress and/or mocha(或 mocha-chai)检查不包含单词但不包含子字符串

Using Cypress and/or mocha (or mocha-chai) to check for not containing a word but NOT substring

我正在尝试使用 Cypress(其中包含 mocha,而且我正在使用 mocha-chai)来检查一系列单词 NOT 包含在一个短语中。那是因为例如,我有三个 <div>,我想检查

为此,我使用了 .contain.not.contain,但不幸的是他们找到了一些子字符串:

如果我有

// div1
<div> 
    ...
    The perfect professionist for you
</div>

// div2
<div>
    ...
    Good professionists are ready here
</div>

我愿意

expect(div1).to.contain('professionist')        // true
expext(div1).to.not.contain('professionists')   // true

这很好,但是

expect(div2).to.contain('professionists')       // true
expect(div2).to.not.contain('professionist')    // false!

会失败。

有没有办法使用 cypress、mocha 或类似的东西来检查整个单词而不是子字符串?

您可以使用正则表达式来做到这一点。对于断言,你必须使用 match().

var regexValue = "(?<!\S)word(?!\S)"
var actualRegexValue = new RegExp(regexValue.replace("word", "professionist"))
cy.get('div2').invoke('text').then((text) => {
    expect(text).to.match(actualRegexValue)
})

你的正则表达式 /(?<!\S)professionist(?!\S)/ 只会搜索句子中的字符串 professionist 而不是任何其他内容甚至 professionists.

字边界:\b

更通用的是正则表达式word boundary

cy.get('div').eq(1).invoke('text')
  .then(div2Text => expect(div2Text).to.not.match(/\bprofessionist\b/))  // passes

或将单词传递到正则表达式中(注意 需要 \b 才能正确翻译)

const word = 'professionist'
const regex = new RegExp(`\b${word}\b`)

cy.get('div').eq(1).invoke('text')
  .then(div2Text => expect(div2Text).to.not.match(regex))  // passes

cy.get('div').eq(1).invoke('text')
  .should('not.match', regex)      // passes

你的 pastebin

/// <reference types="cypress" />
 
before(() => {})
 
beforeEach(() => {
  cy.viewport(2048, 1080)
})
describe('Test', () => {
  it('simple test', () => {
    let div = document.createElement('div')
    let content = document.createTextNode('Good professionists are ready here')
    div.appendChild(content)

    try {

      let word = 'professionist'
      let regex = new RegExp(`\b${word}\b`)
      expect(div.innerText).not.to.match(regex) // passes 

      word = 'professionists'
      regex = new RegExp(`\b${word}\b`)
      expect(div.innerText).to.match(regex)  // passes

    } catch (error) {
      Cypress.log(error)
    }
  })
})