Selenium WebDriver中的IFRAME
Selenium WebDriver中的IFRAME 是嵌入到另一个网页或嵌入到另一个HTML文档中的HTML文档中的网页或内联框架。IFRAME使用< IFRAME >标签。
在本教程中,将了解-
- 如何识别IFRAME:
- 如何使用Web驱动程序命令切换iFrame中的元素:
- 嵌套框架(框架内的框架)的概念:
如何识别IFRAME
我们不能仅通过查看页面或检查Firebug来检测框架。
观察下面的图像,正在显示的广告是一个IFRAME,我们不能通过仅使用Firebug进行检查来定位或识别这一点。因此,问题是如何识别IFRAME?
如何使用Selenium WebDriver识别IFRAME
我们可以使用下面给出的方法识别Selenium中的框架:
-
- 右键单击页面,然后单击“查看页面源代码”,然后使用“iframe”进行搜索,如果可以找到任何带有“iframe”的标记名,那么就意味着包含一个iframe的页面。
在上图中,可以看到‘ 这一帧 ‘选项在右键单击时可用,因此我们现在可以确定它是IFRAME。
我们甚至可以通过使用下面的代码片段来识别IFRAME的总数。 Int size = driver.findElements(By.tagName(“iframe”)).size();
如何使用Web驱动程序命令切换iFrame中的元素
基本上,我们可以使用三种方式来切换Selenium中的元素和处理框架。
- 按索引
- 按名称或ID
- 按Web元素
按索引切换到帧:
index是Selenium中用于帧处理的属性之一,通过它我们可以切换到它。
IFRAME的索引以‘0’开头。
假设页面中有100个框架,我们可以使用索引切换到Selenium中的框架。
按名称或ID切换到帧:
Name和ID是Selenium中用于处理框架的属性,我们可以通过它们切换到IFRAME。
通过ID切换到iFrame的示例:
让我们举一个例子来切换下图中显示的Selenium中的帧。我们的要求是单击IFRAME。
我们可以通过以下URL访问此iFrame
不可能通过直接单击iFrameXPath因为它是IFRAME。首先,我们必须切换到框架,然后可以单击Using XPath。
步骤1) WebDriver driver = new FirefoxDriver(); driver.get(“http://www.itxiaonv.com/test/guru99home/”); driver.manage().window().maximize();
- 我们初始化Firefox驱动程序。
- 导航到组成iframe的“guru99”站点。
- 已最大化窗口。
步骤2) driver.switchTo().frame(“a077aa5e”);
- 在这一步中,我们需要通过Firebug检查来找出iframe的id。
- 然后通过ID切换到IFRAME。
步骤3) driver.findElement(By.xpath(“html/body/a/img”)).click();
- 在这里,我们需要找出要单击的元素的XPath。
- 使用如上所示的Web驱动程序命令单击该元素。
以下是完整的代码: public class SwitchToFrame_ID { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); //navigates to the Browser driver.get(“http://www.itxiaonv.com/test/guru99home/”); // navigates to the page consisting an iframe driver.manage().window().maximize(); driver.switchTo().frame(“a077aa5e”); //switching the frame by ID System.out.println(“We are switch to the iframe “); driver.findElement(By.xpath(”html/body/a/img“)).click(); //Clicks the iframe System.out.println(” We are done*”); } }
输出:
浏览器导航到包含上述IFRAME的页面,然后单击IFRAME。
按Web元素切换到框架:
我们甚至可以使用web元素切换到iframe。
如何切换回主机
我们必须从IFRAME出来。 driver.switchTo().parentFrame(); driver.switchTo().defaultContent();
如果无法使用ID或Web元素进行切换,如何切换框架:
假设页面中有100个框架,并且没有可用的ID,在这种情况下,我们只是不知道从哪个iframe Required元素加载(当我们也不知道框架的索引时就是这种情况)。
上述问题的解决方案是,我们必须找到通过其加载元素的IFRAME的索引,然后需要通过索引切换到IFRAME。
以下是使用以下代码片段查找加载元素的帧的索引的步骤
步骤1) WebDriver driver = new FirefoxDriver(); driver.get(“http://www.itxiaonv.com/test/guru99home/”); driver.manage().window().maximize();
- 初始化Firefox驱动程序。
- 导航到包含iframe的“guru99”站点。
- 已最大化窗口。
步骤2) int size = driver.findElements(By.tagName(“iframe”)).size();
- 上面的代码使用标记名‘iframe’查找页面中存在的iframe总数。
步骤3)
目标为 这一步将是找出iframe的索引。 for(int i=0; i<=size; i++){ driver.switchTo().frame(i); int total=driver.findElements(By.xpath(“html/body/a/img”)).size(); System.out.println(total); driver.switchTo().defaultContent(); }
上面的“forloop”迭代页面中的所有iframe,如果找到我们需要的iframe,则输出‘1’,否则返回‘0’。
以下是步骤3之前的完整代码: public class IndexOfIframe { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); driver.get(“http://www.itxiaonv.com/test/guru99home/”);
driver.manage().window().maximize(); //driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS); int size = driver.findElements(By.tagName(“iframe”)).size(); for(int i=0; i<=size; i++){ driver.switchTo().frame(i); int total=driver.findElements(By.xpath(“html/body/a/img”)).size(); System.out.println(total); driver.switchTo().defaultContent();}}}
执行此程序,输出将如下所示:
输出: 1 0 0 0
0 0
验证输出,可以找到0和1的序列。
- 无论在输出中找到‘1’,它都是加载元素的帧的索引。
- 因为IFRAME的索引以“0”开头,如果在1中找到1 ST 位置,则索引为0。
- 如果在%3中找到%1位置,索引为2。
一旦找到索引,我们就可以注释掉for循环。 步骤4) driver.switchTo().frame(0);
- 一旦找到元素的索引,就可以使用上面的命令切换框架。
步骤5) driver.findElement(By.xpath(“html/body/a/img”)).click();
- 上面的代码将单击iframe或iframe中的元素。
因此,完整的代码如下所示: public class SwitchToframe { public static void main(String[] args) throws NoSuchElementException{ WebDriver driver = new FirefoxDriver(); driver.get(“http://www.itxiaonv.com/test/guru99home/”);
driver.manage().window().maximize(); //int size = driver.findElements(By.tagName(“iframe”)).size();
/*for(int i=0; i<=size; i++){
driver.switchTo().frame(i);
int total=driver.findElements(By.xpath("html/body/a/img")).size();
System.out.println(total);
driver.switchTo().defaultContent(); //switching back from the iframe
}*/
//Commented the code for finding the index of the element
driver.switchTo().frame(0); //Switching to the frame
System.out.println("We are switched to the iframe*");
driver.findElement(By.xpath("html/body/a/img")).click();
//Clicking the element in line with Advertisement
System.out.println("*We are done*");
}
}
输出: 浏览器导航到包含上述IFRAME的页面,然后单击IFRAME。 让我们假设有两个框架,一个在另一个内部,如下图所示,我们的要求是打印外部框架和内部框架中的文本。在嵌套框架的情况下,
- 首先,我们必须通过索引或IFRAME的ID切换到外层框架
- 一旦我们切换到外部框架,我们就可以找到外部框架内部的IFRAME总数,并且
- 我们可以通过任何已知的方法切换到内框。
在退出框架时,我们必须按照进入框架的顺序,先从内部框架,再从外部框架退出。
上述嵌套框架的HTML代码如下所示。
上面的HTML代码清楚地解释了另一个IFRAME标记中的IFRAME标记(以绿色突出显示),表明存在嵌套的IFRAME。
以下是切换到外框并在外框上打印文本的步骤:
步骤1)
WebDriver driver=new FirefoxDriver();
driver.get("Url");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
int size = driver.findElements(By.tagName("iframe")).size();
System.out.println("Total Frames --" + size);
// prints the total number of frames
driver.switchTo().frame(0); // Switching the Outer Frame
System.out.println (driver.findElement(By.xpath("xpath of the outer element ")).getText());
- 切换到外框。
- 打印外部框架上的文本。
一旦我们切换到外框,我们就应该知道外框内是否有内框
步骤2) size = driver.findElements(By.tagName(“iframe”)).size(); // prints the total number of frames inside outer frame
System.out.println(“Total Frames –” + size);
- 查找外部框架内的IFRAME总数。
- 如果找到大小为‘0’,则框架内没有内部框架。
步骤3) driver.switchTo().frame(0); // Switching to innerframe System.out.println(driver.findElement(By.xpath(“xpath of the inner element”)).getText());
- 切换到内框
- 打印内部框架上的文本。
以下是完整的代码: public class FramesInsideFrames { public static void main(String[] args) { WebDriver driver=new FirefoxDriver(); driver.get(“Url”); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS); int size = driver.findElements(By.tagName(“iframe”)).size(); System.out.println(“Total Frames –” + size); // prints the total number of frames driver.switchTo().frame(0); // Switching the Outer Frame
System.out.println (driver.findElement(By.xpath(“xpath of the outer element”)).getText()); //Printing the text in outer frame size = driver.findElements(By.tagName(“iframe”)).size(); // prints the total number of frames inside outer frame
System.out.println(“Total Frames –” + size); driver.switchTo().frame(0); // Switching to innerframe System.out.println(driver.findElement(By.xpath(“xpath of the inner element”)).getText());
//Printing the text in inner frame
driver.switchTo().defaultContent();
}
}
输出 :上述代码的输出将打印内框和外框中的文本。