2011-02-27 46 views
0

我已被分配創建一種'web爬行者'。任務是在某些網站上輸入一段數據,然後提交該數據以獲得結果。WatiN - 等待Cookies

我發現WatiN是獲取這些數據的好工具,因爲它是開源的,並且具有我需要的所有功能 - 即使這是濫用測試API(是否濫用?)。

反正 - 真正的問題是什麼,就是

Browser.WaitForComplete();

不等待一切加載。它似乎只是等待最後的body標籤然後返回。不過,我相信當頁面加載完成時不會生成cookie,因爲它是由ASP.NET後端生成的 - 它似乎加載了一個交互式對象,看起來像AJAX或沿着它們的線。

我不擁有或託管網站,因此只能根據我從瀏覽器和其他工具看到的信息收集信息。

有沒有辦法讓WatiN等待cookie被更新?

謝謝先進。

John。

編輯:

正如我在做固定在一分鐘的問題是什麼一個例子(這是一個有點非正統的,但它是固定它的分鐘)。

Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();
Browser.WaitForComplete();

var cookie = Browser.Eval("document.cookie");

現在你可以理解爲什麼我想找到一個真正的解決方案。

感謝

回答

1

我不知道可以捕捉事件對於這一點,我懷疑有一定的JavaScript最終更新cookie的網頁上運行。

如果你能告訴一個「老」和「更新」餅乾之間的區別,你可以嘗試這樣的事:

// Maximum number of loops, to avoid infinite loops 
int maxLoops = 10; 

// Wait for the page to complete 
Browser.WaitForComplete(); 

// Grab a copy of the current cookie 
var cookie = Browser.Eval("document.cookie"); 

// HACK: Dirty hack to wait for cookie to be updated 
while (CookieIsNotUpdated(cookie) && i++ <= maxLoops) 
{ 
    Browser.WaitForComplete(); // (Or other wait/sleep) 
    cookie = Browser.Eval("document.cookie"); 
} 

這是沒有這樣做的一個很好的方式,但它應該工作在沒有更好的情況下。

+0

事實上,這是我原來的一種方式。 不過,我發現,即使清除Cookie,然後該網頁將加載是徒勞的頁面,似乎產生例如餅乾模板: 「cookieData = 6&cookieData2 = 6」 話,好像餅乾後改變他們已經被創造了。 'cookieData = 4&cookieData2 = 1' 我希望有更準確的方法,謝謝。感謝您的反饋,但非常感謝! – 2011-02-27 15:26:30

+0

如果您無法判斷cookie是否「更新」,那麼您可以做的最好的決定是您準備等待多長時間,然後等待那麼久。它不可靠,但我看不到任何其他方式。 – 2011-02-27 15:34:58

+0

這就是說 - 如果你在你打電話的網頁上打個招呼,你可能會注入一些javascript,並在它「完成」時通知你,這取決於它的工作原理 – 2011-02-27 15:35:28