我有一个基于客户端证书身份验证的应用程序,我一直试图实现自动化。通过选择不同的证书,用户可以获得不同的应用程序权限。其思想是使用基于watir-webdriver的脚本和rautomation gem并登录到应用程序中。在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有人能为我提供优化建议或其他处理上述客户端证书的最佳方法吗?
发布于 2015-12-15 21:43:25
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发布于 2015-12-02 15:02:59
Watir只在浏览器呈现的页面上工作。尝试完全忽略证书。http://watirwebdriver.com/browser-certificates/
https://stackoverflow.com/questions/34045044
复制相似问题