在测试工作当中经常会遇到代码抛出NoSuchElementException异常,根据经验,抛出该异常的原因如下:
1. 元素定位表达式错误
2. 元素未加载出来
3. 元素存在与另一个html页面当中
4. 元素存在与另一个windows窗口当中
第一个原因好解决,第二个添加等待时间即可,如果不知如何添加,请点击链接进入等待时间添加一节链接:selenium之三大等待
第三和第四种原因需要切换iframe或windows窗口,涉及知识点如下:
三大切换:
切换iframe
切换alter
切换windows窗口
1. 切换iframe
在html中会存在内嵌的html,及iframe,在查找某些元素时需要切换到iframe中(先定位到iframe,后切换),在对元素进行操作,操作完成之后还需回到原来的html页进行元素操作
● 切换到内嵌的html中
WebElement iframeElement = driver.findElement(By.xpath("//iframe[contains(@src,'low_login_enable=1')]"));
//切换到iframe
driver.switchTo().frame(iframeElement);
● 返回到父级html
driver.switchTo().parentFrame();
● 返回到默认的html中
driver.switchTo().defaultContent();
2.切换Alert
alert为浏览器插件,开发者工具中无法定位到,因此需要切换到Alert中进行相关元素操作
driver.findElement(By.id("abtn")).click();
//切换alert
Alert alert = driver.switchTo().alert();
常用API
//获得警告弹框中的提示语
alert.getText();
//点击确认按钮
alert.accept();
//取消
alert.dismiss();
3.切换window
当我们在页面中点击一个a链接时,有两种情形:
- 在当前窗口加载新页面内容
- 新建一个窗口加载新页面内容,这种情况在 a 标签有 target=“_blank” 时触发
当发生第2种情况时,同iframe类似,我们需要切换窗口,
切换方式:
传入要操作窗口的handle句柄 --窗口的标识,唯一,并且是一串字符串
driver.switchTo.window(nameOrHandle);
如何获取到句柄
driver.getWindowHandle();//获取当前操作窗口的句柄-返回值类型为set,无序
driver.getWindowHandles();//获取测试时打开的所有窗口句柄
//公共窗口切换方法
public static void switchWindow(String title){
Set<String> allHandles = driver.getWindowHandles();
for (String handle:allHandles){
//判断是不是对应的句柄(根据什么来判断)
if(driver.getTitle().equals(title)){
//符合,跳出循环
break;
}else {
//切换窗口
driver.switchTo().window(handle);
}
}
}