我正在使用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();
});
此方法返回错误,而不是预期的消息。
关于我缺少什么的任何建议? 感谢您的帮助。
答案 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();
});