2014-08-28 101 views
5

我有一個瀏覽器狀態=已完成但尚未加載頁面的場景。 是否有一個共同的程序,qtp可以等待頁面完全加載? 我試着用objBrowzer.sync,objPage.Sync,objPage.waitproperty「readyState」,「completed」,50。 但它並不總是工作。QTP如何等待頁面加載動態數據?

我什至不能,但等待語句,以便它等待直到在不同的情況下,該對象appears.because不同的對象都存在。 是否有任何常見的聲明可以在所有情況下使用?

在此先感謝。

+1

當你說動態數據時,你只是在詢問關於同步AJAX調用嗎?如果是這樣,請提及QTP/UFT正在使用的版本,我可以稍後添加解決方案。 – Xiaofu 2014-08-28 06:01:11

回答

9

您剛剛發現QTP沒有像AJAX驅動的網站那樣爲異步瀏覽器腳本執行同步提供任何明確的支持。當QTP認爲頁面已經完全加載時,實際上仍然有JavaScript處理程序在運行,可能會更新用於該頁面的HTML,並且QTP會盡早訪問GUI。

readyState是個好主意,但通常情況下,很容易找到此不起作用足夠好的情況下。

1.最佳解決方案是在應用程序的「繁忙」指示器上同步,如進度條或活動指示器。

不幸的是,等待繁忙的指標意味着忙碌指示燈是否真的出現,總是,但許多應用程序顯示一個只有當這一過程需要足夠長的時間(超過2秒,等)。然後,這很快變得比預期的有點混亂。

2.如果應用程序沒有這樣的東西,通常可以通過在「準備就緒」指示器上同步,例如「出現預期字段」或「確定按鈕消失」來幫助自己。如果沒有真正的「就緒」指示器(通常不存在),這通常需要針對每種情況的具體解決方案。

3.在許多項目中,自動化人們可以得到內置到應用程序只是爲他們忙指示。雖然這並沒有爲開發了很多的努力(因爲現代的應用程序有一箇中央信息調度,從而爲「忙」到「空閒」狀態和VV的轉換可以很容易地集中跟蹤),它大大簡化了作業量同步所需的。

所以如果可能的話,嘗試聯繫開發商,並讓他們出示一個屬性(變量,內存映射文件,旗語,不管他們喜歡)該測試機器人「同步」程序可以很容易地查詢。 (提示:爲了能夠區分兩個「就緒」狀態,即使在「缺少」兩者之間的「繁忙」狀態之後,除了「繁忙狀態標誌」之外,獲得連續的「繁忙狀態計數」 ,所以你可能會在同一場合請求)。然後,所有同步問題都是應用程序中的缺陷,因爲它顯然沒有正確保持就緒信號。

更新對於基於事實上的「標準」框架的應用程序,可能會找到以通用方式實現同​​步的方法。例如,對於JavaScript應用程序,我設法創建了一個工具,可以將事件流透明地報告給QTP,在那裏用於等待「足夠長的時間」,使人們能夠設置特殊的類似檢查點的庫調用等待某些事件(特別是「點擊」,以及執行AJAX的應用程序往返於Java服務器頁面,「ajaxstop」事件)才能繼續。

這已被證明是非常有用的,因爲開發人員實現對測試自動化需求的任何支持都非常複雜,而基於GUI的同步(僅通過測試對象狀態/存在)有時不是如果應用程序在後臺執行異步請求就夠了。它也消除了探索每個GUI上下文的同步選項的需求,這可能是非常耗時和/或不可靠的。

+0

Thanx的答覆。這是有幫助的 – user90 2014-09-02 05:05:09

2

有你沒有簡單的答案,我怕,像往常一樣「這取決於」

這裏有一個基本的例子,假設您正在等待一個按鈕或文字出現在屏幕上:

If Browser("user90site").Page("page1").WebButton("Button1").Exist(30) Then 
    Browser("user90site").Page("page1").WebButton("Button1").Click 
Else 
    Reporter.ReportEvent micFail,"button missing", "button missing" 
End If 

上面的代碼會等待30秒以顯示Web元素,但是如果按鈕在30秒之前出現,它將繼續並單擊按鈕,否則它將報告失敗。鑑於你有多種情況,你需要做不同的變化才能得到你想要的結果。

你有沒有失敗的測試,因爲你試圖對尚不存在的元素採取行動?

+0

但我想概括的聲明,我不能等待按鈕,例如存在。在所有情況下,它不會出現在頁面中。 – user90 2014-09-01 08:47:22

+0

爲什麼不呢?用變量替換引號中的位,讓它們根據您在應用程序中的位置進行更改?鑑於情況 – shicky 2014-09-01 09:14:57

+0

好的話,WebElement可能比WebButton更容易使用..我會試着用....謝謝:) – user90 2014-09-02 05:06:25

1

這並不容易,尤其是對於使用AJAX的網站。最好的辦法是寫簡單的功能就像

function WaitForObject(obj) WaitForObject = false Setting("DefaultTimeout") = 500 for i = 0 to 30 'or more If obj.Exist Then WaitForObject = true Exit For End If next Setting("DefaultTimeout") = 20000 ' or other value end function

,並使用這個它們在年底

+0

如果開發人員能告訴你最終創建了哪個對象,並且所有後臺處理(特別是服務器通信)當時已經完成。 (不幸的是,通常(或至少:經常)在GUI創建之後仍存在內部更新,即在最後一個GUI對象被創建之後 - 這是OP正面臨的問題的根本原因。 – TheBlastOne 2014-12-11 09:23:31

-1
while Browser("user90site").Page("page1").WebButton("Button1").Exist(2)=false 
wait 2 
wend 
Browser("user90site").Page("page1").WebButton("Button1").Click 

加載while語句會在循環,直到對象不被識別的物體。使用while而不是if更準確。

0

你可以試試這個。我知道這是非常遲的答案,但它會幫助您更準確地獲得結果。你可以調用這個函數很多次,如果您的瀏覽器加載瞭如下更多的時間:

Call AppBusyStatus(0) 
if Browser("Browsername").Exist Then 
    Call AppBusyStatus(0) 
End If 
Call AppBusyStatus(0) 

Sub AppBusyStatus(intBrowserCreationTime) 
    Do While Browser(CreationTime:intBrowserCreationTime).Object.Busy 
     Wait 0,500 
    Loop 
End Sub 
0

間諜加載圖像和添加的存儲庫,

Set obj = Browser().Page().Image() 
wait() 
While (obj.Exist) 
'Do Nothing //commented 
Wend 

這可能會增加腳本的執行時間,但會給解決您的問題。