Selenium Web服务器状态元素参考错误

时间:2019-11-18 06:55:15

标签: selenium-webdriver protractor selenium-rc

我有几个测试规格,但它受阻。其中之一:

  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:   旧元素参考:元素未附加到页面文档|

我正在使用protactorselenium web driver。 我也尝试了相关问题:issue1 issue2

我需要帮助。

2 个答案:

答案 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();一样,因为关于元素存在的预期条件已经通过。