100 тестов или 100 браузеров? Запуск процесса - весьма дорогое удовольствие, а каждый чесиный тест требует на себя два процесса, брайзер и драйвер (кроме, пожалуй, лиса?).
Обещается, что ког-да-нибудь к нам прибудет добавка серверов - я постараюсь узнать, сколько селениумов в параллель можно запустить. :)
По поводу параллельного запуска - вот пример на пяти инстансах одного браузера (чтобы проще было понять сделующий за этим примером код):
if (5 -eq (Start-SeChrome -Count 5 | Enter-SeURL "http://google.com" | Get-SeWebElement -Name q | Set-SeWebElementKeys cheese | Submit-SeWebElement).Count) {Write-Host "OK"} else {Write-Error "test failed"}; sleep -Seconds 10; Stop-Process -Name chrome;
это реализация затасканного примера с сайта селениума про поиск сыра.
Start-Se[Browser] запускает пять инстансов, депозитит процесс айди и настоящий хэндл окна (а не фуфло сами знаете откуда получаемое :)), после запуска последнего браузера - этот браузер становится текущим и любой код нового пайплайна будет работать для него.
Но мы в текущем пайплайне: навигируем, ищем ввод, кладём сыр, сабмитим. В данном примере не каждый шаг делается параллельно, а цепочка шагов делается параллельно (т.е. вы видим, как навигирует один браузер, в нём находится контрол, в контрол подаются данные и потом всё повторяется для следующего браузера.
Если надо распараллелить и шаги, тогда надо инстансы браузеров депозитить в переменные
$drivers = Start-SeChrome -Count 2; $drivers | Enter-SeURL "http://google.com"; $drivers | Get-SeWebElement -Name q; и т.д.
это очень грубый пример кода, с кучей аутпута в консоль (лень облагораживать)
Наконец, вернёмся к теме запуска в нескольких браузерах:
if (5 -eq ($(Start-SeChrome -Count 2; Start-SeFirefox -Count 3) | Enter-SeURL "http://google.com" | Get-SeWebElement -Name q | Set-SeWebElementKeys cheese | Submit-SeWebElement).Count) { Write-Host "OK"; } else { Write-Error "test failed"; }; sleep -Seconds 10; Stop-Process -Name chrome,firefox
Тут Миша заметил, что в одном из тестов может выскочить терминирующая ошибка. Да, в этих командлетах тоже (потому что если не запустился браузер, не снавигировал или не нашёл контрол - часто дальше нет смысла терять время).
В случае шарпа и джавы, это, вероятно, делается через try-catch (или более хитро), у нас это делается довольно просто:
$ErrorActionPreference = [System.Management.Automation.ActionPreference]::SilentlyContinue;
конечно, тоже зависит от командлет, но обычно означает, что до поры до времени ошибки подавляются, а решение принимается где-то на последних стадиях специально написанным для этого кодом.
ЗЫ: Слип - это оператору теста уважуха, посмотреть, что получилось, подвигать мышкой инстансы (селениум же не переводит инстанс в foreground, как это делает UI Automation - кстати, спасибо мне за идею микро-фичи :)). Код