Javascript TestCafe-如何在测试不失败的情况下检查web元素是否存在?

Javascript TestCafe-如何在测试不失败的情况下检查web元素是否存在?,javascript,node.js,ecmascript-6,css-selectors,testcafe,Javascript,Node.js,Ecmascript 6,Css Selectors,Testcafe,我正在尝试编写一个脚本,该脚本需要根据CSS选择器找到的特定浏览器对象是否存在来调整其工作流行为 我不想使用document.getElementByID方法,因为从技术上讲,这不是一个CSS选择器,我们的整个企业都是在CSS选择器上标准化的,所以任何在DOM中运行的东西,而不是CSS选择器,都不会通过我们的代码审查过程 var thing = await things.thingSelector(thingName); if (await t.expect(thing.exists).notO

我正在尝试编写一个脚本,该脚本需要根据CSS选择器找到的特定浏览器对象是否存在来调整其工作流行为

我不想使用document.getElementByID方法,因为从技术上讲,这不是一个CSS选择器,我们的整个企业都是在CSS选择器上标准化的,所以任何在DOM中运行的东西,而不是CSS选择器,都不会通过我们的代码审查过程

var thing = await things.thingSelector(thingName);
if (await t.expect(thing.exists).notOk()) {
   await t.click(things.OpenThing(thingName));
} else {
   return false;
}
return true;
其中,thingSelector是:

const thingSelector = name =>
  Selector('p.thing-header-title span')
    .withText(name)
    .parent('div.thing');
OpenThing的位置是:

const OpenThing = name =>
    thingSelector(name)
        .find('a.thing-footer-item')
        .withText('Open');
如果对象不存在并且我正在检查它是否存在,或者如果对象存在并且我正在检查它是否不存在,以及如果对象不存在并且它不存在并且对象不存在并且我正在检查它是否不存在,那么我需要能够继续执行

在所有情况下,我仍然需要继续工作流程

我试过逻辑硬币的两面:

if (!await t.expect(thing.exists).ok())

如果上述其中一个在一个场景中没有失败,那么它将在另一个场景中失败,而在第一个场景没有失败的场景中,另一个场景将失败。我需要的东西,将给我的逻辑,但从来没有失败的脚本执行,仍然允许我返回正确或错误,这取决于对象是否存在


提前感谢您帮助我解决这个问题,也感谢您学习和提高我的Javascript技能

您可以通过以下方式检查
if
条件中的async
exists
属性:

if(await things.thingSelector(thingName).exists) {
    // do something 
} 

您可以使用以下断言来测试存在和不存在元素:

test('Test existence and non-existence elements', async t => {
    await t
        .expect(Selector('#existing-element').exists)
        .expect(Selector('#non-existing-element').exists).notOk()
});

这对我有用,你可以试试

async veriryCreativeIconButtonNotExists(){
await t.expect(this.exportButton.exists).ok()
await t.expect(this.columnPickerIcon.exists).ok()
await t.expect(this.filterColumnIcon.exists).ok()
if (await t.expect(this.columnPickerIcon.exists).ok()){
  await t.expect(this.creavtiveIconButton.exists).ok()
  await t.click(this.creavtiveIconButton)
  await t.expect(this.creativeImage.exists).ok()
  await t.click(this.creativeImage)
} else {
  return false;
}
return true;

“脚本执行失败”是什么意思?如果你得到一个错误,所有的细节都应该放在问题中。另外,如果
wait
在承诺被拒绝后不会返回,那么了解
t.expect(thing.exists).notOk())
如何以及是否会被拒绝会很有帮助。非常感谢!我现在更了解它的工作原理了。这起作用了!!:-我喜欢学习!如果元素不存在(尚未),测试驱动程序将立即解决此承诺,因此可能会出现错误否定。这就是说:例如,如果您正在单击一个按钮并弹出要显示的元素,但是在if子句的计算过程中,该元素尚未呈现,那么该子句的计算结果将为false。如果计算只在片刻后进行,它将返回true。@Samuel我认为超时机制满足了这一点。您可以明确指定isI使用此样本的时间。在我的第一次尝试中,我的测试失败,出现以下错误消息:
ReferenceError:Selector未定义
。然后我像这样在我的测试文件中导入它:
import{Selector}来自'testcafe'。再次运行测试后,它再次失败,并显示新消息:
未指定断言方法
。你知道如何解决这个问题吗?我设法解决了:对于
true
的情况,你还必须像这样添加
.ok()
,>
.expect(选择器('existing element').exists)。ok()
不带
。ok()
在我的例子中失败了。如果你需要一个if条件,比如单击一个带有弹出菜单的可重新调整大小的工具栏,它会随着窗口大小的变化而调整大小,但这并没有真正的帮助。根据窗口大小,您要查找的菜单项可能在工具栏中,也可能不在弹出菜单中。弹出菜单甚至可能没有在DOM主体中定义,这意味着检查它的存在将使脚本失败,因为它甚至没有在DOM中找到。但是一旦你点击了弹出菜单,它就会被加载并被找到。这就是我现在实际面临的困难!:-D
async veriryCreativeIconButtonNotExists(){
await t.expect(this.exportButton.exists).ok()
await t.expect(this.columnPickerIcon.exists).ok()
await t.expect(this.filterColumnIcon.exists).ok()
if (await t.expect(this.columnPickerIcon.exists).ok()){
  await t.expect(this.creavtiveIconButton.exists).ok()
  await t.click(this.creavtiveIconButton)
  await t.expect(this.creativeImage.exists).ok()
  await t.click(this.creativeImage)
} else {
  return false;
}
return true;