事實上,就我個人這幾天試用Headless browsers下來的體驗,我深深覺得其實Headless browser在功能上來講似乎仍明顯不及要打開頁面來運作的browser,只要test case寫的operation模式不好,就會遇到許多奇奇怪怪的問題,像是頁面元素頁面點不到、Browser開半天開不起來最後經過6分鐘後自己timeout、截圖畫面不清等等問題。
其中Chrome/FireFox/PhantomJS 三大Headless Browsers中又以Chrome問題最多,換言之最不穩定,但效能上若未經選項調整,PhantomJS執行速度最慢,幾乎跟要開頁面運作的browser一樣,這樣就享受不到Headless的極速快感了。
三種Browsers中就屬Firefox最為穩定,果然Selenium最終仍然最鍾情於火狐先生,但仍然有一點點小問題,像昨天就遇到Web Driver Exception: Connection Refused.
這個Exception是發生在跑Test Suite時,Test Case常常莫明其妙停住在某一個等好久好久,等到我洗完澡回來還在等,不知道在等什麼,最後就吐出一個Exception訊息:WebDriverException: Message: connection refused ,然後才繼續下一個test case,但這已經浪費掉5-10分鐘了,這實在是很冏。
於是乎上網查了一下,有人說:connection is refused here means that Selenium is unable to establish the connecting which you wanted to establish,就是建不起來web driver的connection就是了,導致web browser遲遲不開起來。這問題很嚴重,因為若是跑大量test case不能保證browser都能穩穩被打開的話,就無法成功有效的自動化測試,這問題非解決不可!
再稍稍Survey一下,發現這Exception的發生跟下列情形有關:
就是Race Around Condition,亦即每個test case開啟geckodriver instance時彼此在搶資源,搶不到就讓你癡癡的等的意思,然後稍微說明一下可能原因,這情況並非只有headless browsers有,但我覺得在headless中發生的次數與狀況卻較為嚴重。
有兩種解決方式:一是從test case寫法做改善,在每個test case結束時一定要Close All Browsers,以釋放掉web browser resource,讓下一個test case的web driver使用。另外一個是確認Selenium + Web driver + Web Browsers的版本是最適匹配,如果Selenium是最新的,web driver與web browser版本也必須使用最新可支援selenium的版本才行。
[Reference] https://stackoverflow.com/questions/47920639/how-to-fix-webdriverexception-message-connection-refused?noredirect=1&lq=1
2018年9月8日星期六