我有几个测试规格,但它受阻。其中之一:
it('Add button should exist', async () => {
var add = $('[test-id="add"]');
browser.wait(EC.presenceOf(add), 10372);
expect(await add.isPresent()).toBeTruthy();
});
我正在检查此代码块中的DOM元素。当我仅运行此it块时,测试成功通过。但是,当我运行所有测试规格时,会出现错误:
message ='未处理的承诺拒绝:StaleElementReferenceError: 旧元素参考:元素未附加到页面文档|
我正在使用protactor
和selenium web driver
。
我也尝试了相关问题:issue1 issue2
我需要帮助。
答案 0 :(得分:0)
该消息表明该元素未附加到DOM。您应该首先等待元素可见,然后与之交互:
it('Add button should exist', async () => {
browser.wait(EC.presenceOf($('[test-id="add"]'), 10372);
var add = $('[test-id="add"]');
expect(await add.isPresent()).toBeTruthy();
});
答案 1 :(得分:0)
首先,您必须了解Stale Element Reference Error
是什么。
来自Mozilla ...
过时的元素引用错误是WebDriver错误,由于引用的Web元素不再附加到DOM而发生。 ...当某个元素不再附加到DOM时,即已从文档中删除该元素或该文档已更改,则称该元素为过时的
...意味着,当您第一次与该元素进行交互时,该元素被标记为存在,但是下一次您打算使用该元素时,该元素已经消失但仍被标记为存在,从而导致错误提示现在遇到。
例如,在您的代码中
it('Add button should exist', async () => {
var add = $('[test-id="add"]');
browser.wait(EC.presenceOf(add), 10372);
// Code continues because the element 'add' is present.
expect(await add.isPresent()).toBeTruthy(); // Stale error is thrown here when the saved element 'add' is not present anymore.
});
要修复此问题,只需直接重新查找该元素,而不是从一个实例中引用它即可。
it('Add button should exist', async () => {
browser.wait(EC.presenceOf($('[test-id="add"]')), 10372);
expect(await $('[test-id="add"]').isPresent()).toBeTruthy();
});
即使那样,您在这里所做的也像expect(true).toBeTruthy();
一样,因为关于元素存在的预期条件已经通过。