多層框架或窗口定位:
- switch_to_frame()
- switch_to_window()
智能等待:
- implicitly_wait()
現在web應用中經常會遇到框架如(frame)或窗口(windows)的應用,這樣定位就比較難,有時定位一個元素,定位器沒有問題,但是就是定位不到,這時就需要檢查一下這個元素是否存在在一個frame中。
webdriver中switch_to_frame()就可以解決這個問題。
代碼1(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="innerhtml" 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>
代碼2(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中嵌套inner,兩個腳本放在同一個目錄下。
代碼如下:
#coding=utf-8
from selenium import webdriver
from time import sleep
import os
br= webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('frame.html')
br.get(file_path)br.implicitly_wait(30)
#先找到到iframe1(id = f1)
br.switch_to_frame("f1")
#再找到其下面的iframe2(id =f2)
br.switch_to_frame("f2")#下面就可以正常的操作元素了
br.find_element_by_id("kw").send_keys("selenium")
br.find_element_by_id("su").click()
sleep(1)br.quit()
按上面方式就可以定位到元素
switch_to_window()
?
有可能嵌套的不是框架,而是窗口,對窗口的方法:switch_to_window(),用法與switch_to_frame?相同:dr.switch_to_window("windowName")
?
br.implicitly_wait(30)
它可以在一個時間范圍內智能的等待。而slepp(2)是一個固定的時間。
文檔解釋:
selenium.webdriver.remote.webdriver.implicitly_wait(time_to_wait)
隱式地等待一個無素被發現或一個命令完成;這個方法每次會話只需要調用一次
time_to_wait:?等待時間
?
用法:driver.implicitly_wait(30)
?
?
?