option.timeout игнорируется в ожидании Selector.withAttribute - PullRequest
0 голосов
/ 06 декабря 2018

Я пробовал это в любом случае, но я не могу заставить 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 ]

0 голосов
/ 12 декабря 2018

Этот код:

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 (яи обещание), и истинность этого результата всегда верна.

Поэтому, когда вы пишете:

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
0 голосов
/ 07 декабря 2018

Ваш код должен выглядеть следующим образом:

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);

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

...