zoukankan      html  css  js  c++  java
  • frame/iframe多表单切换

    应用场景:

    在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
     
    frame.html
     1 <html>
     2 <head>
     3 <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.mincss" rel="stylesheet" />
     4     <script type="text/javascript">$(document).ready(function(){});</script>
     5 </head>
     6 <body>
     7     <div class="row-fluid">
     8         <div class="span10 well">
     9             <h3>frame</h3>
    10                 <iframe id="if" name="nf" src="http://www.baidu.com" width="1600" height="800"></iframe>
    11         </div>
    12     </div>
    13 </body>
    14     <script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
    15 </html>

    在上面的html代码中,我通过iframe表单嵌入一个百度页面,用浏览器打开后如图所示:

    这时候直接定位页面上的百度输入框一定会报错:找不到元素。因此可以使用switch_to.frame()先找到frame.html中的

     1 #导包
     2 from selenium import webdriver
     3 from time import sleep
     4 #定义浏览器句柄
     5 driver=webdriver.Chrome()
     6 #打开本地frame.html
     7 url="file:///C:/Users/Charseki/Desktop/Web%E8%87%AA%E5%8A%A8%E5%8C%96/iframe%E5%A4%9A%E8%A1%A8%E5%8D%95%E5%88%87%E6%8D%A2/frame.html"
     8 driver.get(url)
     9 #窗口最大化
    10 driver.maximize_window()
    11 #直接去拿百度输入框元素
    12 #driver.find_element_by_xpath('//input[@id="kw"]')
    13 #发现报错,因为元素在iframe表单里面
    14 #正确的方法:进入到iframe表单,再去获取百度输入框元素
    15 driver.switch_to.frame(driver.find_element_by_xpath('//iframe[contains(@src,"www.baidu.com")]'))
    16 driver.find_element_by_xpath('//input[@id="kw"]').send_keys("可以操作元素了")
    17 #点击“百度一下”按钮
    18 driver.find_element_by_xpath('//input[@id="su"]').click()
    19 sleep(3)
    20 driver.quit()

     switch_to.frame()默认可以直接取表单的id或name属性。如果iframe没有可以用的id和name属性,则可以通过下面的方式进行定位。

    1 #先通过xpath定位到iframe
    2 xf=driver.find_element_by_xpath('//*[@class="if"]')
    3 #再将定位对象传给switch_to.frame()方法
    4 driver.switch_to.frame(xf)
    5 ......
    6 driver.switch_to.parent_frame()

    如果完成了在当前表单上的操作,则可以通过switch_to.parent_frame()方法跳出当前一级表单。该方法默认对应于离它最近的switch_to.frame()方法。除此之外,在进入多级表单的情况下,还可以通过switch_to.default_content()跳回最外层的页面。

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------
    Talk is cheap,show me the code.
  • 相关阅读:
    结对项目——自动生成小学四则运算题目
    个人项目作业
    自我介绍+软工5问
    团队作业3--需求改进&系统设计
    团队作业2-需求规格说明书
    团队项目-第一周
    结对项目:四则运算表达式生成程序
    个人项目作业--WC的实现
    自我介绍+软工五问
    团队作业3-需求改进&系统设计
  • 原文地址:https://www.cnblogs.com/chenshengkai/p/11298020.html
Copyright © 2011-2022 走看看