Python Selenium庫的基本使用教程
入門教程:Selenium官網教程
1.Selenium簡介Selenium是一個用于測試網站的自動化測試工具,支持各種瀏覽器包括Chrome、Firefox、Safari等主流界面瀏覽器,同時也支持phantomJS無界面瀏覽器。
2.支持多種操作系統如Windows、Linux、IOS、Android等。
3.安裝Seleniumpip install Selenium4.安裝瀏覽器驅動
Selenium3.x調用瀏覽器必須有一個webdriver驅動文件
Chrome驅動文件下載:點擊下載chromedrive
Firefox驅動文件下載:點擊下載geckodriver
5.配置環境變量設置瀏覽器的地址非常簡單。 我們可以手動創建一個存放瀏覽器驅動的目錄,如: F:GeckoDriver , 將下載的瀏覽器驅動文件(例如:chromedriver、geckodriver)丟到該目錄下。
我的電腦?>屬性?>系統設置?>高級?>環境變量?>系統變量?>Path,將“F:GeckoDriver”目錄添加到Path的值中。比如:Path字段;F:GeckoDriver
參考瀏覽器驅動環境配置
(二)Selenium 快速入門入門參考文獻:Selenium入門
1.Selenium提供了8種定位方式: id name class name tag name link text partial link text xpath css selector 2.定位元素的8種方式參考:selenium元素定位
定位一個元素 定位多個元素 含義 find_element_by_id find_elements_by_id 通過元素id定位 find_element_by_name find_elements_by_name 通過元素name定位 find_element_by_xpath find_elements_by_xpath 通過xpath表達式定位 find_element_by_link_text find_elements_by_link_tex 通過完整超鏈接定位 find_element_by_partial_link_text find_elements_by_partial_link_text 通過部分鏈接定位 find_element_by_tag_name find_elements_by_tag_name 通過標簽定位 find_element_by_class_name find_elements_by_class_name 通過類名進行定位 find_elements_by_css_selector find_elements_by_css_selector 通過css選擇器進行定位 3.實例演示假如我們有一個Web頁面,通過前端工具(如,Firebug)查看到一個元素的屬性是這樣的。
<html> <head> <body link='#0000cc'> <a href='http://www.aoyou183.cn/' rel='external nofollow' onmousedown='return c({’fm’:’tab’,’tab’:’logo’})'> <form name='f' action='/s'> <span ></span> <input name='wd' value='' maxlength='255' autocomplete='off'>
通過id定位:
dr.find_element_by_id('kw')
通過name定位:
dr.find_element_by_name('wd')
通過class name定位:
dr.find_element_by_class_name('s_ipt')
通過tag name定位:
dr.find_element_by_tag_name('input')
通過xpath定位,xpath定位有N種寫法,這里列幾個常用寫法:
dr.find_element_by_xpath('//*[@]')dr.find_element_by_xpath('//*[@name=’wd’]')dr.find_element_by_xpath('//input[@]')dr.find_element_by_xpath('/html/body/form/span/input')dr.find_element_by_xpath('//span[@]/input')dr.find_element_by_xpath('//form[@]/span/input')dr.find_element_by_xpath('//input[@ and @name=’wd’]')
通過css定位,css定位有N種寫法,這里列幾個常用寫法:
dr.find_element_by_css_selector('#kw')dr.find_element_by_css_selector('[name=wd]')dr.find_element_by_css_selector('.s_ipt')dr.find_element_by_css_selector('html > body > form > span > input')dr.find_element_by_css_selector('span.soutu-btn> input#kw')dr.find_element_by_css_selector('form#form > span > input')
接下來,我們的頁面上有一組文本鏈接。
<a rel='external nofollow' name='tj_trnews'>新聞</a><a rel='external nofollow' name='tj_trhao123'>hao123</a>
通過link text定位:
dr.find_element_by_link_text('新聞')dr.find_element_by_link_text('hao123')
通過partial link text定位:
dr.find_element_by_partial_link_text('新')dr.find_element_by_partial_link_text('hao')dr.find_element_by_partial_link_text('123')4.Selenium庫下webdriver模塊常用方法的使用
1.控制瀏覽器操作的一些方法
方法 說明 set_window_size() 設置瀏覽器的大小 back() 控制瀏覽器后退 forward() 控制瀏覽器前進 refresh() 刷新當前頁面 clear() 清除文本 send_keys (value) 模擬按鍵輸入 click() 單擊元素 submit() 用于提交表單 get_attribute(name) 獲取元素屬性值 is_displayed() 設置該元素是否用戶可見 size 返回元素的尺寸 text 獲取元素的文本實例演示
from selenium import webdriverfrom time import sleep#1.創建Chrome瀏覽器對象,這會在電腦上在打開一個瀏覽器窗口browser = webdriver.Firefox(executable_path ='F:GeckoDrivergeckodriver')#2.通過瀏覽器向服務器發送URL請求browser.get('https://www.baidu.com/')sleep(3)#3.刷新瀏覽器browser.refresh()#4.設置瀏覽器的大小browser.set_window_size(1400,800)#5.設置鏈接內容element=browser.find_element_by_link_text('新聞')element.click()element=browser.find_element_by_link_text('“下團組”時間')element.click()
2.鼠標事件
在 WebDriver 中, 將這些關于鼠標操作的方法封裝在 ActionChains 類提供。
方法 說明 ActionChains(driver) 構造ActionChains對象 context_click() 執行鼠標懸停操作 move_to_element(above) 右擊 double_click() 雙擊 drag_and_drop() 拖動 move_to_element(above) 執行鼠標懸停操作 context_click() 用于模擬鼠標右鍵操作, 在調用時需要指定元素定位 perform() 執行所有 ActionChains 中存儲的行為,可以理解成是對整個操作的提交動作實例演示
from selenium import webdriver#1.引入 ActionChains 類from selenium.webdriver.common.action_chains import ActionChains#1.創建Chrome瀏覽器對象,這會在電腦上在打開一個瀏覽器窗口driver = webdriver.Firefox(executable_path ='F:GeckoDrivergeckodriver')driver.get('https://www.baidu.com')#2.定位到要懸停的元素element= driver.find_element_by_link_text('設置')#3.對定位到的元素執行鼠標懸停操作ActionChains(driver).move_to_element(element).perform()#找到鏈接elem1=driver.find_element_by_link_text('搜索設置')elem1.click()#通過元素選擇器找到id=sh_2,并點擊設置elem2=driver.find_element_by_id('sh_1')elem2.click()#保存設置elem3=driver.find_element_by_class_name('prefpanelgo')elem3.click()
3.鍵盤事件
Selenium中的Key模塊為我們提供了模擬鍵盤按鍵的方法,那就是send_keys()方法。它不僅可以模擬鍵盤輸入,也可以模擬鍵盤的操作。
常用的鍵盤操作如下:
模擬鍵盤按鍵 說明 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+V) send_keys(Keys.F1…Fn) 鍵盤 F1…Fn
4.獲取斷言信息
不管是在做功能測試還是自動化測試,最后一步需要拿實際結果與預期進行比較。這個比較的稱之為斷言。通過我們獲取title 、URL和text等信息進行斷言。
屬性 說明 title 用于獲得當前頁面的標題 current_url 用戶獲得當前頁面的URL text 獲取搜索條目的文本信息
實例演示
from selenium import webdriverfrom time import sleepdriver = webdriver.Firefox(executable_path ='F:GeckoDrivergeckodriver')driver.get('https://www.baidu.com')print(’Before search================’)# 打印當前頁面titletitle = driver.titleprint(title)# 打印當前頁面URLnow_url = driver.current_urlprint(now_url)driver.find_element_by_id('kw').send_keys('selenium')driver.find_element_by_id('su').click()sleep(1)print(’After search================’)# 再次打印當前頁面titletitle = driver.titleprint(title)# 打印當前頁面URLnow_url = driver.current_urlprint(now_url)# 獲取結果數目user = driver.find_element_by_class_name(’nums’).textprint(user)#關閉所有窗口driver.quit()
打印輸出結果
Before search================百度一下,你就知道https://www.baidu.com/After search================selenium_百度搜索https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium&rsv_pq=a1d51b980000e36e&rsv_t=a715IZaMpLd1w92I4LNUi7gKuOdlAz5McsHe%2FSLQeBZD44OUIPnjY%2B7pODM&rqlang=cn&rsv_enter=0&rsv_sug3=8&inputT=758&rsv_sug4=759搜索工具百度為您找到相關結果約7,170,000個
5.設置元素等待:參考文獻
6.定位一組元素
定位一組元素的方法與定位單個元素的方法類似,唯一的區別是在單詞element后面多了一個s表示復數。
實例演示
from selenium import webdriverfrom time import sleepdriver =webdriver.Firefox(executable_path ='F:GeckoDrivergeckodriver')driver.get('https://www.baidu.com')driver.find_element_by_id('kw').send_keys('selenium')driver.find_element_by_id('su').click()sleep(1)#1.定位一組元素elements = driver.find_elements_by_xpath(’//div/h3/a’)print(type(elements))#2.循環遍歷出每一條搜索結果的標題for t in elements: print(t.text) element=driver.find_element_by_link_text(t.text) element.click() sleep(3)driver.quit()
7.多表單切換
在Web應用中經常會遇到frame/iframe表單嵌套頁面的應用,WebDriver只能在一個頁面上對元素識別與定位,對于frame/iframe表單內嵌頁面上的元素無法直接定位。這時就需要通過switch_to.frame()方法將當前定位的主體切換為frame/iframe表單的內嵌頁面中。
方法 說明 switch_to.frame() 將當前定位的主體切換為frame/iframe表單的內嵌頁面中 switch_to.default_content() 跳回最外層的頁面
<html> <body> ... <iframe ...> <html> <body> ... <input name='email' >
126郵箱登錄框的結構大概是這樣子的,想要操作登錄框必須要先切換到iframe表單。
from selenium import webdriverdriver = webdriver.Chrome()driver.get('http://www.126.com')driver.switch_to.frame(’x-URS-iframe’)driver.find_element_by_name('email').clear()driver.find_element_by_name('email').send_keys('username')driver.find_element_by_name('password').clear()driver.find_element_by_name('password').send_keys('password')driver.find_element_by_id('dologin').click()driver.switch_to.default_content()driver.quit()
switch_to.frame() 默認可以直接取表單的id 或name屬性。如果iframe沒有可用的id和name屬性,則可以通過下面的方式進行定位。
……#先通過xpth定位到iframexf = driver.find_element_by_xpath(’//*[@]’)#再將定位對象傳給switch_to.frame()方法driver.switch_to.frame(xf)……driver.switch_to.parent_frame()
8.多窗口切換
在頁面操作過程中有時候點擊某個鏈接會彈出新的窗口,這時就需要主機切換到新打開的窗口上進行操作。WebDriver提供了switch_to.window()方法,可以實現在不同的窗口之間切換。
方法 說明 current_window_handle 獲得當前窗口句柄 window_handles 返回所有窗口的句柄到當前會話 switch_to.window() 用于切換到相應的窗口,與上一節的switch_to.frame()類似,前者用于不同窗口的切換,后者用于不同表單之間的切換。
switch_to.window() 用于切換到相應的窗口,與上一節的switch_to.frame()類似,前者用于不同窗口的切換,后者用于不同表單之間的切換。
實例演示
from selenium import webdriverimport timedriver = webdriver.Chrome('F:ChromeChromeDriverchromedriver')driver.implicitly_wait(10)driver.get('http://www.baidu.com')#1.獲得百度搜索窗口句柄sreach_windows = driver.current_window_handledriver.find_element_by_link_text(’登錄’).click()driver.find_element_by_link_text('立即注冊').click()#1.獲得當前所有打開的窗口的句柄all_handles = driver.window_handles#3.進入注冊窗口for handle in all_handles: if handle != sreach_windows: driver.switch_to.window(handle) print(’跳轉到注冊窗口’) driver.find_element_by_name('account').send_keys(’123456789’) driver.find_element_by_name(’password’).send_keys(’123456789’) time.sleep(2) driver.quit()
9.警告框處理
在WebDriver中處理JavaScript所生成的alert、confirm以及prompt十分簡單,具體做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法進行操作。
方法 說明 text 返回 alert/confirm/prompt 中的文字信息 accept() 接受現有警告框 dismiss() 解散現有警告框 send_keys(keysToSend) 發送文本至警告框。keysToSend:將文本發送至警告框。
實例演示
from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimport timedriver = webdriver.Chrome('F:ChromeChromeDriverchromedriver')driver.implicitly_wait(10)driver.get(’http://www.baidu.com’)# 鼠標懸停至“設置”鏈接link = driver.find_element_by_link_text(’設置’)ActionChains(driver).move_to_element(link).perform()# 打開搜索設置driver.find_element_by_link_text('搜索設置').click()#在此處設置等待2s否則可能報錯time.sleep(2)# 保存設置driver.find_element_by_class_name('prefpanelgo').click()time.sleep(2)# 接受警告框driver.switch_to.alert.accept()driver.quit()
10.下拉框選擇操作
導入選擇下拉框Select類,使用該類處理下拉框操作。
from selenium.webdriver.support.select import Select
Select類的方法
方法 說明 select_by_value(“選擇值”) select標簽的value屬性的值 select_by_index(“索引值”) 下拉框的索引 select_by_visible_testx(“文本值”) 下拉框的文本值
有時我們會碰到下拉框,WebDriver提供了Select類來處理下拉框。 如百度搜索設置的下拉框,如下圖:[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7WUxrkEj-1571973999629)(http://orru5lls3.bkt.clouddn.com/select.png)]
from selenium import webdriverfrom selenium.webdriver.support.select import Selectfrom time import sleepdriver = webdriver.Chrome('F:ChromeChromeDriverchromedriver')driver.implicitly_wait(10)driver.get(’http://www.baidu.com’)#1.鼠標懸停至“設置”鏈接driver.find_element_by_link_text(’設置’).click()sleep(1)#2.打開搜索設置driver.find_element_by_link_text('搜索設置').click()sleep(2)#3.搜索結果顯示條數sel = driver.find_element_by_xpath('//select[@]')Select(sel).select_by_value(’50’) # 顯示50條sleep(3)driver.quit()
11.文件上傳
對于通過input標簽實現的上傳功能,可以將其看作是一個輸入框,即通過send_keys()指定本地文件路徑的方式實現文件上傳。
通過send_keys()方法來實現文件上傳:
from selenium import webdriverimport osdriver = webdriver.Firefox()file_path = ’file:///’ + os.path.abspath(’upfile.html’)driver.get(file_path)# 定位上傳按鈕,添加本地文件driver.find_element_by_name('file').send_keys(’D:upload_file.txt’)driver.quit()
12.cookie操作
有時候我們需要驗證瀏覽器中cookie是否正確,因為基于真實cookie的測試是無法通過白盒和集成測試進行的。WebDriver提供了操作Cookie的相關方法,可以讀取、添加和刪除cookie信息。
WebDriver操作cookie的方法:
方法 說明 get_cookies() 獲得所有cookie信息 get_cookie(name) 返回字典的key為“name”的cookie信息 add_cookie(cookie_dict) 添加cookie?!癱ookie_dict”指字典對象,必須有name 和value 值 delete_cookie(name,optionsString) 刪除cookie信息。“name”是要刪除的cookie的名稱,“optionsString”是該cookie的選項,目前支持的選項包括“路徑”,“域” delete_all_cookies() 刪除所有cookie信息實例演示
from selenium import webdriverimport timebrowser = webdriver.Chrome('F:ChromeChromeDriverchromedriver')browser.get('http://www.youdao.com')#1.打印cookie信息print(’=====================================’)print('打印cookie信息為:')print(browser.get_cookies)#2.添加cookie信息dict={’name’:'name',’value’:’Kaina’}browser.add_cookie(dict)print(’=====================================’)print(’添加cookie信息為:’)#3.遍歷打印cookie信息for cookie in browser.get_cookies(): print(’%s----%sn’ %(cookie[’name’],cookie[’value’])) #4.刪除一個cookiebrowser.delete_cookie(’name’)print(’=====================================’)print(’刪除一個cookie’)for cookie in browser.get_cookies(): print(’%s----%sn’ %(cookie[’name’],cookie[’value’]))print(’=====================================’)print(’刪除所有cookie后:’)#5.刪除所有cookie,無需傳遞參數browser.delete_all_cookies()for cookie in browser.get_cookies(): print(’%s----%sn’ %(cookie[’name’],cookie[’value’]))time.sleep(3)browser.close()
13.調用JavaScript代碼
雖然WebDriver提供了操作瀏覽器的前進和后退方法,但對于瀏覽器滾動條并沒有提供相應的操作方法。在這種情況下,就可以借助JavaScript來控制瀏覽器的滾動條。WebDriver提供了execute_script()方法來執行JavaScript代碼。
用于調整瀏覽器滾動條位置的JavaScript代碼如下:
<!-- window.scrollTo(左邊距,上邊距); -->window.scrollTo(0,450);
window.scrollTo()方法用于設置瀏覽器窗口滾動條的水平和垂直位置。方法的第一個參數表示水平的左間距,第二個參數表示垂直的上邊距。其代碼如下:
from selenium import webdriverfrom time import sleep#1.訪問百度driver=webdriver.Firefox(executable_path ='F:GeckoDrivergeckodriver')driver.get('http://www.baidu.com')#2.搜索driver.find_element_by_id('kw').send_keys('selenium')driver.find_element_by_id('su').click()#3.休眠2s目的是獲得服務器的響應內容,如果不使用休眠可能報錯sleep(2)#4.通過javascript設置瀏覽器窗口的滾動條位置js='window.scrollTo(100,450);'driver.execute_script(js)sleep(3)driver.close()
通過瀏覽器打開百度進行搜索,并且提前通過set_window_size()方法將瀏覽器窗口設置為固定寬高顯示,目的是讓窗口出現水平和垂直滾動條。然后通過execute_script()方法執行JavaScripts代碼來移動滾動條的位置。滾動條上下左右滾動代碼演示
from selenium import webdriverfrom time import sleepdriver=webdriver.Firefox(executable_path ='F:GeckoDrivergeckodriver')driver.set_window_size(400,400)driver.get('https://www.baidu.com')#2.搜索# driver.find_element_by_id('kw').send_keys('selenium')# driver.find_element_by_id('su').click()#3.休眠2s目的是獲得服務器的響應內容,如果不使用休眠可能報錯sleep(10)#4 滾動左右滾動條---向右js2 = 'var q=document.documentElement.scrollLeft=10000'driver.execute_script(js2)sleep(15)#5 滾動左右滾動條---向左js3 = 'var q=document.documentElement.scrollLeft=0'driver.execute_script(js3)sleep(15)#6 拖動到滾動條底部---向下js = 'var q=document.documentElement.scrollTop=10000'driver.execute_script(js)sleep(15)#7 拖動到滾動條底部---向上js = 'var q=document.documentElement.scrollTop=0'driver.execute_script(js)sleep(15)driver.close()
14.窗口截圖
自動化用例是由程序去執行的,因此有時候打印的錯誤信息并不十分明確。如果在腳本執行出錯的時候能對當前窗口截圖保存,那么通過圖片就可以非常直觀地看出出錯的原因。WebDriver提供了截圖函數get_screenshot_as_file()來截取當前窗口。
截屏方法:
方法 說明 get_screenshot_as_file(self, filename) 用于截取當前窗口,并把圖片保存到本地
from selenium import webdriverfrom time import sleepdriver =webdriver.Firefox(executable_path ='F:GeckoDrivergeckodriver')driver.get(’http://www.baidu.com’)driver.find_element_by_id(’kw’).send_keys(’selenium’)driver.find_element_by_id(’su’).click()sleep(2)#1.截取當前窗口,并指定截圖圖片的保存位置driver.get_screenshot_as_file('D:baidu_img.jpg')driver.quit()
15.關閉瀏覽器
在前面的例子中我們一直使用quit()方法,其含義為退出相關的驅動程序和關閉所有窗口。除此之外,WebDriver還提供了close()方法,用來關閉當前窗口。例多窗口的處理,在用例執行的過程中打開了多個窗口,我們想要關閉其中的某個窗口,這時就要用到close()方法進行關閉了。
方法 說明 close() 關閉單個窗口 quit() 關閉所有窗口
總結到此這篇關于Python Selenium庫的基本使用教程的文章就介紹到這了,更多相關Python Selenium庫使用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章: