元素的定位
瀏覽器控制
鼠標事件
鍵盤事件
獲取驗證







一、元素的定位
1.webdriver提供的8種頁面元素定位方法:
id/name/class name/tag name/link text/partial link text/xpath/css selector
其中python對應的8種方法:
find_element_by_id() 如: find_element_by_id("kw")
find_element_by_name() 如: find_element_by_name("wd")
find_element_by_class_name() 如: find_element_by_class_name("s_ipt")
find_element_by_tag_name() 如: find_element_by_tag_name("input")
find_element_by_link_text() 如:find_element_by_link_text(u"新聞")
find_element_by_partial_link_text() 如:find_element_by_partial_link_text(u"一個很長的")
find_element_by_xpath() 如: find_element_by_xpath(" .//*[@id='kw']")
find_element_by_css_selector() 如: find_element_by_css_selector("#kw")
注意:
a.python對中文支持不好,在對於有中文的地方加小寫u,作用是把中文字符串轉換成unicode編碼,如上面link_text(u"新聞")
b.xpath中如果不想指定標簽名,也可用(*)代替,
2.xpath定位:
2.1 絕對路徑定位:find_element_by_xpath("/html/body/div/div[2]/div/form/span/input")
2.2 利用元素屬性定位:find_element_by_xpath("//*/input[@id='kw']") //表示當前目錄
2.3 層級與屬性結合:find_element_by_xpath("//span[@class='bg s_pt']/input") /input表示父元素下的子元素
可以用這種方法,一層層網上,直到最外層<html>標簽
2.4 使用邏輯運算符:find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")
3.css定位 速度快於xpath
css常見語法:

