我已经尝试过各种方法,但我无法让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
expect(activeStartButton(分隔开。notOk`
错误因我的方法而异,但对于此代码:
AssertionError: start button remains disabled: expected [Function: __$$clientFunction$$] to be falsy"
您的代码应该如下所示:
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()
将总是抛出错误,因为CCD_ 7的真性总是真的。因此,上面的代码与此代码类似: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中的任何现有元素,上述测试代码也将始终通过。
在expect中,您应该只为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(的筛选器方法,并且该结果的真实性始终为true。
所以当你写的时候:
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