在实际项目的自动化测试中,咱们常常会遇到进行某操做后页面会被刷新,定位元素找不到的状况。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