如何使用Selenium和Javascript检查元素是否存在?

时间:2017-11-30 14:05:03

标签: javascript selenium jestjs

我正在使用Jest和Selenium进行简单的测试。我正在测试是否在点击它后从DOM中删除了一个元素。

我试过这个:

 test('User removes button after clicking on it', async (done) => {
    await driver.navigate().to('myProjectUrl');
    await driver.wait(until.elementLocated(By.css('.wrapper')), 10000);
    await driver.findElement(By.id('buttonId')).click();
    const deleteButton = await driver.findElement(By.id('buttonId'));
    expect(deleteButton.isDisplayed()).not.toEqual(true);
    done();
});

这似乎有效。考试通过但我得到了:

StaleElementReferenceError: stale element reference: element is not attached to the page document

我也试过这种方法:

test('User removes button after clicking on it', async (done) => {
    await driver.navigate().to('myProjectUrl');
    await driver.wait(until.elementLocated(By.css('.wrapper')), 10000);
    await driver.findElement(By.id('buttonId')).click();
    const buttonOrMessage = await driver.wait(until.elementLocated(By.id('buttonId)), 300, 'missing_button');
    expect(buttonOrMessage).toEqual('missing_button');
    done();
});

此方法返回错误,而不是预期的消息。

关于我缺少什么的任何建议? 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果您删除了deleteButton元素,则该元素不再可用/存在,因此.isDisplayed()会抛出StaleElementReferenceError

您可以在try / catch块中重新搜索id“buttonId”,捕获任何异常,并以此为基础进行断言。

类似的东西:

let buttonIsStillThere;
try {
    buttonIsStillThere = driver.findElement(By.id('buttonId')).isDisplayed();
} catch () {
    buttonIsStillThere = false;
}

答案 1 :(得分:1)

使用until.stalenessOf等待从DOM中删除按钮:

test('User removes button after clicking on it', async (done) => {
  await driver.navigate().to('myProjectUrl');
  let deleteButton = await driver.wait(until.elementLocated(By.css('.wrapper #buttonId')), 10000);
  await deleteButton.click();
  await driver.wait(until.stalenessOf(deleteButton), 300, 'button still present in the DOM');
  done();
});