2016-01-28 43 views
1

在參考答案:https://stackoverflow.com/a/7811812/3146582是否發現元素確認頁面已滿載?

是否等待隨機頁面元素被

_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement")); 

發現確實證實了頁面已經完全加載

隨着滿載我認爲:現在

  • 所有必需的設計元素都顯示
  • 瀏覽器沒有下載任何數據該頁面
+1

您可以使用相同的帖子上的以前的答案:[here](http://stackoverflow.com/questions/5868439/wait-for-page-load-in-selenium/34146048#34146048)。剛剛添加,readyState的DOM屬性有5個選項: 1 - **未初始化** - 尚未開始加載 - 2 - **加載** - 正在加載 - 3 - **已加載** - 已已加載 - 4 - **交互式** - 已加載足夠和用戶可以與它互動 - 5 - **完整** - 完全加載 –

+0

感謝您的詳細信息,這一切似乎完全符合我的期望:) –

回答

1

選項1:

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(120)); 

選項2:

WebDriverWait wait; 
wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60)); 
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete")); 
0

使用pageLoadTimeout以確定是否頁面有已完全下載。確定什麼是頁面加載預期延遲從您的規格,並使用該時間作爲您的超時使用此方法。

+0

你不覺得這不是可靠的測試嗎?我們不考慮隨機互聯網連接問題(放緩),隨機超長下載一個或多個元素等? –

+0

然後只需超時10分鐘。 – Maertin

+0

它似乎並不是一個可靠的測試... –

0

由於延遲加載組件,定義所有Web應用程序的通用完全加載狀態是完全不可能的。有幾個我用來定義加載狀態的做法。 1.重複對頁面上的網頁元素進行計數,直到數字穩定。 2.等待頁面上最慢的組件。

+0

我假設使用延遲加載來上傳頁面元素,這些頁面元素在頁面的早期階段不是必需的 –

+0

當Web應用程序有很多組件時,您不必一次處理並渲染它們。您應該首先顯示最高優先級組件,然後再處理其他組件。 在這種情況下,除非您持續檢查應用程序中所有組件的狀態,否則不會知道應用程序的「完全加載」狀態。 因此,我給你2種做法,我用它來確定Web應用程序是否已加載。 – Buaban

0

Selenium阻止代碼,直到它從DOM接收到頁面加載通知。您可以使用pageLoadTimeout來限制時間。

但是,不是表示元素是可見的,只存在。爲確保它們的顯示,您應該使用expected conditions進行明確的等待。例如對於

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); 
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("id"))); 

這將等待你的元素是可見的,即顯示元件和具有高度和寬度大於0

這也並不意味着網頁可以」改變了。只有在頁面完全加載並更改頁面後,JavaScript纔可以開始運行。

欲瞭解更多信息,請看here

2

不,這並不一定意味着該網頁是 「滿載」。所有成功調用findElement告訴你是那個元素被加載到DOM中。如果你選擇正確的元素,它可能可能意味着頁面按照您的標準定義的完全加載,但是這完全取決於頁面結構。例如,我可以設想一個頁面,該頁面通過setTimeout執行JavaScript中的XmlHttpRequest。 findElement調用可能會成功,但頁面仍然可以通過該機制下載資源。這就是爲什麼在今天的網頁中沒有「完全加載頁面」的「一刀切」定義的原因之一。這取決於有問題的頁面。