前言

不論是C#,Java還是python開發者,selenium提供各語言的支持,而它已經不是一個僅是自動化測試的工具,更是資料收集的利器,今天要介紹Stalenessof使用場景和技巧。

用法說明及範例

Wait until an element is no longer attached to the DOM.

一般來說會用這個方法來確認DOM物件是否還在網頁上,下面用C#提供個簡單範例。

protected void WaitUntilEleDisappear(IWebElement element, int timeoutSec = 60)
{
    try
    {
        WebDriverWait wait = new WebDriverWait(webDriver), TimeSpan.FromSenconds(timeoutSec));
        wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.StalenessOf(element));
    }
    catch
    {
        ...
    }
}
  1. 換頁確認

今天你需要先人工手動先登入網站才能進行下去抓取資料,但是你每次輸入的時間又不一定,不太可能用Thread.Sleep來等待處理,selenium又不知道甚麼時候已經登入了它能接手了,這時候你就可以使用這個方法。先webDriver.Navigate().GoToUrl(url)到登入頁面後,等頁面載入後先抓登入按鈕element,就可以使用WaitUntilEleDisappear(FindElement(By.Id("loginBtn")));了,這時候就會selenium就會一直等你輸入完帳號密碼並點擊登入按鈕後跳轉到新頁面才會往下執行處理。

  1. ajax異步資料抓取

今天你需要自動填入表單資料並按下搜尋等待資料返回後產生表格,再抓取表格內資料。但是有些網站一開始就有一個空的表格,導致你點擊搜尋按鈕後,資料因為網路延遲不是即時返回,這時候雖然抓到表格但資料卻是空的。同樣的,網路延遲是不可預測的,不會用Thread.Sleep來等待個幾秒來處理。解決方法就是在點擊搜尋按鈕之前先抓到表格element,點擊搜尋後使用WaitUntilEleDisappear(FindElement(By.Id("dataTable")));,等到這個表格DOM物件消失後,js重新填入資料後再抓取,這樣就可以確保能抓到資料。

參考延伸閱讀: