我有一個基於客戶端證書的應用程序,我一直試圖自動化。通過選擇不同的證書,用戶可以獲得不同的應用權限。這個想法是使用基於watir-webdriver
的腳本和rautomation
gem並登錄到應用程序中。在Chrome網絡瀏覽器,它看起來非常像這樣:在Watir測試中處理Chrome客戶端證書
的基本思路是:
require 'watir-webdriver'
require 'rautomation'
b = Watir::Browser.new :chrome
b.goto 'https://example.com'
# Get the Chrome window
window = RAutomation::Window.new(:title => /Chrome/i)
# Select client certificate
window.send_keys :return
然而,當腳本執行,並達到b.goto 'https://example.com'
它被卡住,因爲頁面是直到選擇證書才加載。 60秒後,這會導致客戶端超時,並且我得到一個Net::ReadTimeout
異常。因此,證書選擇的代碼永遠不會到達。
我已經捕捉Net::ReadTimeout
例外地解決了這個:
begin
b.goto 'https://example.com'
rescue
window = RAutomation::Window.new(:title => /Chrome/i)
window.send_keys :return
end
該解決方案是遠遠沒有達到最佳的腳本必須等待60秒開始執行。超時可降低到合理的等待時間,下面的一段代碼:
client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 5 # seconds – default is 60
b = Watir::Browser.new :chrome, :http_client => client
但對腳本的其餘5秒client.timeout
是太低了。
我認爲問題是與goto
所以我嘗試過其他方法,但似乎他們都以同樣的方式表現:
b.driver.navigate.to 'https://example.com' # => Net::ReadTimeout
b.execute_script('window.location.href = "https://example.com"') # => Net::ReadTimeout
誰能給我提供一個優化建議或一些其他的最佳方式處理提到的客戶證書?
是的,你是對的!但是,證書選擇窗口的出現需要一點時間,所以在't = Thread.start {b.goto}'之後,我不得不放置一個簡短的_sleep_ time:'sleep(2)'。謝謝!我沒有使用你的窗口句柄代碼,但我的原始窗口標題。 – fing
使用句柄代替標題會更好,因爲這意味着您將使用Watir使用的瀏覽器窗口進行操作,而不是您可能打開的其他瀏覽器窗口。 「睡眠」永遠也不是一個好的解決方案,因爲你不知道什麼時候它需要等待(或者等待時間太長,例如浪費寶貴的時間)。我用更好的解決方案更新了我的答案。 –
那麼,我完全同意你的觀點,但是,'b.window.handle'說:'NoMethodError:受保護的方法'處理'調用',也許這工作在_watir-classic_?我也嘗試過'b.window.inspect','b.driver.window_handle','b.window.hash',但RAutomation無法找到這個窗口。至於RAutomation :: WaitHelper.wait_until的第二部分,我擔心它不起作用。我認爲問題在於「_Select a certificate_」實際上不是父窗口上的文本,而是某種子窗口上的文本。我無法找到它,並檢查它是否以我試過的任何方式退出...... – fing