selenium+Python(事件)
1、操作測試對象
前面講到了不少知識都是定位元素,定位只是第一步,定位之後需要對這個元素進
行操作。鼠標點擊或者鍵盤輸入,這要取決於我們定位的是按鈕還輸入框。
一般來說,webdriver 中比較常用的操作對象的方法有下面幾個
- click 點擊對象
- send_keys 在對象上模擬按鍵輸入
- clear 清除對象的內容,如果可以的話
- submit 清除對象的內容,如果可以的話
- text 用於獲取元素的文本信息
1.1 、鼠標點擊與鍵盤輸入
在我們本系列開篇的第一個例子裏就用到了到 click 和 send_skys ,
coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys("selenium") time.sleep(2) #通過 submit() 來操作 driver.find_element_by_id("su").submit() time.sleep(3) driver.quit()
send_keys("xx") 用於在一個輸入框裏輸入 xx 內容。
click() 用於點擊一個按鈕。
clear() 用於清除輸入框的內容,比如百度輸入框裏默認有個“請輸入關鍵
字”的信息,再比如我們的登陸框一般默認會有“賬號”“密碼”這樣的默認信息。
clear 可以幫助我們清除這些信息。
1.2 、submit 提交表單
我們把“百度一下”的操作從 click 換成 submit 可以達到相同的效果:
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_id("kw").send_keys("selenium") time.sleep(2) #通過 submit() 來操作 driver.find_element_by_id("su").submit() time.sleep(3) driver.quit()
1.3 、text 獲取元素文本
text 用於獲取元素的文本信息
下面把百度首頁底部的聲明打印輸出
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") time.sleep(2) #id = cp 元素的文本信息 data=driver.find_element_by_id("cp").text print data #打印信息 time.sleep(3) driver.quit()
輸出:
>>>
©2013 Baidu 使用百度前必讀 京 ICP 證030173號
1.4 、get_attribute 獲得屬性值
get_attribute
獲得屬性值。
這個函數的用法前面已經有出現過,在定位一組元素的時候有使用到它
一般用法:
select = driver.find_element_by_tag_name("select")
allOptions = select.find_elements_by_tag_name("option")
for option in allOptions:
print "Value is: " + option.get_attribute("value")
option.click()
2、鍵盤事件
本章重點:
- 鍵盤按鍵用法
- 鍵盤組合鍵用法
- send_keys() 輸入中文亂碼問題
2.1 、鍵盤按鍵用法
#coding=utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys #需要引入 keys 包 import os,time driver = webdriver.Firefox() driver.get("http://passport.kuaibo.com/login/?referrer=http%3A%2F%2Fwebcloud .kuaibo.com%2F") time.sleep(3) driver.maximize_window() # 瀏覽器全屏顯示 driver.find_element_by_id("user_name").clear() driver.find_element_by_id("user_name").send_keys("fnngj") #tab 的定位相相於清除了密碼框的默認提示信息,等同上面的 clear() driver.find_element_by_id("user_name").send_keys(Keys.TAB) time.sleep(3) driver.find_element_by_id("user_pwd").send_keys("123456") #通過定位密碼框,enter(回車)來代替登陸按鈕 driver.find_element_by_id("user_pwd").send_keys(Keys.ENTER) ‘‘‘ #也可定位登陸按鈕,通過 enter(回車)代替 click() driver.find_element_by_id("login").send_keys(Keys.ENTER) ‘‘‘ time.sleep(3) driver.quit()
要想調用鍵盤按鍵操作需要引入 keys 包:
from selenium.webdriver.common.keys import Keys
通過 send_keys()調用按鍵:
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回車
註意:這個操作和頁面元素的遍歷順序有關,假如當前定位在賬號輸入框,按鍵
盤的 tab 鍵後遍歷的不是密碼框,那就不法輸入密碼。 假如輸入密碼後,還有
需要填寫驗證碼,那麽回車也起不到登陸的效果。
2.2 、鍵盤組合鍵用法
#coding=utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") #輸入框輸入內容 driver.find_element_by_id("kw").send_keys("selenium") time.sleep(3) #ctrl+a 全選輸入框內容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,‘a‘) time.sleep(3) #ctrl+x 剪切輸入框內容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,‘x‘) time.sleep(3) #輸入框重新輸入內容,搜索 driver.find_element_by_id("kw").send_keys(u"蟲師 cnblogs") driver.find_element_by_id("su").click() time.sleep(3) driver.quit()
上面的操作向我們演示了鍵盤組合按鍵的用法。
2.3 、中文亂碼問題
selenium2 python 在 send_keys()中輸入中文一直報錯,其實前面加個小 u 就解決了:
coding=utf-8
send_keys(u"輸入中文")
需要註意的是 utf-8並不是萬能的,我們需要保持腳本、瀏覽器、程序三者編碼之
間的轉換;如果 utf-8不能解決,可以嘗試 GBK 或修改瀏覽器的默認編碼。
3、鼠標事件
本 章 重點:
ActionChains 類
- context_click() 右擊
- double_click() 雙擊
- drag_and_drop() 拖動測試的產品中有一個操作是右鍵點擊文件列表會彈出一個快捷菜單,可以方
便的選擇快捷菜單中的選擇對文件進行操作(刪除、移動、重命名),之前學習
元素的點擊非常簡單:
driver.find_element_by_id(“xxx”).click()
那麽鼠標的雙擊、右擊、拖動等是否也是這樣的寫法呢?例如右擊:
driver.find_element_by_id(“xxx”).context_click()
經過運行腳本得到了下面的錯誤提示:
AttributeError: ‘WebElement‘ object has no attribute ‘context_click‘
提示右點方法不屬於 webelement 對象,通過查找文檔,發現屬於
ActionChains 類,但文檔中沒有具體寫法。
3.1 、鼠標右鍵
下面介紹鼠標右鍵的用法,以快播私有雲為例:
#coding=utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time driver = webdriver.Firefox() driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F") #登陸百度 driver.find_element_by_id("user_name").send_keys("username") driver.find_element_by_id("user_pwd").send_keys("123456") driver.find_element_by_id("dl_an_submit").click() time.sleep(3) #定位到要右擊的元素 qqq=driver.find_element_by_xpath("/html/body/div/div[2]/div[2]/div/div[3]/table/tbody/tr/td[2]") #對定位到的元素執行鼠標右鍵操作 ActionChains(driver).context_click(qqq).perform() #你也可以使用三行的寫法,但我覺得上面兩行寫法更容易理解 chain = ActionChains(driver) implement =driver.find_element_by_xpath("/html/body/div/div[2]/div[2]/div/div[3]/table/tbody/tr/td[2]") chain.context_click(implement).perform() time.sleep(3) #休眠3秒 driver.close()
這裏需要註意的是,在使用 ActionChains 類之前,要先將包引入。
右擊的操作會了,下面的其它方法比葫蘆畫瓢也能寫出來。
3.2 、鼠標雙擊
鼠標雙擊的寫法:
#定位到要雙擊的元素
qqq =driver.find_element_by_xpath("xxx")
#對定位到的元素執行鼠標雙擊操作
ActionChains(driver).double_click(qqq).perform()
3.3 、鼠標拖放
鼠標拖放操作的寫法:
#定位元素的原位置
element = driver.find_element_by_name("source")
#定位元素要移動到的目標位置
target = driver.find_element_by_name("target")
#執行元素的移動操作
ActionChains(driver).drag_and_drop(element, target).perform()
selenium+Python(事件)