如何在基于Selenium的测试自动化中处理Iframes

778 阅读4分钟

在基于Selenium的测试自动化中处理Iframes

iFrame通常被称为内联框架,它只是一个嵌入另一个HTML文档的HTML文档。

iFrame通常被称为内联框架,它只不过是将一个HTML文档嵌入到另一个HTML文档中。iFrame是将一个网页嵌入到另一个网页中的一种更简单的方式。

iFrame基本上是HTML5中使用的一个标签,如<iframe></iframe>

需要强调的是,Selenium中的iFrame和Frame是有区别的。iFrame用于嵌入来自外部的内容,而Frame则是利用开发者用frameset标签将网页垂直或水平分割。

如何识别网页上的Iframes?

观察网页并识别iframes是绝对不可能的。那么问题来了,如何识别一个元素是否在一个iframe上?你只需右键单击可疑的元素,并检查你是否得到一个选项,如。这个框架"、"查看框架源 "或 "重新加载框架"。右键点击一个元素后,如果你得到一个与框架有关的选项,这仅仅意味着,你试图定位的元素是在一个iframe上排列的。

可能有一种可能性,即一个父网页嵌入了多个iframe。在这种情况下,你可以打开浏览器的开发工具,通过在开发工具的 "Elements"标签下搜索关键词 "iframe"来检查需要的iframe。通过基于Selenium的测试自动化,你也可以通过下面的代码片断获得特定网页上的iframe的数量。

Java

int iFrameSize = driver.findElements(By.tagName("iframe")).size();

如何将Selenium Webdriver切换到Iframe上的元素?

为了在Selenium中切换元素和处理网页iframes,Selenium框架提供了3种常见的方法。

  • 通过索引切换到iFrame。 当一个网页上有多个iframe时,可能会使用索引来切换到iframe。iframe的索引从0开始,索引随着嵌入的iframe的数量而增加。如果一个网页上有2个iframe,你可以使用下面的代码片段在Selenium .NET中切换到iframe。

Java

driver.switchTo().frame(0);
driver.switchTo().frame(1);
  • 通过名称或ID切换到iFrame。 名称和ID属性是使用Selenium切换到iframe的最常见方式。你可以很容易地从浏览器开发工具中获取iframe的名称或ID。

要使用名称或ID定位iframe上的目标元素,可以使用下面的代码片段。

Java

driver.switchTo().frame("iFrameID");
OR
driver.switchTo().frame("iFrameName");
  • 通过网络元素切换到iFrame。 另一种使用Selenium切换到iframe的方法是在switchTo() 命令中使用Web元素。这里的想法是从浏览器开发工具中获取iframe元素并将其传递给switch方法。要使用网络元素在iframe上定位目标元素,可以使用下面的代码片段。

Java

WebElement iframeElement = driver.findElement(By.id("webElementID"));    
driver.switchTo().frame(iframeElement);

如何将Selenium Webdriver切换回主框架?

不是所有的网页元素都能在iframe上对齐。如前所述,iframe主要用于显示外部应用程序、视频或广告。作为Web测试自动化的一部分,你可能会发现这样一种情况:所有的主要操作都是在父网页上进行的,但是要想点击另一个特定的元素,你必须切换到目标框架,然后切换回父框架,这样Web驱动就可以继续在主网页上操作。

为了将Selenium Webdriver切换回主框架,Selenium提供了两种内置的方法。

  1. parentFrame()
  2. defaultContent()

代码片段。

Java

driver.switchTo().parentFrame();
driver.switchTo().defaultContent();

当Iframe ID、名称和Web元素不工作或不存在时切换Iframe

常见的问题是:当iframe ID、名称和Web元素不工作或不存在时,如何在Selenium中处理iframes?

让我们想象一下,在一个网页上嵌入了100个iframe,而且没有iframe的ID或名称可用。在有100个iframe的情况下,怀疑iframe 的索引也是一项复杂的任务。因此,我们必须采取一些策略,可以识别目标元素的iframe。

作为上述情况的解决方案,重要的是获取目标元素正在加载的iframe 的索引,然后我们可以使用其索引切换到iframe。让我们来看看下面的脚本和代码演练,以实现此类场景的自动化。

脚本

public class SeleniumIframe {
public static void main(String[] args) {
 
    WebDriver driver = new ChromeDriver();
    driver.get("URL"); 
    driver.manage().window().maximize();

Java

int iFrameSize = driver.findElements(By.tagName("iframe")).size();

脚本

for(int i=0; i<=iFrameSize; i++){
  driver.switchTo().frame(i);
  int elementSize = driver.findElements(By.xpath("html/body/a/advertVideo")).size();
  System.out.println(elementSize);
    driver.switchTo().defaultContent();
  }
  }
}

代码演练:

由于在一个网页上嵌入了多个iframe,我们使用了一个tagNameSelenium定位器来获得iframe的总数。一旦我们知道了实际的iframe数量,我们必须开始一个循环,直到iframe 。在一个运行的循环中,我们将切换到网页上的每个iframe,并获取目标元素的大小。每当循环被执行到正确的iframe时,我们会得到元素的大小为1,否则网页元素的大小将保持为0。

这样,我们就可以提取iframe 。一旦我们得到iframe 的确切索引,我们就可以对这个循环进行注释,以避免对网页上嵌入的每个iframe进行运行。

在Selenium测试自动化中处理嵌套的Iframes

让我们假设目标元素是在一个与另一个iframe对齐的iframe上,这种结构被称为嵌套的iframes。

在Selenium测试自动化中,我们首先要与iframe1交互,然后与iframe2交互,对目标网页元素进行操作。下面是嵌套iframe的HTML结构,其中第二个iframe标签被嵌入到第一个iframe标签中。

HTML

<div class="iframe">
<div style="overclow:auto;">
  <div id="iframewrapper" class="iframewrapper">
<iframe id="iframeResult" frameborder="0">
<html>
  <head>
  <body>
<iframe width="200" height="200" src="demo_iframe.htm">
</body>
</head>
</html>

在嵌套iframes 的测试自动化场景中,需要遵循的任务步骤是。

  • 首先,我们需要切换到外部框架,可以通过名称、ID或索引来切换
  • 在切换到外部iframe ,我们可以在selenium中获取内部iframes的数量。
  • 然后,我们可以通过任何可用的类型,即ID、名称或索引,切换到内层框架。
  • 最后,我们可以与目标元素进行交互。

总结

了解iframes的工作原理将有助于准确定位我们想用Selenium自动化测试的正确的网络元素。我们已经讨论了在Selenium测试自动化中使用iframe的各种方法。

经Ramit Dhamija许可发表于DZone。点击这里查看原文。