• Selenium框架切换Selenium快速入门(七)


      上一篇说了窗口的切换,本篇说说框架的切换。

      切换框架:是指切换html中的iframe标签元素或者frame标签元素,注意,并不包括frameset

      以下是常用的方法:

    方法 说明
    WebDriver switchTo().frame(int index) 通过索引切换到指定的框架,若框架不存在,则抛出异常 NoSuchFrameException
    WebDriver switchTo().frame(String nameOrId) 通过框架的name或者id切换到指定的框架,若框架不存在,则抛出异常 NoSuchFrameException
    WebDriver switchTo().frame(WebElement frameElement) 通过元素定位切换到该框架。若元素不稳定,则抛出StaleElementReferenceException,若框架不存在,则抛出NoSuchFrameException
    WebDriver switchTo().parentFrame() 切换到父级框架,如果当前框架是最顶级,则不会切换。
    WebDriver switchTo().defaultContent() 返回到最顶级的主文档,官方还说了一种可能,就是返回第一个框架,但我暂时未找到这个例子。

      我们在html目录中增加四个html,分别为frame.html,frame1.html,frame2.html,frameset.html,代码如下

      frame.html 

    <html>
    <head> 
    <meta > 
    <title></title> 
    </head> 
    <body>
    <div>
    主页文本框:<input type="text" id="text1" value="" />
    </div>
    <div>
    <iframe src="frame1.html" id="frame1" name="frame1">
      <p>您的浏览器不支持  iframe 标签。</p>
    </iframe>
        </div>
        <div>
            <iframe src="frame2.html" id="frame2" name="frame2">
      <p>您的浏览器不支持  iframe 标签。</p>
    </iframe>
        </div>
    
    </body>
    </html>

      frame1.html

    <!DOCTYPE html>
    <html>
    <head> 
    <meta > 
    <title></title> 
    </head> 
    <body>
    <p>frame1文本框:<input id="text1" type="text" /></p>
    </body>
    </html>

      frame2.html

    <!DOCTYPE html>
    <html>
    <head> 
    <meta > 
    <title></title> 
    </head> 
    <body>
    
    <p>frame2文本框:<input id="text1" type="text" /></p>
    </body>
    </html>

      frameset.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta>
    <title>窗口切换</title>
    </head>
    <frameset rows="*,*" ,border="0" scrolling="no">
        <frame src="frame1.html" name="frame1" />
        <frame src="frame2.html" name="frame2" />
      
    </frameset>
    
    </html>

      以上的代码都很简单,都是常见的两种框架,iframe和frameset,建立四个html后,我们的项目结构是这样的

      

      我们先来测试下iframe,下面这段代码的效果是,按次序切换到框架2,框架1,主框架,并且切换的时候,找到框架中的文本框,输入文本

      需要注意的时,每次切换完,下次切换到其他框架时,都需要先切换到最顶端的主文档,即先调用switchTo().defaultContent(),否则会抛出异常。

           //得到WebDriver
             WebDriver driver=DriverHelper.CreateChromeDriver();
             
             //为何此处刷新该页,因为发现第一次加载时,并不确定能载入iframe的内容,刷新后,基本都能载入,后面将会讲到Selenium的“等待”
             driver.get("D:\\WorkSpace\\SeleniumTest\\html\\frame.html");
             Thread.sleep(1000);
             driver.get("D:\\WorkSpace\\SeleniumTest\\html\\frame.html");
             Thread.sleep(1000);
             
             //切换到框架2,找到文本框,输入“frame2”,首次运行,焦点默认在主文档
             driver.switchTo().frame(1);
             WebElement textFrame2=driver.findElement(By.id("text1"));
             textFrame2.sendKeys("frame2");
             
             Thread.sleep(1000);
             
             //切换到框架1,找到文本框狂,输入“frame1”
             //需要先切换到最顶端文档,否则会抛出异常,找不到该框架
             driver.switchTo().defaultContent();
             driver.switchTo().frame(0);
             WebElement textFrame1=driver.findElement(By.id("text1"));
             textFrame1.sendKeys("frame1");
             
             Thread.sleep(1000);
             
             //切换回最顶端文档,找到文本框,输入“main”
             driver.switchTo().defaultContent();
             WebElement textMain=driver.findElement(By.id("text1"));
             textMain.sendKeys("main");

      对于frameset.html,操作大同小异,大家可自行尝试,此处就不啰嗦。

        除了每次切换前,先调用switchTo().defaultContent()外,当第一次访问frame.html时,框架不一定加载成功,这个要引起我们的注意,实际上,这种情况经常出现,后面将会讲到如何避免这种情况的发生。

      最后给出本次代码执行的效果:

      

      

  • 相关阅读:
    MySQL 初识别语句,数据库、表、行的增删改查
    mysql如何从全备文件中恢复单个库或者单个表
    Shell 同步时间脚本
    app手机端连接tomcat电脑端服务器
    大于号转义符&gt;---小于号转义符&lt;
    轻松实现页面提交中
    重复提交问题(一)
    json
    ExtJs 6.0+快速入门,ext-bootstrap.js文件的分析,各版本API下载(一)
    ExtJS 6 如何引入Dashboard模版
  • 原文地址:https://www.cnblogs.com/devtester/p/8621471.html
Copyright © 2020-2023  润新知