2.2 如何在Selenium Webdriver-switchTo()中处理iFrame

Selenium WebDriver中的IFRAME

Selenium WebDriver中的IFRAME 是嵌入到另一个网页或嵌入到另一个HTML文档中的HTML文档中的网页或内联框架。IFRAME使用< IFRAME >标签。

在本教程中,将了解-

  1. 如何识别IFRAME:
  2. 如何使用Web驱动程序命令切换iFrame中的元素:
  3. 嵌套框架(框架内的框架)的概念:

如何识别IFRAME

我们不能仅通过查看页面或检查Firebug来检测框架。

观察下面的图像,正在显示的广告是一个IFRAME,我们不能通过仅使用Firebug进行检查来定位或识别这一点。因此,问题是如何识别IFRAME?

How to identify the iframe using Selenium WebDriver 如何使用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

Switching to iframe using Selenium WebDriver
Switching to iframe using Selenium WebDriver

不可能通过直接单击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总数,并且
  • 我们可以通过任何已知的方法切换到内框。

在退出框架时,我们必须按照进入框架的顺序,先从内部框架,再从外部框架退出。 Nested Frames in Selenium WebDriver

上述嵌套框架的HTML代码如下所示。

Nested iFrames in Selenium WebDriver
Nested iFrames in Selenium WebDriver

上面的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();
    }
}

输出 :上述代码的输出将打印内框和外框中的文本。

IT赶路人

专注IT知识分享