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了。

完事,收工~