1

我試圖讓我的代碼(使用Watir開發的IE8)與watir-webdriver和IE9一起工作。 目前我有一個等待的問題。watir-webdriver IE9的等待方法

例如

Watir::Wait.until{browser.button(:value, "Login").exists?} 

它不會等待,給我下一個錯誤

C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/response.rb:50:in `assert_ok': Unable to find element with xpath == .//button[ 
text()='Login'] | .//input[@value='Login' and (@type='button' or @type='reset' or @type='submit' or @type='image')] (Selenium::WebDriver::Error::UnexpectedJavascriptError 
) 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/response.rb:15:in `initialize' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/http/common.rb:58:in `new' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/http/common.rb:58:in `create_response' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/http/default.rb:64:in `request' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/http/common.rb:39:in `call' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/bridge.rb:450:in `raw_execute' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/bridge.rb:428:in `execute' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/remote/bridge.rb:396:in `find_element_by' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/common/search_context.rb:41:in `find_element' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/locators/element_locator.rb:86:in `find_first_by_multiple' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/locators/element_locator.rb:33:in `locate' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/elements/button.rb:53:in `locate' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/elements/element.rb:259:in `assert_exists' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/elements/element.rb:36:in `exists?' 
     from 1.rb:20:in `block in <main>' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.12.2/lib/selenium/webdriver/common/wait.rb:36:in `until' 
     from 1.rb:20:in `<main>' 

試圖與IE8相同的腳本,並有同樣的問題。 當然,我可以用睡眠來解決它,但這不是一個好主意。 如果我在等待之前睡幾秒鐘,它可以正常工作。如果這立即引起您的測試服務器證書錯誤頁面後,使用「無效」(自簽名)證書,那麼你必須發生http://rubydoc.info/github/jarib/watir-webdriver/master/Watir/Element#wait_until_present-instance_method

回答

1

試試這個:

browser.button(:value, "Login").wait_until_present 

更多信息兩個選項。

1)將您的測試服務器上的證書添加到您的客戶端測試系統上的可信根證書頒發機構池中。這使IE將這些證書視爲來自可信任的提供商。 (從不爲網站上的網站做這個,只適用於你或你公司的某個人控制的測試服務器)

2)硬連線睡眠在那裏。

問題的發生是因爲IE9在那個證書頁面上做了一些特殊的事情,阻止了 javascript,並阻止webdriver訪問頁面上的任何東西。即使是簡單的基本方法,如'browser.text',也會在該頁面上失敗,更不用說檢查現有的元素。登錄按鈕的第一次檢查發生在無效的證書警告頁面仍然顯示時,這就是導致錯誤的原因。如果頁面從不顯示,或者您只等一小段時間,那麼您將不會看到該錯誤。

MS在該頁面上所做的工作旨在防止惡意軟件站點自動將響應轉移到其站點。好東西安全明智,但它也阻止Webdriver訪問頁面。我懷疑webdriver的人會找到一種解決辦法,如果他們這麼做的話,我希望MS能夠在不久之後關閉他們認爲的「安全漏洞」。

爲了測試,我確信最好的做法是將測試用例服務器上的自簽名證書添加到測試客戶端系統上的受信任根提供程序列表中。這消除了警告,並且比在所有自動化中處理它更快,更容易。它還會在用戶遇到真正的生產服務器時複製用戶體驗,這些服務器無疑具有有效的證書,並且從不產生該警告。

我以前一直致力於尋找'圍繞'這些東西的腳本的方法,但意識到我只是固執,應該採取更容易實際的路徑。

+0

這並沒有幫助,但我發現了這個問題。我的用例是next.I通過IE9轉到https服務器,並獲得證書錯誤頁面。爲了處理這個頁面,我使用了wscript命令,並且只需單擊tab來覆蓋鏈接。等待方法在覆蓋鏈接命令{enter}後進入正確的位置,在這種情況下它會發生切斷。如果在overridelink clicked Wait命令按預期工作後再次轉到此https服務器。順便說一句,這個代碼適用於FF和鉻沒有額外的執行命令。 –

0

+0

感謝您的回答,但手動添加證書對我無效,因爲每次新服務器版本到達時(每週2-3次),腳本在20多臺機器上執行時,我都需要這樣做。 –

+0

那麼你只需要在那裏硬編碼一個足夠長的睡眠以確保webdriver永遠不會嘗試訪問那個不好的證書頁面。或者您可以找到一種方法來獲得在這些測試系統上註冊爲有效的證書。 (也許wscript要做到這一點?)他們每次重建證書嗎?另一種選擇可能是設置一個本地系統,該系統可以充當「權威」,併爲那些可以長期保存的服務器頒發證書。然後將「權限」添加到您的測試系統基礎映像中,以便它始終顯示爲有效。 –