2013-03-01 77 views
10

我的兩個方案的結果 -結合隱含的等待和明確的等待一起意外的等待時間

1)首先

@driver.manage.timeouts.implicit_wait = 30 
@wait = Selenium::WebDriver::Wait.new(:timeout => 45) # Time greater than implicit 
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")} 

這給司機45秒搜索的文本(預計)

2)其次

@driver.manage.timeouts.implicit_wait = 30 
@wait = Selenium::WebDriver::Wait.new(:timeout => 5) # Time less than implicit 
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")} 

現在,這爲駕駛員提供了30秒尋找文本(不是預期的)

有沒有辦法讓硒等待時間只有explicit而不是兩個更大的等待時間?

注 - 不聲明隱含的等待時間不是一個選項,因爲我不能讓selenium掛起每次司機無法找到的東西。

使用Selenium版本30,窗戶,FF

+0

根據隱式等待文檔,默認設置爲0,那麼究竟是什麼問題呢? – phoet 2013-03-01 21:41:27

+0

爲什麼不把隱式等待設置爲5呢? – BlackHatSamurai 2013-03-01 23:51:53

+0

隱式等待可以幫助我對每個元素保持默認的等待狀態,所以不希望保持低至5秒。我想用更短的時間等待(比如說「wait_to_fail」)來檢查元素*不存在。 – Amey 2013-03-03 11:37:00

回答

39

不要混合使用隱性和顯性等待。部分問題是在WebDriver系統的「遠程」端實現隱式等待(但可能不總是!)。這意味着它們已被「烘烤」到IEDriverServer.exe,chromedriver.exe,安裝到匿名Firefox配置文件中的WebDriver Firefox擴展,以及Java遠程WebDriver服務器(selenium-server-standalone.jar)。顯式等待僅在「本地」語言綁定中實現。使用RemoteWebDriver時,事情會變得更加複雜,因爲您可能多次使用系統的本地和遠程端。

這是如何工作的:本地代碼 - > Java遠程服務器 - >遠程服務器上的本地Java語言綁定 - >「遠程」組件,如Firefox擴展,chromedriver.exe或IEDriverServer.exe。在電網的情況下,這更復雜,因爲可能還有其他的跳躍。

因此,當您嘗試混合隱式和顯式等待時,您已經誤入「未定義的行爲」。您可能能夠弄清楚這些行爲的規則是什麼,但隨着驅動程序的實施細節發生變化,它們可能會發生變化。所以不要這樣做。

如果您不使用隱式等待,則無法找到元素時,您不應該遇到「掛起」。驅動程序應立即拋出NoSuchElement異常。

+0

感謝您的迴應。所以問題的確在於我的腳本掛起,而不是立即失敗。這是一個硒webdriver紅寶石問題? – Amey 2013-03-03 11:39:10

+0

你的意思是說,當隱式等待沒有設置(或設置爲零)時,WebDriver代碼無限期地掛起?使用Firefox時出現的這些症狀確實存在問題,但它在2.30.0中得到修復。如果你將隱式等待設置爲零以外的任何東西,那麼是的,當然如果元素不存在,WebDriver會「掛起」直到超時。當您使用其他瀏覽器時會發生什麼?怎麼樣更新到2.31? – JimEvans 2013-03-03 12:56:05

+0

我發佈了一個[相關的問題](http://stackoverflow.com/questions/20268396/mixing-implicit-and-explicit-waits)(我對此感到困惑) – KnewB 2013-11-28 14:18:11

-3

最佳做法是在每個測試開始時設置implicitlyWait(),並使用WebDriverWait()等待元素或要加載的AJAX元素。

但是,在同一個測試中,implicitlyWait()和WebDriverWait()不能很好地協同工作。 您必須在調用WebDriverWait之前使implicitlyWait()無效,因爲implicitlyWait()還會設置「driver.findElement()」等待時間。

每當你使用WebDriverWait()與implicitlyWait()已經設置一些初始值,請按照下列步驟 -

  1. 抵消implicitlyWait()
  2. 執行WebDriverWait(),並返回元素
  3. 復位implicitlyWait()再次

實施例的Java代碼 -

driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() 

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); 
element = wait.until(ExpectedConditions.visibilityOfElementLocated(by)); 

driver.manage().timeouts().implicitlyWait(DEFAULT_WAIT_4_PAGE, TimeUnit.SECONDS); 
+0

你應該添加代碼的來源,因爲是複製代碼而不是你的代碼。 – SysDragon 2013-09-05 08:29:21