在一次偶然的情況下,在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);
-
搞定。
