如何解決Selenium中"Cannot find function addEventListener in object [object HTMLDocument]"的錯誤


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了下這個錯誤,發現暫時沒有適合我的解決方案:

  1. 有的方案建議換firefox來測試 -- 可是我們的這個自動化用例是要跑在一台linux服務器上,裝firefox不現實
  2. 有點方案建議禁用js -- 可是現在這個頁面越來越復雜,js禁用的話就側不起來了,沒意義
  3. 有點方案建議換PhantomJs -- 這個PhantomJs確實不會報這個錯誤,以前也用過,但是PhantomJs速度太慢,也是坑

怎么辦呢?本來想到HtmlUnit的官方網站上反饋這個bug,結果一搜,已經有人反饋過這個bug了: https://sourceforge.net/p/htmlunit/bugs/1536/. 這個狀態為closed,說明已經解決了!

那為啥還報這個錯誤呢?懷疑是Selenium引用的HtmlUnit版本太低導致的。我使用的Seleniumselenium-server-standalone-2.52.0.jar, 目前最新版本的Selenium2.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了。

完事,收工~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM