Обработка на клиентски сертификати на Chrome в тестове на Watir

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

Може ли някой да ми даде съвет за оптимизация или някакъв друг оптимален начин за работа със споменатите клиентски сертификати?


person fing    schedule 02.12.2015    source източник


Отговори (2)


Няма ли Thread да ти помогне тук? Не съм сигурен дали ще стане, защото зависи от GIL на Ruby (глобално заключване на интерпретатора) и основните технически характеристики на 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
person Jarmo Pertman    schedule 15.12.2015
comment
Да, бяхте прави! Отнема обаче известно време, за да се появи прозорецът за избор на сертификат, така че след t = Thread.start { b.goto } трябваше да поставя кратко заспиване време: sleep(2). Благодаря! Все пак не използвах вашия код за обработка на прозореца, а моя оригинал със заглавието на прозореца. - person fing; 05.01.2016
comment
Използването на манипулатор вместо заглавие е по-добро, тъй като това означава, че ще работите с прозорец на браузъра, който Watir използва, а не с някой друг, който може да сте отворили. Освен това sleep никога не е добро решение, защото не знаете какво е вълшебното време, което трябва да изчака (или може да изчака твърде дълго, напр. загуба на ценно време). Актуализирах отговора си с възможно по-добро решение. - person Jarmo Pertman; 05.01.2016
comment
Е, напълно съм съгласен с всичките ви точки, но b.window.handle казва: NoMethodError: protected method 'handle' called, може би това работи в watir-classic? Опитах също b.window.inspect, b.driver.window_handle, b.window.hash, но RAutomation не можа да намери прозореца с това. Що се отнася до втората част с RAutomation::WaitHelper.wait_until, страхувам се, че не работи. Мисля, че проблемът е, че Избор на сертификат всъщност не е текст в родителския прозорец, а в някакъв подмодален прозорец. Не можах да го достигна и да проверя дали излиза по какъвто и да е начин, който опитах... - person fing; 07.01.2016

Watir работи само на изобразени от браузър страници. Опитайте напълно да игнорирате сертификата. http://watirwebdriver.com/browser-certificates/

person titusfortner    schedule 02.12.2015
comment
Не ми се струва, че сте разбрали въпроса ми. Говоря за клиентски сертификати, които се използват за влизане в приложението. Вашият съвет е относно сървърните сертификати. Също така е ясно, че Watir сам не може да се справи със сертификатите на Chrome, затова използвам rautomation gem, който върши работата доста добре. - person fing; 02.12.2015
comment
В момента Watir блокира, докато се зарежда страница. Когато браузърите започнат да възприемат новия стандарт WebDriver W3C, ще можете да зададете стратегия за зареждане на страница без (w3c.github.io/webdriver/). Дотогава сте заседнали със спасяването на изключението, ако искате да направите нещо, преди страницата да приключи със зареждането. Ще работи ли създаването на профил във Firefox с предварително импортираните сертификати? stackoverflow.com/questions/10889085/ - person titusfortner; 03.12.2015
comment
Благодаря @titusfortner, новият WebDriver определено изглежда интересен. Решението Firefox може да работи, но този браузър не е в центъра на усилията ми за автоматизация, тъй като никой не го използва за достъп до споменатото приложение (не е лесно за крайните потребители да направят Firefox работа със сертификати за смарт карти). Все пак има някои потребители на IE и там поведението при избор на сертификат е различно, така че дори мога да го накарам да работи, но основният ми фокус остава Google Chrome. - person fing; 03.12.2015