option.timeout игнорируется в ожидании Selector.withAttribute

Я пробовал это в любом случае, но я не могу заставить TestCafe ждать disabled атрибут, который будет удален из элемента.

Это, очевидно, блокирует все дальнейшее тестирование, так как мне нужно, чтобы кнопка была кликабельной, прежде чем я смогу продолжить работу.

fixture('create').page('locahost:3000');

test('one', async  => {
  const myIframe = Selector('#myIframe');

  await t
    .typeText('#input', 'words')
    .click('#update')
    .expect(myIframe.exists).ok('', { timeout: 10000 })
    .switchToIframe(myIframe)

  const activeStartButton = await Selector('#start').withAttribute('disabled');

  await t
    .expect(activeStartButton).notOk('', { timeout: 60000, allowUnawaitedPromise: true });
});

Независимо от того, определил ли я activeStartButton заранее или добавить или удалить await из определения, поместите селектор прямо в expect с или без ожидания, отделите это await block from the previous one or add it to the previous chain, TestCafe immediately throws an error atожидать (activeStartButton).notOk`

Ошибка меняется в зависимости от моего подхода, но для этого кода:

AssertionError: start button remains disabled: expected [Function: __$$clientFunction$$] to be falsy"

2 ответа

Решение

Ваш код должен выглядеть так:

const selector = Selector('#start')
    .with({visibilityCheck: true});

await t
    .expect(selector.exists).ok({timeout: 10000}) // ensure the button is visible on the screen
    .hover(selector) // access to the button via the mouse
    .expect(selector.hasAttribute("disabled")).notOk({timeout: 10000}) // ensure the field is enabled
    .click(selector);

Может быть, вам стоит взглянуть на прощание

Этот код:

const mySelector = Selector('any css selector');
await t
    .expect(mySelector).notOk()

всегда будет выдавать ошибку, потому что правдивость mySelector всегда верно. Таким образом, приведенный выше код похож на этот код:assert(true).toBe(false),

Выше mySelector это объект обещания, и истинность обещания всегда верна.

Теперь, если вы напишите:

const mySelector = await Selector('any css selector');
await t
    .expect(mySelector).notOk();

mySelector это NodeSnaphsot объект, который является своего рода литеральным объектом с множеством свойств, таких как:

{
    textContent,
    attributes,
    id,
    clientHeight,
    ...
}

Истинность буквального объекта всегда верна, и поэтому expect все равно выдаст ошибку.

Фактически, эта проблема могла бы быть полностью замаскирована, если бы вместо этого был тестовый код:

const mySelector = await Selector('any css selector');
await t
    .expect(mySelector).ok();

Приведенный выше тестовый код всегда будет проходить, даже если mySelector не представляет какой-либо существующий элемент в DOM.

Внутри ожидаемого вы должны утверждать только для свойства или для метода Selector, который возвращает логическое значение при использовании ok() или notOk().

Возможные логические свойства:

mySelector.hasChildElements
mySelector.hasChildNodes
mySelector.checked
mySelector.focused
mySelector.selected
mySelector.visible
mySelector.exists

Возможные методы:

mySelector.hasClass('className')
mySelector.hasAttribute('attributeName')

`.WithAttribute('attributeName') - это просто метод фильтра, который возвращает объект Selector (т. Е. Promise), и достоверность этого результата всегда верна.

Итак, когда вы пишете:

const mySelector = Selector('any css selector').withAttribute('attributeName');

это более или менее похоже на написание этого псевдокода:

const mySelector = Selector('any css selector') // returns a collection of Selectors
    .toArray() // convert it to an array
    .filter((selector) => selector.hasAttribute('attributeName'))
    .toPromise() // convert back to a promise object
Другие вопросы по тегам