在一次偶然的情况下,在chrome上用selenium框架去抓取某个id为XX的页面元素,使用WebDriver的findElement().click()方法进行点击,原来在firefox浏览器运行得好好的程序报错了。编译器给报了InvocationTargetException,有点经验的coder都知道,这个异常范围太广了,并且最蛋疼的是不给出任何异常信息(StacktraceInformation为null)这时候就不得不用getCause方法来得到导致其出现的真正异常,并且得到异常信息,方便我们追踪定位。这个不是本文重点,就不在这里说具体方法了。
之前发现手动点击正常,并且使用isDisplyed和isExists方法确定其没有被其他元素遮挡或者没有来得及加载出来,因此可以排除等待时间不够和被其他元素遮挡的可能性;
查看元素的xpath发现并没有被任何frame或者iframe嵌套,因此也可以排除焦点没有切换到当前待点击元素的可能。
在firefox和IE上可以正常抓取,并且正常进行模拟点击,再结合检视页面的html和js代码,网页代码有bug的可能性也基本可以排除了。
最后定位后追踪到谷歌浏览器的驱动chromedriver上,记得selenium是个开源项目,于是到github上搜这框架。找到驱动部分,果不其然,firefox的驱动还是selenium的人员开发的,而google的驱动却是google内部人员开发的。毕竟不是原班人马搞出来的东西,兼容性不好,有些东西不支持也是正常的,即使是google的工程师也不可能做到十全十美。
既然找到原因就好办了,他俩不兼容那我在chrome上不用那个方法就好。直接调用js的点击事件
WebDriver driver = new ChromeDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
- WebElement element = driver.findElement(By.id("XX"));
- jse.executeScript("arguments[0].click();", element);
-
搞定。