利用selenium模塊控制瀏覽器

利用selenium模塊控制瀏覽器


導入selenium模塊:from selenium import webdriver


browserFirefox = webdriver.Firefox()#打開Firefox瀏覽器,返回一個Webdriver對象


browserFirefox.get('http://www.baidu.com')


Webdriver對象有兩種方法:
find_element_*和find_elements_*方法
1、find_element_*:返回一個WebElement對象,代表頁面中的匹配查詢到的第一個元素
2、find_elements_*:返回的是WebElement_*對象的列表,包含頁面中所有匹配的元素


元素定位:
find_element_by_id()    //根據id屬性定位
find_element_by_name()   //根據name屬性定位
find_element_by_class_name()    //根據class屬性定位
find_element_by_link_text()      //根據文字鏈接
find_element_by_partial_link_text()    //根據文字鏈接的一部分
find_element_by_tag_name()       //根據標籤名稱

find_element_by_xpath()  //根據xpath定位,xpath如何用多個屬性定位, find_element_by_xpath("//div[@class='x' and name='b']")

絕對路徑寫法(只有一種),寫法如下:

引用頁面上的form元素(即源碼中的第3行):/html/body/form[1]

注意:1. 元素的xpath絕對路徑可通過firebug直接查詢。2. 一般不推薦使用絕對路徑的寫法,因爲一旦頁面結構發生變化,該路徑也隨之失效,必須重新寫。3. 絕對路徑以單/號表示,而下面要講的相對路徑則以//表示,這個區別非常重要。另外需要多說一句的是,當xpath的路徑以/開頭時,表示讓Xpath解析引擎從文檔的根節點開始解析。當xpath路徑以//開頭時,則表示讓xpath引擎從文檔的任意符合的元素節點開始進行解析。而當/出現在xpath路徑中時,則表示尋找父節點的直接子節點,當//出現在xpath路徑中時,表示尋找父節點下任意符合條件的子節點,不管嵌套了多少層級(這些下面都有例子,大家可以參照來試驗)。弄清這個原則,就可以理解其實xpath的路徑可以絕對路徑和相對路徑混合在一起來進行表示,想怎麼玩就怎麼玩

 

下面是相對路徑的引用寫法:

查找頁面根元素://

查找頁面上所有的input元素://input

查找頁面上第一個form元素內的直接子input元素(即只包括form元素的下一級input元素,使用絕對路徑表示,單/號)://form[1]/input

查找頁面上第一個form元素內的所有子input元素(只要在form元素內的input都算,不管還嵌套了多少個其他標籤,使用相對路徑表示,雙//號)://form[1]//input

查找頁面上第一個form元素://form[1]

查找頁面上id爲loginForm的form元素://form[@id='loginForm']

查找頁面上具有name屬性爲username的input元素://input[@name='username']

查找頁面上id爲loginForm的form元素下的第一個input元素://form[@id='loginForm']/input[1]

查找頁面具有name屬性爲contiune並且type屬性爲button的input元素://input[@name='continue'][@type='button']

查找頁面上id爲loginForm的form元素下第4個input元素://form[@id='loginForm']/input[4]




find_element_by_css_selector()     //根據css選擇器定位


find_element_by_xpath()和find_element_by_css_selector()可以直接在chrome中的檢查中copy


除了*_by_tag_name() 方法,所有的方法的參數都是區分大小的,
如果頁面上沒有元素匹配該方法要查找的元素,selenium模塊就會拋出NoSuchElement異常,如果不希望程序崩潰,就在代碼中加入try和except語句


WebElement對象的屬性和方法:
tag_name             //標籤名,例如'a'表示<a>元素
get_attribute(name)  // 該元素name的屬性值
text                 //該元素內的文本,例如<span>hello</span>中的'hello'
clear()              //對於文本字段或文本區域元素,清除其中輸入的文本
is_displayed()       //如果該元素可見,返回True,否則返回False
is_enabled()        //對於輸入元素,如果該元素啓用,返回True,否則返回False
is_selected()       //對於複選框或單選框元素,如果該元素被選中,返回True,否則返回False
location            //一個字典,包含鍵'x'和'y',表示該元素在頁面上的位置






打開網頁需要添加等待時間讓網頁加載完成:
time.sleep(3)  #休眠3秒
implicitly_wait() #智能等待


對瀏覽器的操作:
最大化:driver.maximize_window()
設置寬和高:driver.set_window_size(width,height)


瀏覽器的前進和後退:
前進:driver.forward()
後退:driver.back()
刷新:driver.refresh()
關閉窗口:driver.quit()


操作對象:
click() 點擊對象
send_keys()  模擬按鍵輸入
clear()  清除對象內容
submit()  如果有submit按鈕,自動提交表單
text  獲取文本信息
get_attribute()  獲取屬性值


鍵盤操作:(引入keys包)
from selenium.webdriver.common.keys import Keys


Keys.DOWN,Keys.UP,Keys.LEFT,Keys.RIGHT----鍵盤箭頭鍵
Keys.ENTER,Keys.RETURE----回車和換行鍵
Keys.HOME,Keys.END,Keys.PAGE_DOWN,Keys.PAGE_UP----Home鍵、END鍵、Page_down鍵和Page_up鍵
Keys.ESCAPE,Keys.BACK_SPACE,Keys.DELETE----Esc,Backspace和Delete鍵
Keys.F1,Keys.F2,......Keys.F3----鍵盤頂部F1-F12鍵
Keys.TAB----Tab鍵


driver.find_element_by_id("xx").send_keys(Keys.ENTER) (輸入回車)
Keys.TAB  #換行
組合鍵:
send_keys(Keys.CONTROL,'a') #ctrl+a


鼠標操作:導入ActionChains包
from selenium.webdriver.common.action_chains import ActionChains


dr.find_element_by_id("xx").context_click() #右擊
double_click()  #雙擊
drag_and_drop(a,b)  #將a拖動到b位置


定位一組元素:將元素定位中的element換成elements,返回的是列表


多層框架/窗口
switch_to_frame("frame_name")#可以傳入id、name、index以及selenium的WebElement對象,直接切換
如果只有class時,只能先找到再切換:
frame = driver.find_element_by_class_name("APP-editor-iframe")  #若iframe有id或是name屬性,可以直接切換
driver.switch_to_frame(frame)






switch_to_window("window_name")
例子:
#獲取hao123主頁的句柄
handle_hao123 = driver.current_window_handle,然後傳入參數
#獲取所有窗口的句柄
all_handles = driver.window_handles
#根據窗口句柄的再判斷,切換到163窗口
for handle in all_handles:
    if handle != handle_hao123:
        driver.switch_to_window(handle)
        


上傳文件:driver.find_element_by_id("xx").send_keys(文件路徑名,絕對相對都可以)




對話框
text 返回alert/confirm/prompt 中的文字信息
accept 點擊確認按鈕
dismiss 點擊取消按鈕,如果有的話
send_keys 輸入值,這個alert\confirm 沒有對話框就不能用了,不然會報錯。




調用js:execute_script(script,*args) #在當前窗口執行js腳本


cookie處理:
driver.get_cookies() 獲得cookie 信息
add_cookie(cookie_dict) 向cookie 添加會話信息
delete_cookie(name) 刪除特定(部分)的cookie
delete_all_cookies() 刪除所有cookie



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章