【问题标题】:cy.wrap().its()... doesn't work when the value in .its() contains a periodcy.wrap().its()... 在 .its() 中的值包含句点时不起作用
【发布时间】:2022-11-23 04:10:52
【问题描述】:

我希望从我正在使用 Cypress 测试的当前 URL 中提取 URL 参数。我基本上能够从this SO post 得到答案,但是,当我使用赛普拉斯的.its() command 时,我提取的值对我不可用。 url 中的参数都有句点,我相信这是我出错的原因。 这是我正在构建的自定义 Cypress 命令:

Cypress.Commands.add('getParmsCommand', function(value) {
cy.url().as('url')

cy.then( () => {
  cy.log(this.url)
  const kvPairArray = this.url.toString().split('?')[1].toString().split('&')
  const paramObj = {}
  kvPairArray.forEach(param => {
    cy.log(param)
    //default 'value' to 0 if it doesn't exist
    const [ key, value="0" ] = param.split('=')
    paramObj[key] = value
  })
  //forcefully adding a debug element to the key value store for testing
  paramObj['beverage'] = 'soda'

cy.wrap(paramObj)
  .its('timeline.ws')                                   //doesn't work
  // .its(`${Cypress.$.escapeSelector('timeline.ws')}`) doesn't work
  // .its('timeline\.ws')                               doesn't work
  // .its('"timeline.ws"')                              doesn't work
  // .its('beverage')                                   this DOES work!
  .then(parmVal => {
    cy.log(parmVal)
})

这是我试图从中提取的 URL 的相关部分:

timeline.ws=3600000&timeline.to&timeline.fm&timeline.ar=false

从报错可以看出Cypress只是在找id时间线, 不是时间线.ws;它完全忽略了这段时间之后的所有内容,因此永远找不到我的参数。

我在 2018 年看到有一个 similar error with Cypress's .get() 函数。

我是 javascript 和 Cypress 的新手,所以我希望这只是我忽略的一件奇怪的简单事情。在这一点上,非常欢迎任何建议或有根据的猜测!

谢谢你。

【问题讨论】:

  • 你有没有控制台记录你的paramObj来检查它是否正常工作?
  • 是否需要以这种方式使用该对象?你能不能把paramObj['timeline.ws'] 包装起来?
  • 顺便说一句,看看 URL 作为替代 paramObj 构造函数。

标签: javascript cypress special-characters cypress-testing-library cypress-custom-commands


【解决方案1】:

.its() 只是属性提取的简写。由于句点失败,您可以改为在 .then() 中使用括号表示法。

cy.wrap(paramObj)
  .then(paramObj => paramObj['timeline.ws'])

要不就

cy.wrap(paramObj['timeline.ws'])

使用 URL 构造函数

const urlString = 'http://example.com?timeline.ws=3600000&timeline.to&timeline.fm&timeline.ar=false'
const url = new URL(urlString)

cy.wrap(url.searchParams.get('timeline.ws'))
  .should('eq', '3600000')

cy.wrap(url.searchParams.get('timeline.to'))
  .should('be.empty')

cy.wrap(url.searchParams.get('timeline.ar'))
  .should('eq', 'false')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2021-03-21
    • 2022-12-02
    • 2022-12-27
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多