project: blog
target: how-to-resolve-cannot-find-function-addEventListener-error-in-selenium.md
status: publish
date: 2016-04-28
update: 2016-04-28
tags:
- Selenium
- Java
- JavaScript
- HTMLUnit
categories:
- Selenium
今天遇到一個很坑爹的問題,某Selenium自動化用例老是失敗,報錯如下:
1) App\Tests\***********
Facebook\WebDriver\Exception\UnknownServerException: TypeError: Cannot find function addEventListener in object [object HTMLDocument]. (http://**********/*)
Failed to take screen-shot: org.openqa.selenium.htmlunit.HtmlUnitDriver cannot be cast to org.openqa.selenium.TakesScreenshot
Google了下這個錯誤,發現暫時沒有適合我的解決方案:
- 有的方案建議換firefox來測試 -- 可是我們的這個自動化用例是要跑在一台linux服務器上,裝firefox不現實
- 有點方案建議禁用js -- 可是現在這個頁面越來越復雜,js禁用的話就側不起來了,沒意義
- 有點方案建議換PhantomJs -- 這個PhantomJs確實不會報這個錯誤,以前也用過,但是PhantomJs速度太慢,也是坑
怎么辦呢?本來想到HtmlUnit的官方網站上反饋這個bug,結果一搜,已經有人反饋過這個bug了: https://sourceforge.net/p/htmlunit/bugs/1536/. 這個狀態為closed
,說明已經解決了!
那為啥還報這個錯誤呢?懷疑是Selenium
引用的HtmlUnit
版本太低導致的。我使用的Selenium
是selenium-server-standalone-2.52.0.jar
, 目前最新版本的Selenium
是2.53.0
,然而不能升級到2.53.0
,因為2.53.0
中沒有自帶HtmlUnit
.
咋辦呢?幸好懂那么一丟丟Java
—— 下載個HtmlUnit
的最新版本,然后重新打包selenium-server-standalone-2.52.0.jar
我是不會啦,不過可以指定下classloader
的加載路徑:
java -Djava.ext.dirs=./lib -jar selenium-server-standalone-2.52.0.jar
./lib
就是放HtmlUnit
的一堆jar
文件的目錄。這樣子classloader
加載HtmlUnit
的類的時候就會使用./lib
里面的了,就不會使用selenium-server-standalone-2.52.0.jar
中的老版本中的了。
以此配置重新啟動下Selenium
的服務,然后再運行對應的測試用例,果然一切OK了。
完事,收工~