自动化UI测试Selenium Webdriver如何处理iFrame

Selenium Webdriver中的iFrame是嵌入在另一个网页中的网页或内联框架,自动化UI测试Selenium Webdriver如何处理iFrame,或者嵌入在另一个 HTML 文档中的 HTML 文档。iframe 通常用于将来自其他来源的内容(如广告)添加到网页中。

Selenium Webdriver中的iFrame是嵌入在另一个网页中的网页或内联框架,自动化UI测试Selenium Webdriver如何处理iFrame,或者嵌入在另一个 HTML 文档中的 HTML 文档。iframe 通常用于将来自其他来源的内容(如广告)添加到网页中。iframe 是用 <iframe> 标签定义的。

自动化UI测试Selenium找到iframe

我们无法仅通过查看页面或检查 Firebug 来检测 iframe。观察下图,显示的广告是一个 Iframe,我们无法通过使用 Firebug 进行检查来定位或识别。所以问题是如何识别iframe?

自动化UI测试Selenium Webdriver如何处理iFrame
自动化UI测试Selenium Webdriver如何处理iFrame

我们可以使用下面给出的方法识别 Selenium 中的iframe:

  • 右键单击该元素,如果您找到“此框架”之类的选项,则它是 iframe。(请参阅上图)
  • 右键单击页面并单击“查看页面源代码”并使用“iframe”进行搜索,如果您可以找到任何带有“iframe”的标签名称,则表示该页面包含一个 iframe。

在上图中,您可以看到右键单击“此框架”选项可用,因此我们现在确定它是一个 iframe。

我们甚至可以使用以下代码段来识别 iframe 的总数。

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

如何使用 Web Driver 命令切换 iframe 中的元素:

基本上,我们可以使用 3 种方式在 Selenium 中切换元素和处理 iframe。

  • 按索引
  • 按名称或 ID
  • 按网络元素

按索引切换到iframe:

索引是 Selenium 中 iframe 处理的属性之一,我们可以通过它切换到它。

iframe 的索引以“0”开头。

假设如果page中有100个iframe,我们可以通过索引切换到Selenium中的frame。

  • driver.switchTo().frame(0);
  • driver.switchTo().frame(1);

按名称或 ID 切换到框架:

Name 和 ID 是 Selenium 中处理 iframe 的属性,通过它们我们可以切换到 iframe。

  • driver.switchTo().frame(“iframe1”);
  • driver.switchTo().frame(“元素的id”);

通过ID切换到iframe的例子:

让我们举一个例子,在下图中显示的 Selenium 中切换iframe。我们的要求是点击 iframe。

我们可以通过以下 URL 访问此 iframe: https://jhrs.com

使用 Selenium WebDriver 切换到 iframe
自动化UI测试Selenium Webdriver如何处理iFrame

由于它是一个 iframe ,因此无法通过XPath直接单击iframe。首先,我们必须切换到框架,然后我们可以使用 xpath 单击。

第1步)

WebDriver driver = new FirefoxDriver();

driver.get("https://jhrs.com/");

driver.manage().window().maximize();
  • 我们初始化 Firefox 驱动程序。
  • 导航到包含 iframe 的“jhrs.com”站点。
  • 最大化窗口。

第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(); //导航到浏览器
	    driver.get("https://jhrs.com/"); 
	       //导航到包含 iframe 的页面
	       driver.manage().window().maximize();
	       driver.switchTo().frame("a077aa5e"); //switching the frame by ID
			System.out.println("********我们切换到iframe*******");
     		driver.findElement(By.xpath("html/body/a/img")).click();
  		    //Clicks the iframe
  			System.out.println("*********已经搞定***************");
      }
}

输出:

浏览器导航到包含上述 iframe 的页面并单击 iframe。

通过 Web Element 切换到框架:

我们甚至可以使用 web element 切换到 iframe。

  • driver.switchTo().frame(WebElement);

如何切换回主框架

我们必须从 iframe 中走出来。

要移回父框架,您可以使用 switchTo().parentFrame() 或者如果您想返回主(或大多数父)框架,您可以使用 switchTo().defaultContent();

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