例如:
通過.class定位的: find_element_by_css_selector(".intr")
通過#id定位的: find_element_by_css_selector("#firstname")
通過標簽名定位的: find_element_by_css_selector("input")
通過父子關系定位的:find_element_by_css_selector("div>input")
通過屬性定位: find_element_by_css_selector("input[type='submit']")
組合定位: find_element_by_css_selector(span.bg s_ipt>input.s_ipt)
//父標簽span對應class屬性為bg s_ipt的節點下的子標簽input且這個子標簽class屬性為s_ipt
二、瀏覽器控制
1.控制瀏覽器大小:set_window_size() 例如:driver.set_window_size(400,500)
maximize_window() 例如:driver.maximize_window() #無參數
2.瀏覽器后退、前進:back()-后退、farward()-前進
三、鼠標事件
ActionChains類提供的常用方法:
1.1 perform():執行ActionChains中存儲的所有行為,對整個事件進行提交
1.2 context_click(): 右擊
如:
from selenium.webdriver.common.action_chains import ActionChains
...
ActionChains(dr).context_click(docfile).perform()
1.3 double_click(): 雙擊
如:
from selenium.webdriver.common.action_chains import ActionChains
...
doubleClick=dr.find_element_by_id("xxx")
ActionChains(dr). double_Click(doubleClick).perform()
1.4 drag_and_drop(source,target): 拖動
如:
from selenium.webdriver.common.action_chains import ActionChains
...
dsource=dr.find_element_by_id("xxx") #拖動的源元素
dtarget=dr.find_element_by_id("xxx") #釋放的目標目標元素
ActionChains(dr).drag_and_drop(dsource,dtarget).perform()
1.5 move_to_element(): 鼠標懸停
如:
from selenium.webdriver.common.action_chains import ActionChains
...
above=dr.find_element_by_id("xxx")
ActionChains(dr).move_to_element(above).perform()
四、鍵盤事件
1.首先要導入鍵盤事件的包
from selenium.webdriver.common.keys importKeys
...
dr.get("http://www.baidu.com")
#輸入內容
dr.find_element_by_id("kw").send_keys("seleniumm")
#刪除輸入內容的最后一個字母,
dr.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#輸入:空格+教程
dr.find_element_by_id("kw").send_keys(Keys.SPACE)
dr.find_element_by_id("kw").send_keys(u"教程")
#ctrl+a全選輸入框內容
dr.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x剪貼輸入框內容
dr.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
#ctrl+v剪貼輸入框內容
dr.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
#回車鍵操作
dr.find_element_by_id("su").send_keys(Keys.ENTER)
dr.close()
常用的鍵盤操作整理:
send_keys(Keys.BACK_SPACE) #刪除鍵BackSpace
send_keys(Keys.SPACE) #空格鍵Space
send_keys(Keys.TAB) #制表鍵Tab
send_keys(Keys.ESCAPE) #回退鍵Esc
send_keys(Keys.ENTER) #回車鍵Enter
send_keys(Keys.CONTROL,'a') #Ctrl+a
send_keys(Keys.CONTROL,'c') #Ctrl+c
send_keys(Keys.CONTROL,'x') #Ctrl+x
send_keys(Keys.CONTROL,'v') #Ctrl+x
send_keys(Keys.F1) #F1,類似的有F1-F12
五、獲取驗證
1.通常用到的驗證信息有:title、URL、text
dr.titledr.current_urldr.find_element_by_id("xx").text
六、設置等待
1.顯示等待:等待某個條件成立時,繼續執行,否則達到最大等待時間后拋出異常:TimeoutException,顯示等待是針對當前要定位元素使用
WebDriverWait(driver, timeout,poll_frequency,ignored_exceptions=None).until(method,message)示例:WebDriverWait(dr,5,0.5,None).until(expected_conditions.presence_of_element_located((By.ID,"kw1")),message='test')解釋:A.WebDriverWait():在設置時間內,默認間隔一段時間檢測一次當前頁面元素是否存在,若超過當前指定時間檢測不到則拋出異常;B.driver:webdriver的瀏覽器驅動,ie、firefox、chromeaC.timeout:最長超時時間,以秒為單位D.poll_frequency:休眠間隔時間-步長,默認0.5秒E.ignored_exceptions:超時后異常信息,默認拋出NoSuchElementException異常F.until(method,message): 調用該方法提供的驅動作為一個參數,直到返回值為TrueG.until_not(method,message):調用該方法提供的驅動作為一個參數,直到返回值為FalseH.expected_conditions類提供的預期條件實現有:title_is:判斷標題是否是xxtitle_contains:判斷標題是否包含xxpresence_of_element_located:元素是否存在
visibility_of_element_located:元素是否存在
visibility_of:是否可見
presence_of_all_elements_located:判斷一組元素是否存在
text_to_be_present_in_element:判斷元素是否有xx文本信息
text_to_be_present_in_element_value:判斷元素值是否有xx文本信息
frame_to_be_available_and_switch_to_it:表單是否可見,並切換到該表單
invisibility_of_element_located:判斷元素是否隱藏element_to_be_clickable:判斷元素是否點擊,它處於可見和啟動狀態staleness_of:等到一個元素不再依附於DOMelement_to_be_selected:被選中的元素element_located_to_be_selected:一個期望的元素位於被選中element_selection_state_to_be:一個期望檢查如果給定元素被選中element_located_selection_state_to_be:期望找到一個元素並檢查是否是選擇狀態alert_is_present:預期一個警告信息
2.隱式等待:通過一定的時長等待頁面所有元素加載完成,哪個元素超出設置時長沒被加載就拋出異常NoSuchElementException,隱式等待是針對所有元素的
implicitly_wait(5) #默認單位為秒
示例:
dr.implicitly_wait(5)
七、sleep休眠 python中強制的程序等待
from time import sleep
sleep(4) #默認單位秒,設置小於1秒的時間可以用小數點如sleep(0.6)
八、定位一組元素,類似與1中定位單個元素方法
find_elements_by_id() 如: find_elements_by_id("kw")
find_elements_by_name() 如: find_elements_by_name("wd")
find_elements_by_class_name() 如: find_elements_by_class_name("s_ipt")
find_elements_by_tag_name() 如: find_elements_by_tag_name("input")
find_elements_by_link_text() 如:find_elements_by_link_text(u"新聞")
find_elements_by_partial_link_text() 如:find_elements_by_partial_link_text(u"一個很長的")
find_elements_by_xpath() 如: find_elements_by_xpath(" .//*[@id='kw']")
find_elements_by_css_selector() 如: find_elements_by_css_selector("#kw")
使用場景:
a.批量操作對象,如選中頁面上所有復選框
b.先獲取一組對象,再在這組對象里定位需要的的一些對象,如定位所有復選框,然后選擇最后一個
例如:代碼如下
checkbox.htm頁面:
<styletype="text/css">
body{font-size:12px; font-family:Tahoma;}
.checkbox{vertical-align:middle; margin-top:0;}
</style>
<body>
<inputclass="checkbox"type="checkbox"/>元旦
<inputtype="checkbox"name="test"/>聖誕節
<inputtype="checkbox"name="test"/>股市
<inputtype="checkbox"name="test"/>阿凡達
<inputtype="checkbox"name="test"/>十月圍城
<inputtype="checkbox"name="test"/>水價上調
<inputtype="button"value="檢測"id="btn"/>
</body>
python代碼:
- from selenium import webdriver
dr=webdriver.Firefox()
dr.get("D:\\workspace\\pySelenium\\resources\\checkbox.htm")
#使用tagname方式選擇頁面上所有tagname為input的元素
select_tagname=dr.find_elements_by_tag_name("input")
#使用xpath方式選擇頁面上所有tagname為input的元素
select_xpath=dr.find_elements_by_xpath("//input[@type='checkbox']")
#使用css_select方式選擇頁面上所有tagname為input的元素
select_css=dr.find_elements_by_css_selector('input[type=checkbox]')
for i in select_tagname:
#循環對每個input元素進行點擊選中操作
if i.get_attribute("type")=='checkbox':
i.click()
for j in select_xpath:
#循環對每個input元素進行點擊取消操作
j.click()
for k in select_css:
#循環對每個input元素進行點擊選中操作
k.click()
#打印出checkbox的個數
print'----頁面上checkbox的個數為:',len(select_css)
#使用pop()獲取1組元素的第幾個元素
select_css.pop(0).click()#第一個
select_css.pop(1).click()#第二個
select_css.pop().click()#最后一個
select_css.pop(-1).click()#最后一個
select_css.pop(-2).click()#倒數第二個
dr.close()
備注:pop():選擇一組元素
中的某一個,要注意的是:pop()和pop(-1)都表示最后一個元素
九、
多表單切換(對於有frame嵌套表單的操作)
frame頁面:
<html>
<body>
<frameset>
<h3>frame</h3>
<iframeid='frameid'name='frameName'width="800"height="500"src="http://www.baidu.com"/>
</frameset>
</body>
</html>
python代碼:
dr.get("D:\\workspace\\pySelenium\\resources\\frame.htm")
dr.switch_to_frame("frameid")#通過frame的id進入iframe
#dr.switch_to_frame("frameName") #通過frame的name進入iframe
#下面可以對frame進行操作了
dr.find_element_by_id("kw").send_keys("selenium")
dr.find_element_by_id("su").click()
dr.switch_to_default_content()#退出當前frame返回上一層
備注:1.
switch_to_frame()默認直接取表單的id或者name屬性來切換
2.完成當前frame表單操作后,可以通過switch_to_default_content()方法返回上一層表單,即離的最近的switch_to_frame()方法
3.對於frame中沒有id和name屬性的通過下面方式進入frame(定位到frame以頁面對象傳入)
python代碼:
dr.get("D:\\workspace\\pySelenium\\resources\\frame.htm")
#定位到frame頁面元素
framepath=dr.find_element_by_class_name("frameClassname")
dr.switch_to_frame(framepath)#通過frame頁面對象進入iframe
#下面可以對frame進行操作了
dr.find_element_by_id("kw").send_keys("selenium")
dr.find_element_by_id("su").click()
dr.switch_to_default_content()#退出當前frame返回上一層
十、多窗口切換
selenium-webdriver中使用switch_to_window()方法來切換任意窗口,常用方法有
driver.current_window_handle #獲取當前窗口句柄
driver.window_handles #返回所有窗口句柄到當前會話
driver.switch_to_window() #進入窗口,用於切換不同窗口
python代碼:
dr.get("http://www.baidu.com")
current_handle=dr.current_window_handle #獲取百度首頁窗口句柄
index_login=dr.find_element_by_xpath("//div[@id='u1']/a[@class='lb']")#獲取登錄按鈕對象
index_login.click()#點擊登錄
dr.implicitly_wait(5)
dr.find_element_by_class_name("pass-reglink").click()#點擊立即注冊按鈕
all_handles=dr.window_handles #獲取所有打開窗口句柄
for handle in all_handles:
if handle==current_handle:
dr.switch_to_window(handle)
'''
...對首頁窗口進行操作
'''
print'----首頁頁面title:',dr.title
for handle in all_handles:
if handle!=current_handle:
dr.switch_to_window(handle)
'''
...對注冊窗口進行操作
'''
print'----注冊頁面title:',dr.title
十一、警告框處理
webdriver中處理js生成的alert、confirm、prompt處理方法是:使用switch_to_alert()定位到alert/confirm/prompt,然后使用text、accept、dismiss、send_keys來根據需要操作。
text:返回alert、confirm、prompt中的文字信息
accept:點擊確認按鈕
dismiss:點擊取消按鈕
send_keys:在alert、confirm有對話框時輸入值
python代碼:
dr.get("http://www.baidu.com")
set_link=dr.find_element_by_xpath("//div[@id='u1']/a[@class='pf']")#找到設置鏈接元素
ActionChains(dr).move_to_element(set_link).perform()#鼠標移動到設置上
dr.find_element_by_xpath("//a[@class='setpref']").click()#點擊搜索設置鏈接
time.sleep(3)
#加等待時間 等按鈕可用,否則會報錯save_set=dr.find_element_by_css_selector("#gxszButton > a.prefpanelgo")#獲取保存設置按鈕
save_set.click()#點擊保存設置按鈕
alert=dr.switch_to_alert()
#進入alertprint'----彈出alert中內容為:',alert.text #打印對話框里的文字內容
alert.accept()#對話框里點擊alert中確定按鈕
#alert.dismiss() #對話框里點擊取消按鈕
#alert.send_keys("對話框中輸入的內容") #在對話框里輸入內容
十二、上傳文件
分2種:普通上傳、插件上傳
普通上傳:將本地文件的路徑作為一個值放到input標簽中,通過form表單提交時,將值傳給服務器中去
插件上傳:指基於flash、javascript或ajax技術實現的上傳功能或插件。
1.針對普通上傳用send_keys實現
python代碼:
dr.get("D:\\workspace\\pySelenium\\resources\\upload.htm")
loadFile=dr.find_element_by_name("filebutton")# 獲取上傳文件input元素節點
loadFile.send_keys("D:\\workspace\\pySelenium\\resources\\frame.htm")#輸入上傳文件地址來實現上傳
2.插件上傳:使用AutoIt實現,--需要安裝AutoIt程序
AutoIt安裝,使用暫時略,需要時再追加,流程為:用AutoIt編寫上傳文件腳本生成exe文件,在python腳本中進行調用
python代碼:
loadFile=dr.find_element_by_name("filebutton")# 獲取上傳按鈕
loadFile.click()
#點擊上傳按鈕,彈出上傳對話框os.system("D:\\autoItFile.exe")
#調用autoIt生成的exe文件,實現導入
十三、下載文件:使用AutoIt實現,--需要安裝AutoIt程序,方法同上傳
python代碼:
ffp=webdriver.FirefoxProfile()
ffp.set_preference("browser.download.folderList",2)#0:代表下載到瀏覽器默認路徑下;2:下載到指定目錄
ffp.set_preference("browser.download.manager.showWhenStarting",False)#是否顯示開始:True:顯示;False:不顯示
ffp.set_preference("browser.download.dir", os.getcwd())#指定下載文件目錄,os.getcwd()無參數,返回當前目錄
# ffp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")#下載文件類型,
#指定下載頁面的content-type值,application/octet-stream為文件類型,http-content-type常用對照表搜索百度
dr=webdriver.Firefox(firefox_profile=ffp)
dr.get("https://pypi.python.org/pypi/selenium#downloads")
dr.find_element_by_xpath("//div[@id='content']/div[3]/table/tbody/tr[3]/td[1]/span/a[1]").click()
#接下來使用autoIt實現
十四、cookies操作
webdriver操作cookies的方法:
get_cookies():獲得所有cookies的值
get_cookie(name):獲得有特定name值的cookie信息
add_cookie(cookie_dict):添加cookie,必須有name和value
delete_cookie(name):刪除特定名稱的cookie信息,通過name找到特定的cookie並刪除
delete_all_cookies():刪除瀏覽器中所有cookie的信息
注意:1.cookie是以字典形式進行存儲的;
2.使用場景:如登錄功能會把用戶名寫入瀏覽器cookie指定key為username,那么就可以通過get_cookies()找到username,打印value,找不到說明保存瀏覽器的cookie是有bug的。
python代碼:
num=1
dr.get("http://www.baidu.com")
cookies=dr.get_cookies()#獲取cookie的所有信息
for ck in cookies:
print'----所有cookie',num,':',ck #打印cookie的所有信息
num=num+1
print'----按name查cookie:',dr.get_cookie("PSTM")#通過cookie的name獲取cookie信息
dr.add_cookie({'name':'hello','value':'123456789'})#向name和value添加會話信息
cookies2=dr.get_cookies()#重新獲取cookie的所有信息
for ck2 in cookies2:
if ck2['name']=='hello':
print"----加入的cookie信息:%s-->%s",(ck2['name'],ck2['value'])
十五、javascript調用,python使用的方法:execute_script()
python代碼:
dr.get("http://www.baidu.com")
dr.find_element_by_id("kw").send_keys("selenium")
dr.find_element_by_id("su").click()
js="var q=document.documentElement.scrollTop=1000"
#滾動條滾到最下面dr.execute_script(js)
time.sleep(4)
js2="var q=document.documentElement.scrollTop=0"
#滾動條滾到頁面頂dr.execute_script(js2)
十六、截圖,適用於腳本出錯時,對當前窗口進行截圖保存,使用函數:get_screenshot_as_file()
python代碼:
dr.get("http://www.baidu.com")
try:
dr.find_element_by_id("kw1").send_keys("selenium")
dr.find_element_by_id("su").click()
exceptNoSuchElementException,msg:
dr.get_screenshot_as_file("d:\\error.jpg")
#截圖輸出到d盤print msg
dr.close()
十七、關閉窗口
quit():退出相關驅動程序並關閉所有窗口。
close():關閉當前窗口,打給多個窗口時,可使用來關閉當前窗口
十八、驗證碼處理
方法1:去掉驗證碼,問題:如果是在正式環境跑腳本那么在取掉會存在風險
方法2:設置萬能驗證碼,不需要取消驗證碼,在程序中留后門--設置一個萬能驗證碼,輸入萬能驗證碼了就標識通過
python代碼:
import random
randnum=random.randint(1000,9999)
print"----生成隨機數為:",randnum
input_num=input(u"請輸入驗證碼:")
print"----輸入驗證碼為:",input_num
if input_num==randnum:
print"隨機數正確,登錄成功"
elif input_num==1234:
print"輸入正確,登錄成功"
else:
print"登錄失敗"
方法3:使用cookie方法獲取,讀取之前登錄的cookie值訪問時,直接登錄,不需要驗證碼