2017-10-20 175 views
0

我被困在一个严重的问题上。我打了7/10次陈旧的元素参考问题。 我的应用程序在完成操作后显示一个conf对话框。此消息出现一秒钟左右。我想阅读conf对话框的文本。量角器:“browser.wait(EC.visibilityOf(confDial),FIFTY_SECONDS)上的陈旧元素参考”;“

var confDial= element(by.id('dialog')); 
browser.wait(EC.visibilityOf(confDial), FIFTY_SECONDS); 
confDial.getText().then(function(text1){ 
     expect(text1).toBe(TextExpected); 
}); 

我所做的是,等待操作完成后出现对话框,然后执行getText()。但它在browser.wait()本身失败。该错误是

失败:陈旧元件参考:元件未连接到页面 文件九时14分52秒(会话信息:铬= 52.0.2743.116)九时14分52秒 (驱动程序信息:chromedriver = 2.21.371461 (633e689b520b25f3e264a2ede6b74ccc23cb636a),platform = Linux 4.2.0-42-generic x86_64)(警告:服务器没有提供任何堆栈跟踪信息)09:14:52命令持续时间或超时:76 毫秒09:14 :52有关此错误的文档,请 访问:http://seleniumhq.org/exceptions/stale_element_reference.html

我如何解析它?

在此先感谢。

+0

我知道这不会解决你的问题,但看起来像你的Chrome和Chrome驱动程序版本是很老。升级到最新版本总是一个好主意。 – HaC

回答

1

据我所知,visibilityOf(element)需要存在。 因此,您应该首先等待元素出现。

试试这个:

browser.wait(EC.presenceOf(element(by.id('dialog'))), FIFTY_SECONDS); 
var confDial= element(by.id('dialog')); 
browser.wait(EC.visibilityOf(confDial), FIFTY_SECONDS); 
//expect already resolves a promise, so no need for a then() here. 
expect(confDial.getText()).toBe(TextExpected); 

//confDial.getText().then(function(text1){ 
//  expect(text1).toBe(TextExpected); 
//}); 

Evtl.也这样,它可以工作(尽管不是陛下):

browser.wait(EC.presenceOf(var confDial = element(by.id('dialog'))), FIFTY_SECONDS); 
+0

感谢您的建议。但没有运气:(点击相同的问题,相同的地方 – jeet

+0

@jeet修改我的答案检查存在之前,你定义的对象...现在这样工作吗? 如果是这样,我通常只是定义cssSelector-String变量,而不是完整的元素,以遵循DRY原则。 –

+0

嘿恩斯特,让我试试这个方法。将发表我的观察。谢谢你帮助我。 – jeet

0

你尝试isPresent?

这将确认一次对象DOM树存在...

confDial.isPresent().then(function(result) { 
    if (result) { 
     confDial.getText().then(function(text1){ 
     expect(text1).toBe(TextExpected); 
     }); 
    } 
    else { 
    //some alternate action 
    } 
}); 
+0

是的Vishal,我试过了。第一次2/3运行,它工作。但后来它开始失败。 – jeet

相关问题