在實際項目的自動化測試中,咱們常常會遇到進行某操做後頁面會被刷新,定位元素找不到的狀況。css
現總結下,實踐中個人解決方法:java
當操做後頁面會刷新或是JS加載時,都要增長等待刷新時間,保證在頁面中可以定位到對應的元素。app
方法一:顯式等待。推薦使用。ide
顯式等待,就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間以內都沒找到,那麼就跳出Exception。若是後續代碼還要用到這個WebElement,則代碼能夠這樣寫,以下:測試
//等待進入菜單管理頁面 WebDriverWait menuwait = new WebDriverWait(driver,20); WebElement menuopenNode = menuwait.until(new ExpectedCondition<WebElement>(){ @Override public WebElement apply(WebDriver d) { WebElement menulastProject = driver.findElement(By.cssSelector("#admin-module-search-form")); return menulastProject; }});
這裏,20是要等待的秒數。若是沒有知足until()方法中的條件,就會始終在這裏wait 20秒,依然找不到,就拋出異常。ui
若是後續代碼不須要用到這個WebElement,則代碼能夠這樣寫,以下:code
(new WebDriverWait(driver,30)).until(ExpectedConditions.elementToBeClickable(By.linkText("菜單用戶權限")));
方法二:強制等待。orm
//刷新頁面等待時間3秒 try{ Thread.sleep(3000); } catch(Exception e){ e.printStackTrace(); }
方法三:隱式等待。不推薦使用。這個方法我徹底沒有使用到。ci
driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);
隱式等待, 此處的隱式等待是針對Driver 每次執行命令的 最長執行時間也能夠理解爲超時時間, 一些人對此處有誤解,認爲是讓Driver等一段時間, 確實某些時候能讓Driver等一段時間, 可是影響是全局的,每次Driver執行 找不到元素都會等待此處設置的時間, 假設某處將此值設置的太長,必須在執行完成以後還原回來,不然判斷一個元素是否存在的時候,就會遇到很坑爹的問題。element
參文:http://www.tuicool.com/articles/u63Eve