2015-05-04 44 views
4

我只是想知道是否有一個優雅的方式來利用ExpectedConditions或其他東西讓我的代碼等待頁面的源代碼包含給定的字符串,直到給定的超時。我知道我可以使用這樣的事情,如果我想使用的特定元素的定位...Selenium等待頁面源代碼包含

WebDriverWait wait = new WebDriverWait(driver,10); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.linkText("foobar"))); 

,但我想做到這一點,而無需使用定位特定元素,只是使用整個網頁源代碼我的參考而已。有什麼建議麼?

+0

你對「整個頁面源」有什麼意義?你想如何設定一個條件?禮物? – swinkler

+0

@swinkler是啊只是HTML目前 – user2150250

+0

但是,是一個元素將與By.ByTagName – swinkler

回答

2

你不能擁有所有元素作爲等待的條件。當切換頁面weddriver自動等待頁面加載。當它完成加載HTML元素時,它會繼續。但它不等待JavaScript執行。現在很多網頁使用JavaScript在HTML加載後填充網頁。

你應該做的是等待你想要使用的每個元素。

wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by))); 

wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(element))h; 
+0

爲什麼'.refreshed()'是必需的? – dialex

+0

它刷新搜索元素的dom –

0

不取決於知名度,你可以檢查一個元素是否存在於DOM:

WebDriverWait wait = new WebDriverWait(driver,10); 
wait.until(ExpectedConditions.presenceOfElementLocated(By.tagName("html"))); 

如果你想指個人的文字,就可以實現ExpectedCondition<T>並創建自己的條件類。所提到的接口可以訪問WebDriver(由於超級接口com.google.common.base.Function<WebDriver,T>)。

apply您可以使用WebDriver,並調用方法getPageSource()方法有String呈現頁面的源代碼。檢查String你喜歡什麼。

+0

我相信方法名是'By.tagName'。 – LittlePanda

+0

更正。謝謝 – swinkler

0

可以等待文件的readyState成爲complete。針對正在加載的網頁運行javascript return document.readyState").equals("complete")

void waitForLoad(WebDriver driver) { 
    ExpectedCondition<Boolean> pageLoadCondition = new 
     ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver driver) { 
       return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete"); 
      } 
     }; 
    WebDriverWait wait = new WebDriverWait(driver, 30); 
    wait.until(pageLoadCondition); 
} 

然後你就可以得到網頁源:

driver.getPageSource(); 

然後驗證pageSource包含你在找什麼:

driver.getPageSource().contains("your element/tag"); 

我希望這有助於!

+0

正如我在我的答案中所述。這隻會等待HTML元素在完全加載時出現在頁面上。之後添加的任何元素都將無法從webdriver –

+0

如何使用scriptTimeout?這是否等待Ajax的東西? – LittlePanda

+0

你不想等待alla JavaScripts完成。其中一些可能永遠不會完成。 –