有時候我們在定位一個頁面元素的時候發現一直定位不了,反復檢查自己寫的定位器沒有任何問題,代碼也沒有任何問題。這時你就要看一下這個頁面元素是否在一個iframe中,這可能就是找不到的原因之一。如果你在一個default content中查找一個在iframe中的元素,那肯定是找不到的。反之你在一個iframe中查找另一個iframe元素或default content中的元素,那必然也定位不到。
selenium webdriver中提供了進入一個iframe的方法:
WebDriver org.openqa.selenium.WebDriver.TargetLocator.frame(String nameOrId)
也提供了一個返回default content的方法:
WebDriver org.openqa.selenium.WebDriver.TargetLocator.defaultContent()
這樣使我們面對iframe時可以輕松應對。
以下面的html代碼為例,我們看一下處現iframe。
- main.html
- <html>
- <head>
- <title>FrameTest</title>
- </head>
- <body>
- <div id = "id1">this is a div!</div>
- <iframe id = "frame" frameborder="0" scrolling="no" style="left:0;position:absolute;" src = "frame.html"></iframe>
- </body>
- </html>
- frame.html
- <html>
- <head>
- <title>this is a frame!</title>
- </head>
- <body>
- <div id = "div1">this is a div,too!</div>
- <label>input:</label>
- <input id = "input1"></input>
- </body>
- </html>
- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.firefox.FirefoxDriver;
- public class FameStudy {
- public static void main(String[] args) {
- WebDriver dr = new FirefoxDriver();
- String url = "\\Your\\Path\\to\\main.html";
- dr.get(url);
- //在default content定位id="id1"的div
- dr.findElement(By.id("id1"));
- //此時,沒有進入到id="frame"的frame中時,以下兩句會報錯
- dr.findElement(By.id("div1"));//報錯
- dr.findElement(By.id("input1"));//報錯
- //進入id="frame"的frame中,定位id="div1"的div和id="input1"的輸入框。
- dr.switchTo().frame("frame");
- dr.findElement(By.id("div1"));
- dr.findElement(By.id("input1"));
- //此時,沒有跳出frame,如果定位default content中的元素也會報錯。
- dr.findElement(By.id("id1"));//報錯
- //跳出frame,進入default content;重新定位id="id1"的div
- dr.switchTo().defaultContent();
- dr.findElement(By.id("id1"));
- }
- }
switch_to方法會new1個TargetLocator對象,使用該對象的frame方法可以將當前識別的”主體”移動到需要定位的frame上去。