在 web ui 自动化测试中,frame 一直是令人头痛的问题,就像上班必须挤公车坐地铁一般,
frame 的问题总是令人气闷纠结为之黯然神伤。
以前在使用 Selenium1 的时候,frame 也是颇为棘手的一个问题。不但要照本宣科的进行
一系列的设置,而且在进行实际代码编写的过程中会遇到各种奇奇怪怪的问题。 frame 就像
中国男足的后防线,问题多多难以解决。
selenium webdriver 处理 frame 比较简单,这点比某些测试工具要先进一些,令人身心愉
悦。
以下面的 html 代码为例,我们看一下如何定位 frame 上的元素。
frame.html
<html>
<head><title>frame</title></head>
<body>
<div class="row-fluid"><div class="span10 well"><h3>frame</h3><iframe id="f1" src=" part1 .html" width="800",height="600"></iframe></div></div></body></html>
part1.htm<html>
<head><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></div></div></body></html>
switch_to 方法会 new1个 TargetLocator 对象,使用该对象的 frame 方法可以将当前识别
的”主体”移动到需要定位的 frame 上去。
from selenium import webdriver
import os,time
objDriver = webdriver.Chrome ()
#相对路径(与Python文件在同一个目录下)
frame_file = 'file://"+ os.getcwd() + '/frame.html'))
objDriver.get(file_path)
objDriver.implicitly_wait(30)
#先找到到ifrome1(id = f1)
objDriver.switch_to_frame("f1")
#再找到其下面的ifrome2(id =f2)
objDriver.switch_to_frame("f2")
#操作f2中的控件
objDriver.find_element_by_id("kw").send_keys("selenium")
time.sleep(5)
objDriver.quit()
webdriver 的 frame 处理方式让人感觉那个不痛越来越轻松,这点进步值得肯定。
备注:
browser.implicitly_wait()的用法应该比time.sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
driver.switch_to_window()的用法与switch_to_frame 相同,只是switch_to_window()不是对嵌套的框架定位,而是窗口的定位。