如何切换框架,如果我们不能使用ID或Web Element切换:

假设页面中有 100 个框架,并且没有可用的 ID,在这种情况下,我们只是不知道从哪个 iframe 加载所需的元素(当我们不知道框架的索引时就是这种情况还)。

上述问题的解决方案是,我们必须找到加载元素所通过的 iframe 的索引,然后我们需要通过索引切换到 iframe。

以下是使用以下代码段查找加载元素的框架索引的步骤

第1步)

WebDriver driver = new FirefoxDriver();
driver.get("https://jhrs.com/");
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("https://jhrs.com");  
	    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”,它都是加载元素的 Frame 的索引。
  • 由于iframe的指标与“0”开始,如果你在1米找到1的地方,那么指数为0。
  • 如果你发现1 3到位,指数为2。

一旦找到索引,我们就可以注释掉 for 循环。
第四步)

driver.switchTo().frame(0);
  • 找到元素的索引后,您可以使用上述命令切换iframe。
  • driver.switchTo().frame(从步骤3中找到的索引);

步骤 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("https://jhrs.com/");  
	    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(); //返回主窗体
	 }*/
	            
		//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("*********打完收工***************");
	        }
	    }

输出:
浏览器导航到包含上述 iframe 的页面并点击 iframe。

嵌套 iframe 的概念(iframe 内的 iframe):

假设有两个iframe,如下图所示,一个在另一个iframe中,我们的要求是在外iframe和内 iframe 中打印文本。
在嵌套框架的情况下,

  • 首先我们必须通过 iframe 的 Index 或 ID 切换到外部iframe
  • 一旦我们切换到外iframe,我们就可以找到外iframe内的 iframe 总数,并且
  • 我们可以通过任何已知的方法切换到内部 iframe。

在退出 iframe 时,我们必须按照我们从内部 iframe 进入它的相同顺序退出,然后是外部iframe 。

Selenium WebDriver 中的嵌套框架
自动化UI测试Selenium Webdriver如何处理iFrame

上述嵌套 iframe 的 Html 代码如下所示。

Selenium WebDriver 中的嵌套 iFrame
自动化UI测试Selenium Webdriver如何处理iFrame

上面的 HTML 代码清楚地解释了另一个 iframe 嵌套中的 iframe 标记(以绿色突出显示),表明存在嵌套的 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());
  • 切换到外部iframe。
  • 在外部 iframe 上打印文本。

一旦我们切换到外部 iframe,我们应该知道外部 iframe 内是否存在任何内 部 iframe

第2步)

size = driver.findElements(By.tagName("iframe")).size();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • 查找外部 iframe 内的 iframe 总数。
  • 如果发现大小为“0”,则 iframe内没有内部 iframe。

步骤 3)

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
  • 切换到内部 iframe
  • 在内部 iframe上打印文本。

这是完整的代码:

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
	    // prints the total number of frames inside outer frame     

输出
上述代码的输出将在内部 iframe 和外部 iframe 中打印文本。

User Review
0 (0 votes)

猜你喜欢

本站最新优惠

Namesilo优惠:新用户省 $1 域名注册-优惠码:45D%UYTcxYuCloZ 国外最便宜域名!点击了解更多

特别优惠:免费赠送 $100 Vultr主机-限时优惠!英文站必备海外服务器!点击了解更多

VPS优惠:搬瓦工优惠码:BWH3OGRI2BMW 最高省5.83%打开外面世界的一款主机点击了解更多

Paxful上购买比特币

【jhrs.com】原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2021/44492.html

扫码注册Paxful账户开始交易比特币,全球300多种支付方式任意选,国内需使用外网工具打开

必备的解锁外网工具,畅访谷歌等国外网站,几包烟钱让你无须再找免费梯

发表评论

登录后才能评论
Bluehost(蓝色主机),好多人喜欢的跨境电商外贸主机,值得拥有;托管VPS低至$20/月,年底啦,大优惠来啦
$20/月
直达官网