常用方法:- switchTo().frame() : 将当前定位的主体切换为 frame/iframe 表单的内嵌页面中;
- switchTo().defaultContent() : 方法跳出表单;
在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用,WebDriver 只能在一个页面上对元素识别与定位,对于 frame/iframe 表单内嵌页面上的元素无法直接定位。这时就需要通过 switchTo().frame()方法将当前定位的主体切换为 frame/iframe 表单的内嵌页面中。 - // frame.html
- <html>
- <head>
- <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" />
- <script type="text/javascript">
- $(document).ready(function(){});
- </script>
- </head>
- <body>
- <div class="row-fluid">
- <div class="span10 well">
- <h3>frame</h3>
- <iframe id="if" name="nf" src="http://www.baidu.com" width="800"height="300">
- </iframe>
- </div>
- </div>
- </body>
- <scriptsrc="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"> </script>
- </html>
复制代码在 html 代码中,通过 iframe 表单嵌入一个百度页面;这 个 时 候 直 接 定 位 页 面 上 的 百 度 的 输 入 框 一 定 会 报 找 不 到 元 素 的 错 误 , 因 此 可 以 使 用switchTo().frame()先找到 frame.html 中的<iframe>标签,然后再定位百度输入框。 - public static void main(String[] args) throws InterruptedException {
- WebDriver driver = new ChromeDriver();
- File file = new File("E:/jase/frame.html");
- String filePath = file.getAbsolutePath();
- driver.get(filePath);
- driver.switchTo().frame("if"); //切换到 iframe(id = "if")
- driver.findElement(By.id("kw")).sendKeys("webdriver");
- driver.findElement(By.id("su")).click();
- Thread.sleep(5000);
- driver.quit();
- }
复制代码switchTo().frame()默认可以直接取表单的 id 或 name 属性。如果 iframe 没有可用的 id 和 name 属性,则可以通过下面的方式进行定位。 - WebElement xf = driver.findElement(By.xpath("//iframe[@id='if']")); //先通过 xpth 定位到 iframe
- driver.switchTo().frame(xf); ……
- driver.switchTo().defaultContent(); //退回上一级表单
复制代码如果完成了在当前表单上的操作,则可以通过 switchTo().defaultContent()方法跳出表单。
|