Фон
Я работал над автоматизацией моего комплекта тестов Selenium, который я разработал для Selenium 1.0 (RC), и подключил его к системе непрерывной интеграции ( TeamCity в этом случае) на моей сборочной машине. Я быстро столкнулся с тем фактом, что я мог запустить пакет вручную на компьютере сборки, но это не удалось при запуске TeamCity.
Для полноты, вот как выглядит журнал сервера селена, когда успешно :
18:26:09.025 INFO [12] org.openqa.selenium.server.SeleniumDriverResourceHandler - Command request: getNewBrowserSession[*iexplore, http://dev2mx:8080/, ] on session null
18:26:09.041 INFO [12] org.openqa.selenium.server.BrowserSessionFactory - creating new remote session
18:26:09.072 DEBUG [12] org.openqa.selenium.server.browserlaunchers.BrowserLauncherFactory - Requested browser string '*iexplore' matches *iexplore
18:26:09.072 INFO [12] org.openqa.selenium.server.BrowserSessionFactory - Allocated session 1c8363f1edbc40b9b251e3bf4bd3d74f for http://portaldev2:80/, launching...
18:26:09.103 DEBUG [12] org.openqa.selenium.server.browserlaunchers.ResourceExtractor - Extracting /core to C:\DOCUME~1\devadmin\LOCALS~1\Temp\5\customProfileDir1c8363f1edbc40b9b251e3bf4bd3d74f\core
18:26:09.244 INFO [12] org.openqa.selenium.server.browserlaunchers.HTABrowserLauncher - Launching Embedded Internet Explorer...
18:26:09.260 DEBUG [12] org.openqa.selenium.browserlaunchers.locators.BrowserLocator - Discovering Internet Explorer...
18:26:09.260 DEBUG [12] org.openqa.selenium.browserlaunchers.locators.BrowserLocator - Checking whether Internet Explorer launcher at :'C:\Program Files\Internet Explorer\iexplore.exe' is valid...
18:26:09.260 DEBUG [12] org.openqa.selenium.browserlaunchers.locators.BrowserLocator - Discovered valid Internet Explorer launcher : 'C:\Program Files\Internet Explorer\iexplore.exe'
18:26:09.275 INFO [12] org.openqa.selenium.server.browserlaunchers.HTABrowserLauncher - Launching Internet Explorer HTA...
18:26:09.291 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for window 'null' local frame 'null' for 1800 more secs
18:26:09.291 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for condition for 1000 more ms
18:26:10.307 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - got condition? : false
18:26:10.307 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for window 'null' local frame 'null' for 1799 more secs
18:26:10.307 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for condition for 1000 more ms
18:26:10.994 DEBUG [13] org.openqa.jetty.http.HttpConnection - new HttpConnection: Socket[addr=/127.0.0.1,port=3255,localport=4444]
18:26:11.010 DEBUG [13] org.openqa.jetty.http.HttpConnection - REQUEST from SocketListener0@0.0.0.0:4444:
Режим отказа проявляется в журнале, никогда не доходя до последних двух строк. Очередь ожидания чуть выше продолжала ждать, ждать и ждать:
12:19:16.191 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for window 'null' local frame 'null' for 1800 more secs
12:19:16.191 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for condition for 1000 more ms
12:19:17.191 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - got condition? : false
12:19:17.191 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for window 'null' local frame 'null' for 1799 more secs
12:19:17.191 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for condition for 1000 more ms
12:19:18.207 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - got condition? : false
12:19:18.238 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for window 'null' local frame 'null' for 1798 more secs
12:19:18.238 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for condition for 1000 more ms
12:19:19.254 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - got condition? : false
12:19:19.254 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for window 'null' local frame 'null' for 1797 more secs
12:19:19.254 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for condition for 1000 more ms
12:19:20.269 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - got condition? : false
Я думал о разных ракурсах, чтобы изучить проблему, начиная с обновления Selenium RC до Selenium 2.0b2 и просто заменяя jar сервера и ссылки на библиотеки. Тот же результат.
Затем я подумал о дальнейшем переходе на WebDriver и Selenium 2.0, заменив
selenium = new DefaultSelenium("localhost", port, browserType, pageToOpen);
с
selenium = new WebDriverBackedSelenium(driver, pageToOpen);
С чем я сразу столкнулся, так это с тем, что WebDriver более строг в отношении фреймов! Мои тесты не проходили до тех пор, пока я не уточнил более строго, в каком кадре должны были находиться последующие объекты. Эта переделка еще не завершена, поэтому пока нет никаких выводов относительно моей первоначальной проблемы, но я подозреваю, что знаю ответ, потому что ...
Параллельно я начал читать о Selenium и безголовой конфигурации и непрерывной интеграции. Кажется, что сервер непрерывной интеграции должен, по определению, запускать все без головы, но селен нуждается в отображении. Конфликт. (Я не хочу использовать HtmlUnitDriver, потому что я хочу тестировать на реальных браузерах; не говоря уже о том, что HtmlUnitDriver еще не существует для .NET в 2.0b2!) Я прочитал о xvfb в качестве решения для linux, но я работаю на Windows Server 2003. Наиболее вероятным решением, по-видимому, является использование Selenium Grid, который может запускать настоящие браузеры на других машинах. К сожалению, Grid еще не существует для Selenium 2, так что в настоящее время это означает, что нужно придерживаться Selenium RC. Не идеально, но я мог бы жить с этим.
Вопросы
Я еще не смотрел на Grid, так что, вероятно, наивный вопрос: возникнут ли у Grid (работающие без поддержки в TeamCity) проблемы с открытием реальных браузеров на удаленных машинах?
Есть ли способ подключить Selenium 2 (без поддержки Grid) с непрерывной интеграцией?