本节知识点:

多层框架或窗口的定位:

  • switch_to_frame()
  • switch_to_window()

智能等待:

  • implicitly_wait()

对于一个现代的web应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一个难题。

有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame中,seelnium  webdriver 提供了一个switch_to_frame方法,可以很轻松的来解决这个问题。

frame.html

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>frame</title>
<script type="text/javascript" async=""
src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />
<script type="text/javascript">
$(document).ready(function(){
});
</script>
</head>
<body>
<div class="row-fluid">
<div class="span10 well">
<h3>frame</h3>
<iframe id="f1" src="inner.html" width="800",
height="600"></iframe>
</div>
</div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>

inner.html

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>inner</title>
</head>
<body>
<div class="row-fluid">
<div class="span6 well">
<h3>inner</h3>
<iframe id="f2" src="http://www.baidu.com" width="700"
height="500"></iframe>
<a href="javascript:alert('watir-webdriver better than
selenium webdriver;')">click</a>
</div>
</div>
</body>
</html>

frame.html 中嵌套inner.html ,两个文件和我们的脚本文件放同一个目录下:

switch_to_frame()

操作上面页面,代码如下:

#coding=utf-8
from selenium import webdriver
import time
import os browser = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('frame.html')
browser.get(file_path) browser.implicitly_wait(30)
#先找到到ifrome1(id = f1)
browser.switch_to_frame("f1")
#再找到其下面的ifrome2(id =f2)
browser.switch_to_frame("f2") #下面就可以正常的操作元素了
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
time.sleep(3)

browser.quit()

driver.switch_to_window()

有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switch_to_window

用法与switch_to_frame 相同:

driver.switch_to_window("windowName")

implicitly_wait()

细心的话会发现上面的例子中有browser.implicitly_wait(30),它的用法应该比time.sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。

文档解释:

selenium.webdriver.remote.webdriver.implicitly_wait(time_to_wait)

隐式地等待一个无素被发现或一个命令完成;这个方法每次会话只需要调用一次

time_to_wait: 等待时间

用法:

driver.implicitly_wait(30)

最新文章

  1. JavaScript多文件下载
  2. C#实现微信公众号群发消息(解决一天只能发一次的限制)
  3. oop第二章1知识点汇总
  4. 如何借助浏览器Console使用Js进行定位和操作元素
  5. 【转】MySql数据库--mysql_real_escape_string()函数
  6. IIS Express 的 applicationhost.config配置文件
  7. 我的2011年总结--大明zeroson程序猿一周年总结
  8. Xcode-之Alcatraz
  9. 隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat
  10. css左右布局的几种实现方式和优缺点
  11. sql server 索引阐述系列四 表的B-Tree组织
  12. http无状态协议,cookie和session详解(一)
  13. 检索 COM 类工厂中 CLSID 为 {91493441-5A91-11CF-8700-00AA0060263B} 的组件失败
  14. Diango之通过form表单向服务端发送数据
  15. ABORT: Can&#39;t find command &#39;my_print_defaults&#39;.
  16. es6字符串新特性
  17. HDU 6057 Kanade&#39;s convolution
  18. 2016级算法第六次上机-E.Bamboo之吃我一拳
  19. 【POJ】3616 Milking Time(dp)
  20. PHP打印日期

热门文章

  1. 【动态规划技巧题】POJ2229-Sumsets
  2. Run-Time Check Failure #0
  3. ARM体系下的GCC内联汇编
  4. ScheduledExecutorService run方法要加入try catch
  5. 【mysql】更新“”空字符串为NULL
  6. postgres10配置huge_pages
  7. [转]使用VS2010的Database 项目模板统一管理数据库对象
  8. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.7.Oracle 11G R2 RAC修改public网络IP
  9. linux中断流程详解
  10. JS前端下载文本文件小技巧:1、download属性;2、借助Blob转换成二进制下载