2017-10-20 353 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

相關問題