0

我有一個基於客戶端證書的應用程序,我一直試圖自動化。通過選擇不同的證書,用戶可以獲得不同的應用權限。這個想法是使用基於watir-webdriver的腳本和rautomation gem並登錄到應用程序中。在Chrome網絡瀏覽器,它看起來非常像這樣:在Watir測試中處理Chrome客戶端證書

client-certificate

的基本思路是:

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 

誰能給我提供一個優化建議或一些其他的最佳方式處理提到的客戶證書?

回答

2

會不會Thread幫助你在這裏?不知道是否會,因爲它取決於Ruby的GIL(全局解釋器鎖)和基礎Webdriver的技術,但你可以試試看。

東西沿着這些線路可以工作(未測試):

t = Thread.start { b.goto } 

# Not sure if getting handle works or not, but if it does 
# then it should be a better way to locate the browser window 
window = RAutomation::Window.new(:hwnd => b.window.handle) 

# Wait until client certificate window exists 
RAutomation::WaitHelper.wait_until { window.windows.any? { |w| w.text =~ /Select a certificate/ }} 

# Select client certificate  
window.send_keys :return 

# Wait for the page load to finish 
t.join 
+0

是的,你是對的!但是,證書選擇窗口的出現需要一點時間,所以在't = Thread.start {b.goto}'之後,我不得不放置一個簡短的_sleep_ time:'sleep(2)'。謝謝!我沒有使用你的窗口句柄代碼,但我的原始窗口標題。 – fing

+0

使用句柄代替標題會更好,因爲這意味着您將使用Watir使用的瀏覽器窗口進行操作,而不是您可能打開的其他瀏覽器窗口。 「睡眠」永遠也不是一個好的解決方案,因爲你不知道什麼時候它需要等待(或者等待時間太長,例如浪費寶貴的時間)。我用更好的解決方案更新了我的答案。 –

+0

那麼,我完全同意你的觀點,但是,'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

0

Watir僅適用於瀏覽器呈現的頁面。嘗試完全忽略證書。 http://watirwebdriver.com/browser-certificates/

+0

這似乎不是我不,你明白我的問題。我正在談論用於應用程序登錄的客戶端證書。你的建議是關於服務器證書的。另外,很顯然,Watir獨自處理Chrome證書,這就是爲什麼我使用** rautomation **創業板,它很好地完成了這項工作。 – fing

+0

目前Watir在加載頁面時被阻止。當瀏覽器開始採用新的WebDriver W3C標準時,您可以將頁面加載策略設置爲無(https://w3c.github.io/webdriver/webdriver-spec.html#dfn-page-loading-strategy) 。在此之前,如果您希望在頁面加載完成之前執行某些操作,那麼您將遇到搶救異常的問題。 將創建一個Firefox配置文件與證書預導入工作? http://stackoverflow.com/questions/10889085/automating-ssl-client-side-certificates-in-firefox-and-selenium-testing – titusfortner

+0

謝謝@titusfortner,新的WebDriver肯定看起來很有趣。_Firefox_解決方案可能會起作用,但該瀏覽器並不是我自動化工作的重點,因爲沒有人使用它來訪問所提及的應用程序(最終用戶使用智能卡證書來使_Firefox_工作並不容易)。雖然有一些_IE_用戶,並且證書選擇行爲不同,所以我甚至可以使其工作,但我的主要關注點仍然是_Google Chrome_。 – fing