在实际的测试中,有时候我们会经常遇到找不到元素的问题,这也是自动化测试中经常会遇到的情况,我一般首先考虑的就是是否由于页面中嵌套了frame,从而导致定位不到元素,如果页面代码中没有iframe层,再根据报错信息来考虑原因是否是:元素被隐藏,定位路径不正确等情况。
一般下列情况中页面可能包含frame嵌套:后台管理系统中,页面中有一些独立的功能模块,特征是页面显示切换了模块,但是地址栏的URL并没有变化。或者是一些对接其他系统功能的模块,很可能会包含嵌套。下面我们来学习一下,如何通过切换frame来成功定位元素。
WebDriver.TargetLocator:
例一:w3c
@Test
public void testUntitledTestCase() throws Exception {
driver.get("http://www.w3school.com.cn/tiy/t.asp?f=html_frame_cols");
//List<WebElement> ls=driver.findElements(By.tagName("frame")); //直接通过tag不能查找到此元素
//System.out.println(ls.size());
WebElement fa_frame=driver.findElement(By.cssSelector("#result>iframe"));//注意不要有空格
//通过元素,切换到父级iframe
driver.switchTo().frame(fa_frame);
driver.switchTo().frame(0);//子frame可以用索引来查找
System.out.println(driver.getPageSource());
driver.switchTo().parentFrame();
System.out.println(driver.getPageSource());
driver.close();
}
例二:163邮箱
错误写法:会报错org.openqa.selenium.NoSuchElementException: Unable to locate element: *[name='email']
原因就在于name=email是另一个frame中的,此页面只是引用
driver.get(" https://mail.163.com/");
driver.findElement(By.linkText("密码登录")).click();
WebElement fa_frame=driver.findElement(By.id("loginDiv"));
fa_frame.findElement(By.name("email")).click();
fa_frame.findElement(By.name("email")).sendKeys("ad");
正确写法:
@Test
public void testUntitledTestCase() throws Exception {
driver.get(" https://mail.163.com/");
driver.findElement(By.linkText("密码登录")).click();
WebElement fa_frame=driver.findElement(By.cssSelector("#loginDiv>iframe"));
driver.switchTo().frame(fa_frame);
Thread.sleep(10000);
driver.findElement(By.name("email")).click();
driver.findElement(By.name("email")).sendKeys("ad");
}
还遇到一个报错:is not reachable by keyboard
检查方法:标签是否有输入功能 ,若有,则要用element.click()将焦点锁定要这里,再输入文本;若没有,则说明用法错误。
查看frame源码方法:
①ctrl+鼠标点击
②在新页面右击--查看页面源代码
参考:https://blog.csdn.net/CCGGAAG/article/details/76284777