23

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

我不想使用 document.getElementByID 方法,因为这在技术上不是 CSS 选择器,而且我们整个企业都在 CSS 选择器上进行了标准化,因此除了 CSS 选择器之外的任何遍历 DOM 的东西都不会通过我们的代码审查流程反正。

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

if (await t.expect(thing.exists).notOk())

如果上述其中一个在一个场景中没有失败,那么它将在另一个场景中失败,而另一个将在第一个没有失败的场景中失败。我需要一些能给我逻辑的东西,但永远不会使脚本执行失败,并且仍然允许我根据对象是否存在返回 True 或 False。

预先感谢您帮助我解决这个问题,并学习和成长我的 Javascript 技能!

4

3 回答 3

31

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

if(await things.thingSelector(thingName).exists) {
    // do something 
} 
于 2017-11-18T07:14:21.810 回答
8

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

test('Test existence and non-existence elements', async t => {
    await t
        .expect(Selector('#existing-element').exists)
        .expect(Selector('#non-existing-element').exists).notOk()
});
于 2019-06-27T17:33:58.870 回答
0

这对我有用,你可以试一试

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;
于 2021-01-12T16:31:17.500 回答