selenium自动化页面元素不存在异常发生的缘由有一下几点:java
(1)页面加载时间过慢,须要查找的元素程序已经完成可是页面还未加载成功。此时能够加载页面等待时间。web
(2)查到的元素没有在当前的iframe或者frame中。此时须要切换至对应的iframe或者frame中才行。chrome
(3)元素错误。浏览器
解决页面加载时间所引发的元素找不到,咱们能够为页面设置加载时间。时间的设置分为如下三种:app
(1)显式等待异步
显示等待是针对于某个特定的元素设置的等待时间,若是在规定的时间范围内,没有找到元素,则会抛出异常,若是在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操做。ide
public static void main(String[] args) throws IOException {函数
System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
ChromeOptions Options = new ChromeOptions();
Options.addArguments("user-data-dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data");
WebDriver driver = new ChromeDriver(Options);
try {测试
WebDriverWait wait = new WebDriverWait(driver, 10, 1);
// 每隔1秒去调用一下until中的函数,默认是0.5秒,若是等待10秒尚未找到元素 。则抛出异常。
wait.until(new ExpectedCondition<WebElement>() {spa
@Override
public WebElement apply(WebDriver driver) {
driver.findElement(By.id("kw"));
return driver.findElement(By.id("kw"));
}
}).sendKeys("我是一个自动化测试小脚本");
} finally {
driver.close();
Runtime.getRuntime().exec("taskkill /F /im " + "chromedriver.exe");
Runtime.getRuntime().exec("taskkill /F /im " + "chrome.exe");
}
}
(2)隐式等待
隐式等待是设置的全局等待,分为一、页面加载超时等待 ;二、页面元素加载超时;三、异步脚本超时
若是是页面元素超时,设置等待时间,是对页面中的全部元素设置加载时间。隐式等待是其实能够理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。
public static void main(String[] args) throws IOException {
System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
ChromeOptions Options = new ChromeOptions();
Options.addArguments("user-data-dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data");
WebDriver driver = new ChromeDriver(Options);
try {
//页面加载超时时间设置为5s
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
driver.get("https://www.baidu.com/");
//定位对象时给10s 的时间, 若是10s 内还定位不到则抛出异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.findElement(By.id("kw")).sendKeys("隐式等待");
//异步脚本的超时时间设置成3s
driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
} finally {
driver.close();
Runtime.getRuntime().exec("taskkill /F /im " + "chromedriver.exe");
Runtime.getRuntime().exec("taskkill /F /im " + "chrome.exe");
}
}
(3)线程等待
线程等待是java语言中的线程类Thread类中的sleep()方法。此等待是很死板的,须要等待时间结束才会执行相关代码。该方法须要抛出InterruptedException 异常。通常不建议使用,可是在弹窗处理,能够优先选择线程等待。
public static void main(String[] args) throws IOException, InterruptedException {
System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
ChromeOptions Options = new ChromeOptions();
Options.addArguments("user-data-dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data");
WebDriver driver = new ChromeDriver(Options);
try {
Thread.sleep(5000); driver.findElement(By.id("kw")).sendKeys("线程等待"); } finally { driver.close(); Runtime.getRuntime().exec("taskkill /F /im " + "chromedriver.exe"); Runtime.getRuntime().exec("taskkill /F /im " + "chrome.exe"); } }