Имам приложение с удостоверяване, базирано на клиентски сертификат, което се опитвам да автоматизирам. Избирайки различни сертификати, потребителят може да получи различни права за кандидатстване. Идеята е да използвате 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
Може ли някой да ми даде съвет за оптимизация или някакъв друг оптимален начин за работа със споменатите клиентски сертификати?