0

У меня есть приложение с проверкой подлинности на основе сертификата клиента, которое я пытаюсь автоматизировать. Выбирая разные сертификаты, пользователь может получить разные права приложения. Идея состоит в том, чтобы использовать watir-webdriver основанный сценарий и rautomation драгоценный камень и войти в приложение. В веб-браузере Chrome он выглядит так же, как это:Обработка клиентских сертификатов Chrome в тестах Watir

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 

Но для остальной части скрипта client.timeout 5 секунд будет слишком низкой.

Я думал, что проблема была с goto так я пробовал другие методы, но это, кажется, все они ведут себя таким же образом:

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

Может кто-нибудь дать мне совет по оптимизации или каким-либо другим оптимальным способом обрабатывать указанные клиентские сертификаты?

ответ

2

Не хотел бы Thread помочь вам здесь? Не уверен, будет ли это, потому что это зависит от Ruby's 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_ время: 'sleep (2)'. Благодаря! Я не использовал ваш код дескриптора окна, но мой оригинал с названием окна. – fing

+0

Лучше использовать дескриптор вместо заголовка, так как это означает, что вы будете работать с окном браузера, который использует Watir, а не другим, который вы могли бы открыть. Кроме того, 'sleep' никогда не является хорошим решением, потому что вы не знаете, какое волшебное время он должен ждать (или он может слишком долго ждать, например, тратить драгоценное время). Я обновил свой ответ с возможным лучшим решением. –

+0

Ну, я полностью согласен со всеми вашими точками, однако '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', я боюсь, что это не сработает. Я думаю, проблема заключается в том, что «_Select the certificate_» на самом деле не является текстом в родительском окне, а в каком-то подмодальном окне. Я не мог дотянуться до него и проверить, не выйдет ли он так, как я пытался ... – fing

0

Watir работает только на страницах, сделанных браузером. Попробуйте полностью игнорировать сертификат. http://watirwebdriver.com/browser-certificates/

+0

Это не кажется мне, что вы поняли мой вопрос. Я говорю о клиентских сертификатах, которые используются для входа в систему. Ваш совет касается сертификатов сервера. Кроме того, ясно, что только Watir не может иметь дело с сертификатами Chrome, поэтому я использую ** rautomation ** gem, который отлично выполняет эту работу. – 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

Смежные вопросы