togatttiのエンジニアメモ

過度な期待はしないでください.

SeleniumRCでPreparing Firefox profile...で止まるときの対処法

Selenium RCで自動テストするとき、テストスイート実行前にFirefoxが 10回に一回くらい、停止してしまいテストができない状況があった。

調べても原因がいまいち分からずじまいだったが、ようやく対処法 を見つけたので、メモしておく。

といっても、状況は人それぞれなのだが、自分が遭遇したケースでは、 停止するときは、いつもここで止まる。

     09:58:16.652 INFO - Version Jetty/5.1.x
     09:58:16.652 INFO - Started HttpContext[/selenium-server/driver,/sel
enium-server/driver]
     09:58:16.652 INFO - Started HttpContext[/selenium-server,/selenium-s
erver]
     09:58:16.652 INFO - Started HttpContext[/,/]
     09:58:16.652 INFO - Started SocketListener on 0.0.0.0:5560
     09:58:16.652 INFO - Started org.mortbay.jetty.Server@1eae15f
     09:58:29.118 INFO - Checking Resource aliases
     09:58:29.118 INFO - Checking Resource aliases
     09:58:29.118 INFO - Command request: getNewBrowserSession[*firefox,
http://hoge.example.com/] on session null
     09:58:29.134 INFO - creating new remote session
     09:58:29.321 INFO - Allocated session 3c67617374474d1c98f449a724ecb9
68 for http://hoge.example.com/, launching...
     09:58:31.024 INFO - Preparing Firefox profile...

この状態で停止するときのfirefoxのプロセスを確認したところ、"-silent" が付いていたまま、ゾンビ化していた。

$ ps aux | grep [f]irefox
togashik 13222 12.8  6.0 723200 117152 pts/0   Sl   08:30   0:07 /usr/lib64/firefox/firefox -silent

そのため、直感でプロセスをkillしたところ、次のテストが起動し始めた。

対処が分かったところで、簡単なスクリプトにして、以下のような感じで 裏で回しておいたところ、自動テストが止まらず、ストレス無くテストすることができた。

#!/usr/bin/env bash
# Author: Kenta Togashi

INTERVAL=5
COUNT=0

while :
do
    sleep $INTERVAL
    ZOMBIE_FIREFOX_PID=`ps aux | grep 'firefox' | grep '[-]silent' | awk '{print $2}'`
    if [ -n "$ZOMBIE_FIREFOX_PID" ];then
        COUNT=`expr $COUNT + 1`
        if [ $COUNT -eq 3 ];then
            kill -9 $ZOMBIE_FIREFOX_PID
            COUNT=0
        fi
    fi
done

Kill zombie process of firefox during the time that you execute automation test through the selenium web driver and the firefox browser

$ nohup bash kill_zombie_firefox &

上記の解決法を試みる前にjavaによるSeleniumRC実行時にオプションで、 -firefoxProfileTemplateをつけるという方法もあるらしいが、うまくいかなかった。

また、仮想フレームバッファのXvfbを用いて行えば、停止せずにテスト可能らしいが ブラウザ内でページ遷移を確認する必要があったため、断念した。