(七)多表单切换 frame

在实际的测试中,有时候我们会经常遇到找不到元素的问题,这也是自动化测试中经常会遇到的情况,我一般首先考虑的就是是否由于页面中嵌套了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

 

posted @ 2019-04-30 17:26  测试开发分享站  阅读(125)  评论(0编辑  收藏  举报