Selenium 判斷元素是否存在


關於selenium判斷元素是否存在,我想在baidu/google 上搜索的話,一搜一大把,但是我還是想聊一下我目前碰到的問題。

 

場景 :

頁面A,需要點擊按鈕B

但是在頁面A上 有3個 pop 彈框,暫且稱之為P1,P2,P3, 這3個pop 會影響對按鈕B 的點擊

進入頁面A的時候,3個POP 有時候會出現,有時候不會出現,沒有規律。

所以我每次想要點擊按鈕B 之前,都要判斷一下3個POP 是否存在。

判斷代碼如下 : 

1 public boolean isElementExist(WebDriver driver, By selector){ 
2         try{
3              driver.findElement(selector); 
4              return true; 
5         }catch (NoSuchElementException e){ 
6             return false;
7         }
8     }

 

這里會有一個潛在 的問題,如果當這個元素不存在的時候,第3行代碼會一直循環的去頁面查找這個元素,直到 找到元素 or 超過設置的最長等待時間。

我們知道selenium 有 隱式等待顯式等待 2種方式, 我這里沒有利用顯式等待,那么就會利用 隱式等待,我隱式等待設置的時間為10秒,也就是說如果元素一直不出現,代碼會等待10秒,那3個元素就是30秒,

這個時間還是比較久的,單個case中可能還無所謂,但是如果有100個case需要判斷,那就是3000秒,時間耽誤還是比較大的。

在咨詢網友之后,做了如下改動:

 1 /**
 2      * 判斷元素是否存在
 3      * 
 4      * @param driver
 5      * @param Locator
 6      * @param timeout
 7      *            最多等待的時間,單位 : 秒
 8      * @return
 9      */
10     public static boolean isElementExist(WebDriver driver, By locator, int timeoutSeconds) {
11         driver.manage().timeouts().implicitlyWait(timeoutSeconds, TimeUnit.SECONDS);
12         try {
13             driver.findElement(locator);
14             return true;
15         } catch (Exception e) {
16             return false;
17         } finally {
18             driver.manage().timeouts().implicitlyWait(Constant.waitSeconds, TimeUnit.SECONDS);
19         }
20     }

 

給方法加了1個參數 timeoutSeconds, 在方法里面去手動修改webdriver的隱式等待時間,在finally中再改回系統默認的等待時間。

這樣在調用的時候,就可以指定判斷元素是否存在的最大等待時間了 :

 

if (elementIsExist(driver, By.id("row_35"), 2)) {
   //xxxx
}

 

感謝qq群: 20442181 里的 山村野夫,在路上-WIFI, Chris 等的大力幫忙~

 


免責聲明!

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



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