【问题标题】:Handling Chrome client certificates in Watir tests在 Watir 测试中处理 Chrome 客户端证书
【发布时间】:2016-01-06 00:54:32
【问题描述】:

我有一个基于客户端证书的身份验证的应用程序,我一直在尝试将其自动化。通过选择不同的证书,用户可以获得不同的应用权限。这个想法是使用基于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

但是对于脚本的其余部分client.timeout,5 秒的时间太短了。

我认为问题出在goto,所以我尝试了其他方法,但似乎它们的行为方式都相同:

b.driver.navigate.to 'https://example.com' # => Net::ReadTimeout
b.execute_script('window.location.href = "https://example.com"') # => Net::ReadTimeout

谁能为我提供优化建议或其他一些最佳方式来处理提到的客户端证书?

【问题讨论】:

    标签: ruby google-chrome watir-webdriver client-certificates rautomation


    【解决方案1】:

    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
    

    【讨论】:

    • 是的,你是对的!但是,证书选择窗口出现需要一点时间,所以在t = Thread.start { b.goto } 之后,我不得不放了一个短暂的sleep 时间:sleep(2)。谢谢!我没有使用你的窗口句柄代码,但我原来的窗口标题。
    • 使用句柄而不是标题更好,因为这意味着您将使用 Watir 使用的浏览器窗口,而不是您可能打开的其他窗口。 sleep 也不是一个好的解决方案,因为您不知道它必须等待的神奇时间是什么(或者它可能等待太久,例如浪费宝贵的时间)。我已经用一个可能更好的解决方案更新了我的答案。
    • 好吧,我完全同意你的所有观点,但是,b.window.handle 说:NoMethodError: protected method 'handle' called,也许这在 watir-classic 中有效?我也尝试过b.window.inspectb.driver.window_handleb.window.hash,但 RAutomation 无法找到这个窗口。至于RAutomation::WaitHelper.wait_until的第二部分,恐怕不行。我认为问题在于“选择证书”并不是父窗口上的真正文本,而是某种子模式窗口上的文本。我无法到达它并检查它是否以我尝试过的任何方式退出......
    【解决方案2】:

    Watir 仅适用于浏览器呈现的页面。尝试完全忽略证书。 http://watirwebdriver.com/browser-certificates/

    【讨论】:

    • 在我看来,您似乎没有理解我的问题。我说的是用于应用程序登录的客户端证书。您的建议是关于服务器证书。此外,很明显,仅 Watir 无法处理 Chrome 证书,这就是我使用 rautomation gem 的原因,它可以很好地完成这项工作。
    • 当前 Watir 在页面加载时被阻止。当浏览器开始采用新的 WebDriver W3C 标准时,您将能够将页面加载策略设置为 none (w3c.github.io/webdriver/…)。在那之前,如果您想在页面完成加载之前做某事,那么您将无法挽救异常。使用预先导入的证书创建 Firefox 配置文件会起作用吗? stackoverflow.com/questions/10889085/…
    • 感谢@titusfortner,新的WebDriver 确实看起来很有趣。 Firefox 解决方案可能有效,但是该浏览器不是我自动化工作的重点,因为没有人使用它来访问提到的应用程序(最终用户制作 Firefox并不容易> 使用智能卡证书)。虽然有一些 IE 用户,证书选择行为也不同,所以我什至可以让它工作,但我的主要关注点仍然是 Google Chrome
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2019-07-26
    • 2017-04-12
    • 2017-02-25
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多