我試圖編寫簡單的測試。我的問題是,我想等到頁面加載完成。此刻,我在等待一些元素的介紹,但那不是我真正想要的。是否有可能這樣做:selenium-webdriver並等待頁面加載
driver = Selenium::WebDriver.for :chrome
driver.navigate.to url
driver.wait_for_page_to_load "30000"
與Java不是問題,但如何使它與紅寶石?
我試圖編寫簡單的測試。我的問題是,我想等到頁面加載完成。此刻,我在等待一些元素的介紹,但那不是我真正想要的。是否有可能這樣做:selenium-webdriver並等待頁面加載
driver = Selenium::WebDriver.for :chrome
driver.navigate.to url
driver.wait_for_page_to_load "30000"
與Java不是問題,但如何使它與紅寶石?
這是Selenium docs()是如何建議:
require 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.get "http://google.com"
element = driver.find_element :name => "q"
element.send_keys "Cheese!"
element.submit
puts "Page title is #{driver.title}"
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { driver.title.downcase.start_with? "cheese!" }
puts "Page title is #{driver.title}"
driver.quit
如果這不是一個選項,你可以從this SO post嘗試建議,但它需要在Ruby/Rails頂端一些JavaScript。
看來wait.until
正在/已經被淘汰。新的建議過程中它來尋找網頁有你認識的人將有一個元素:
expect(page).to have_selector '#main_div_id'
據我瞭解webdriver的,你不需要等待頁面加載,因爲webdriver的有blocking API但你可以確定設置頁面加載超時。
driver.manage.timeouts.page_load = 10 # seconds
這再也不需要WebDriver了。
WebElement click()和Actions單擊()都會自動根據需要「等待頁面加載」。
如果您需要等待某些ajax內容,您可以使用imclicit和explicit(按此順序)等待(請參閱seleniumhq)。
所以在Ruby中,無論何時使用get
來打開一個URL,ruby腳本只會在頁面完全加載時才進行。
所以你的情況,你會簡單地做: -
driver.get url
我也這麼認爲,但Webdriver文檔聲明 - 「取決於多種因素,包括OS /瀏覽器組合,WebDriver可能會或可能不會等待頁面加載。在某些情況下,WebDriver可能在頁面完成之前返回控件,或者甚至開始加載爲了確保健壯性,您需要使用顯式和隱式等待來等待頁面中存在的元素。 – Umang 2013-02-22 06:57:26
根據我的經驗,Webdriver絕對不會一直等待所有內容加載,特別是使用AJAX加載內容時。絕對需要等待。 – bsg 2013-07-15 12:55:18
我可以用ajax加載的數據確認等待是絕對需要的。 – Kylee 2014-11-21 20:49:13
曾經發生下述情形之一AJAX或CSS的變化引起我的測試中,有時失敗。我將這些方法添加到我的靜態驅動程序實例,以便我可以根據需要讓測試等待某些條件。 (c#)
WaitForCssChange方法中的TimedWait基本上只是一個Threading.Thread.Sleep
這不是我猜測的最美麗的方式,但它適用於我的需要。
對於Ajax等待:
public static void WaitForAjax()
{
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(25));
wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
}
變更CSS:
public static void WaitForCssChange(IWebElement element, string value)
{
int counter = 0;
while (true)
{
if(element.GetAttribute("style").Contains(value) || counter > 50)
{
break;
}
TimedWait(20);
counter++;
}
}
我使用了您鏈接到這個工作對我來說硒文檔的例子。非常感謝。 – chucknor 2016-04-25 10:59:24