21

我刚刚开始探索赛普拉斯并遇到了这样一个问题:是否可以在 Selenium 的帮助下选择一个具体的属性并改变它的值JavascriptExecutor?例如,让我们来看看这段简单的代码

input id="mapsearch" type="textbox" class="form-control" name="address" test=""

是否可以获取测试属性并分配我自己的值?

4

3 回答 3

44

是的。在赛普拉斯测试中,您可以在 JavaScript 中做的任何事情都是可能的。对于上面的 html,您可以在 Cypress 中使用.invoke()

cy.get('input[test]')
  .invoke('attr', 'test', 'my new value')
  .should('have.attr', 'test', 'my new value')

Cypress 在后台使用 jQuery,因此您可以像这样调用 jQuery 中的任何函数。您也可以在使用以下命令产生输入后使用纯 JavaScript .then()

cy.get('input[test]').then(function($input){
    $input[0].setAttribute('test', 'my new value')
  })
  .should('have.attr', 'test', 'my new value')
于 2017-11-06T17:11:56.547 回答
0

虽然 Jennifer 的答案实际上适用于大多数输入元素,但有一个例外,特别是当应用程序只接受输入值时,input/change event因为调用不会触发事件。

我有这样的经验,下面的代码对我有用。

在 Commands.js 中

Cypress.Commands.add('inputChange', (input, value) => {
    const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
      window.HTMLInputElement.prototype,
      'value'
    ).set

    const changeInputValue = inputToChange => newValue => {
      nativeInputValueSetter.call(inputToChange[0], newValue)
      inputToChange[0].dispatchEvent(new Event('input', {
        newValue,
        bubbles: true,
        composed: true
      }))
    }

    return cy.get(input).then(input => {
      changeInputValue(input)(value)
    })
  })

测试中:

   cy.get('[data-test="voy-lat-long-input"]')
        .then(input => cy.inputChange(input, Longtitude))
于 2021-10-13T09:28:25.830 回答
0

你可以试试这个

cy.get('.class/#id').type('type your new value', { force: true });
于 2021-10-19T10:08:40.813 回答