> 使用selenium時會遇到很多的坑,這里分享一些經驗給大家。
[TOC]
#### 1.wait ~ until的使用
> 要勤使用wait~until,由于我們打開的網頁有時候會比較慢時,查找調用某個元素時就比較容易報NoSuchElementException異常。或者有時候一些JS是動態生成的,也需要用到wait~until,不然也會報錯。
#### 2.switchToEndWindow勤使用
> switchToEndWindow是我們自定義的一個方法,由于我們使用selenium訪問某個網頁,然后又點擊了其中一個鏈接,誰知道這個鏈接是否含有target="_blank"呢。做爬蟲類程序尤為如此。所以我們增加一個方法,每次點擊了某個鏈接跳轉后,執行一下switchToEndWindow方法。
~~~
<?php
//切換至最后一個window
function switchToEndWindow($driver){
$arr = $driver->getWindowHandles();
foreach ($arr as $k=>$v){
if($k == (count($arr)-1)){
$driver->switchTo()->window($v);
}
}
}
?>
~~~
#### 3.異常處理
> 使用selenium過程中,會碰到各種意想不到的報錯。比如做爬蟲過程中,都要用try包含起來處理異常,這樣可以防止一旦異常報錯后,終止了程序的執行。那么在測試的每個節點的健康狀態,可在數據庫中記錄查詢。
#### 4.定位異常解決
> 元素在網頁第一次加載后,就會確定他的坐標,當我們進行了某種操作,改變了寬度或高度,則很容易引起相關元素的坐標改變,從而報錯。
> 報錯信息:Element is not clickable at point (284, 11).
> 解決保存就是在調用click或submit方式之前先調用sendKeys方法,讓其重繪坐標
~~~
$elemA->sendKeys('xxx')->click();
$elemB->sendKeys('xxx')->submit();
~~~
> 有時候,以上使用sendKeys方式還是沒辦法解決問題時,則很可能是因為網頁中含有浮動DIV,導致各個元素定位變化了。
> 這個時候只需要找到那個浮動的DIV,隱藏掉就可以了。
~~~
$js = <<<js
var nav = document.getElementsByClassName("nav_m");
nav[0].style.display = 'none';
js;
$driver->executeScript($js);
~~~
>如果以上兩種方式結合都還有問題的情況下,就建議用JS來解決。
~~~
//設置屏幕滾動到當前元素
$elems = $driver->findElements(WebDriverBy::className('n'));
foreach ($elems as $elem){
if(CommonUtil::contain($elem->getText(), '下一頁')){
$elem->sendKeys('xxx'); //設置焦點
}
}
$js = <<<js
var next = document.getElementsByClassName('n');
for (i = 0; i < next.length; i++) {
if(next[i].innerHTML == '下一頁>'){
//next[i].click();
next[i].style.backgroundColor = "red";
}
}
js;
$driver->executeScript($js); //JS執行點擊下一頁
~~~
#### 5.執行時間的設置
> 使用自動化測試或爬蟲程序,往往程序執行的時間會比較長。為了防止timeout,我們需要設置如下
~~~
set_time_limit(0);
ignore_user_abort(true);
~~~