關於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 等的大力幫忙~
