У меня есть приложение с проверкой подлинности на основе сертификата клиента, которое я пытаюсь автоматизировать. Выбирая разные сертификаты, пользователь может получить разные права приложения. Идея состоит в том, чтобы использовать watir-webdriver
основанный сценарий и rautomation
драгоценный камень и войти в приложение. В веб-браузере Chrome он выглядит так же, как это:Обработка клиентских сертификатов Chrome в тестах Watir
Основная идея заключается в следующем:
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
Может кто-нибудь дать мне совет по оптимизации или каким-либо другим оптимальным способом обрабатывать указанные клиентские сертификаты?
Да, вы были правы! Тем не менее, для окна выбора сертификата требуется немного, поэтому после 't = Thread.start {b.goto}' мне пришлось наложить короткое _sleep_ время: 'sleep (2)'. Благодаря! Я не использовал ваш код дескриптора окна, но мой оригинал с названием окна. – fing
Лучше использовать дескриптор вместо заголовка, так как это означает, что вы будете работать с окном браузера, который использует Watir, а не другим, который вы могли бы открыть. Кроме того, 'sleep' никогда не является хорошим решением, потому что вы не знаете, какое волшебное время он должен ждать (или он может слишком долго ждать, например, тратить драгоценное время). Я обновил свой ответ с возможным лучшим решением. –
Ну, я полностью согласен со всеми вашими точками, однако '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