selenium的用法
selenium2.0主要包含selenium IDE 和selenium webDriver,IDE有點類似QTP和LoadRunner的錄制功能,就是firefox瀏覽器的一個插件,用來錄制在瀏覽器的一系列操作,錄制完成后可以回放,可以轉換為代碼輸出出來。本節主要講的是selenium的webdriver功能。結合Python語言來講解具體用法。
WebDriver 的實現原理:
WebDriver直接利用了瀏覽器的內部接口來操作瀏覽器。
對於不同平台中的不同瀏覽器,必須依賴瀏覽器內部的 Native Component (原生組件)來實現把對WebDriver API 調用轉化為對瀏覽器內部接口的調用。
Selenium 1.0采用JavaScript的合成事件來處理網頁元素的操作,例如要單擊某個頁面元素,要先使用JavaScript 定位到這個元素,然后觸發單擊事件。
而 WebDriver 使用的是系統的內部接口或函數,首先是找到這個元素的坐標位置,並在這個坐標點觸發一個鼠標左鍵的單擊操作。
環境配置
在使用之前,首先要將用到的環境配置好,這里主要需要兩個環境,一個是selenium庫,是一個第三方庫,用pip install selenium安裝即可,或者可以去pypi官網下載安裝。(這里要注意版本要和webdriver對應,所以可以先不裝這個,先裝webdriver。)第二個環境就是瀏覽器的webdriver下載。
ChromeDriver的安裝
下載地址:http://chromedriver.storage.googleapis.com/index.html
如果下載后,使用的過程中出現問題,可以檢查一下是否因為driver的版本和瀏覽器不兼容,有一個對應關系:
Firefox的webdriver下載安裝
我當時下載Firefox也是費了很大勁,剛開始所有都是用的最新版本,結果調用瀏覽器總是報錯,后來把版本降低才可以,並且這里driver和Firefox也有對應關系,並且selenium3.6也只能支持Firefox47.0以上的版本.
從網上查的是:firefox 47+selenium 3.13.0+geckodriver 0.15.0
或者selenium3.5.0,firefox57,geckodriver-v0.19.1
我自己的筆記本配置也不是很好,所以我用的更低版本,目前看來這個版本還挺好用,selenium用的2.48.0,Firefox用的35版本,網盤地址:
https://pan.baidu.com/s/10KKwT5y4QPYRaZ4alniOgA
如果想自己下載更新版本,也可以到下面這個網址去下
下載地址:https://github.com/mozilla/geckodriver/releases/
注意:如果想要使用低版本,但是selenium已經裝了最新的版本,可以使用pip uninstall selenium去卸載掉,卸載之后重新裝pip install selenium==2.48.0。pip show selenium指令可以查看你自己安裝的版本。
再注意:Firefox瀏覽器要關閉更新,找到選項--高級--更新,選擇不檢查更新,點擊確定,就可以了。一定要關閉自動更新。
IE的webdriver安裝
下載網址:https://www.nuget.org/packages/Selenium.WebDriver.IEDriver/
配置driver
下載好driver之后將下載下來的exe文件直接放到Python的安裝目錄即可。
2. selenium webdriver用法
2.1 driver的一般操作
使用webdriver之前要先導入模塊:
from selenium import webdriver
使用webdriver寫自動化測試腳本的步驟:
第一步:獲取瀏覽器的驅動,driver
第二步:打開待測試網址
第三步:找到你需要操作的元素,對這些元素進行單擊,雙擊,輸入文字等操作
第四步:關閉瀏覽器
對應的代碼:
driver = webdriver.Firefox() #將火狐瀏覽器的驅動賦值給driver,這樣driver就可以有很多可以使用的方法了,比如下面這個打開一個網址的方法 driver = webdriver.Chrome() #獲取谷歌瀏覽器驅動 driver = webdriver.Ie() #獲取IE瀏覽器驅動 driver.get('http://www.baidu.com') driver.quit() #關閉driver driver.close() #關閉當前頁面
driver的其他常用方法或者屬性:
獲取當前頁面標題內容 driver.title
查看瀏覽器的名字 drvier.name
獲取當前網頁地址 driver.current_url
獲取當前頁面元素 driver.page_source
回退到之前打開的頁面 driver.back()
前進到回退之前的頁面 driver.forward()
頁面刷新 driver.refresh()
截取當前頁面並保存到1.png driver.get_screenshot_as_file("..\\1.png")
設置瀏覽器窗口大小:
driver.set_window_size(800,600)
driver.maximize_window()
例如:
# encoding=utf-8 from selenium import webdriver driver = webdriver.Chrome() driver.get(r'http://www.baidu.com') driver.maximize_window() print(driver.title)
2.2 find_element_by_xxx方法查找頁面上的元素
元素定位有很多種方法,比如通過元素的id屬性,name屬性,link_text屬性,class屬性,xpath或者css等
driver.find_element_by_id('su') #尋找id為’su’的元素 driver.find_element_by_name('wd') #尋找name為’wd’的元素 driver.find_element_by_link_text('貼吧') #尋找鏈接文本信息為’貼吧’的元素 driver.find_element_by_class_name('c-tips-container') #尋找classname為’c-tips-container’的元素 driver.find_element_by_tag_name('div') #尋找標簽名帶有’div’的元素 driver.find_element_by_partial_link_text('新') #尋找鏈接文本部分帶有’新’的元素 driver.find_element_by_xpath('//*[@id="kw"]') #尋找id屬性為kw的元素 driver.find_element_by_css_selector('#kw') #尋找id屬性為kw的元素
前面六種都比較簡單,第一種,根據id定位,什么時候使用呢?一般就是你要查找的這個元素有id屬性並且id屬性的值在網頁中是唯一的。name,classname也同id一樣。使用方法就是調用driver的driver.find_element_by_id('su'),參數傳你要查找的元素的id屬性值。
link_text查找的是一個鏈接,根據鏈接的文本信息的內容進行查找。
tag_name按照標簽的名字進行查找,不常用。
partial_link_text同link_text,但是后面的內容可以不用寫全部的值。比如下面這個元素<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新聞</a>
想找到這個元素,就可以這樣寫:driver.find_element_by_partial_link_text('新'),前提是你的網頁沒有別的包含新的鏈接。如果有的話,默認是找到的第一個,如果沒找到,會拋NoSuchElementException的異常。
xpath和css在另外的博客隨筆里單獨介紹了,這里就不說明了,這么多種定位元素的方法,應該用哪種呢?基本常用的有通過id,name,class,然后就是xpath或者css了,xpath和css基本上所有的元素都可以定位到,所以一定要學習一下。通常用這兩個其中的一種就足夠了。推薦使用css,寫法更簡單,速度更快。但是如果后面要做移動自動化,還得學習一下xpath,因為安卓自動化里面用的是xpath。
2.3 find_elements_by_xxx
driver還有一些和find_element_by_xxx類似的方法叫find_elements_by_xxx,這類方法返回的是一個列表,比如driver.find_elements_by_id('su') 這樣寫就獲取到了頁面上所有id屬性為su的元素。想要使用第幾個元素,用下標取即可。
2.4 對找到的元素進行操作
獲取元素坐標:
driver.find_element_by_id('su').location
在百度文本搜索框內輸入內容Python Selenium:
driver.find_element_by_name('wd').send_keys('Python Selenium')
清空文本搜索框的所有內容:
driver.find_element_by_name('wd').clear()
點擊搜索按鈕:
driver.find_element_by_id('su').click()
提交搜索按鈕:
driver.find_element_by_id('su').submit()
獲取搜索框的大小:
driver.find_element_by_id('kw').size
獲取控件id為’jgwab’所顯示的內容:
driver.find_element_by_id('jgwab').text
獲取控件id為’jgwab’的tag名稱:
driver.find_element_by_id('jgwab').tag_name
獲取控件id為’su’的type屬性:
driver.find_element_by_id('su').get_attribute('type')
判斷搜索文本框當前是否被顯示:
driver.find_element_by_name('wd').is_displayed()
判斷元素是否被選中:
driver.find_element_by_id('su').is_selected()
例如百度一下‘python’,先打開百度首頁的網址,在輸入框輸入Python,點擊搜索:
# encoding=utf-8 from selenium import webdriver driver = webdriver.Chrome() driver.get(r'http://www.baidu.com') driver.find_element_by_id("kw").click() driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys("Python") driver.find_element_by_id("su").click()
2.5 模擬鼠標操作
需要導入模塊:from selenium.webdriver.common.action_chains import ActionChains
注意:當你調用ActionChains()的方法時,不會立即執行,而是會將所有的操作按順序存放在一個隊列里,當你調用perform()方法時,隊列中的內容會依次執行。
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
#在搜索文本框利用context_click()進行鼠標右擊 ActionChains(driver).context_click(driver.find_element_by_id('kw')).perform() #在搜索文本框利用double_click()進行雙擊 ActionChains(driver).double_click(driver.find_element_by_id('kw')).perform() #利用drag_and_drop(source,target)從搜索文本框移動到‘百度一下’按鈕 ActionChains(driver).drag_and_drop(driver.find_element_by_id('kw'),driver.find_element_by_id('su')).perform() #利用move_to_element()停留在文本搜索框上 ActionChains(driver).move_to_element(driver.find_element_by_id('kw')).perform() #利用click_and_hold()可以點擊並且停留在搜索按鈕上 ActionChains(driver).click_and_hold(driver.find_element_by_id('su')).perform()
例如:
# encoding=utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains #導入模塊 driver = webdriver.Chrome() driver.get(r'http://www.baidu.com') label = driver.find_element_by_css_selector("#u1 > a.pf") # 找到百度首頁上的設置鏈接 ActionChains(driver).move_to_element(label).perform() # 模擬用戶懸浮 label_bel = driver.find_element_by_link_text("高級搜索") #設置的下拉菜單里的高級搜索鏈接 label_bel.click() # 模擬用戶點擊
2.6 模擬鍵盤操作
需要引入包Keys:
from selenium.webdriver.common.keys import Keys
driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE) #Backspace鍵
driver.find_element_by_id('kw').send_keys(Keys.SPACE) #Space鍵
driver.find_element_by_id('kw').send_keys(Keys.DELETE) #Delete鍵
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a') # CTRL + A
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x') # CTRL + X
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'v') # CTRL + V
driver.find_element_by_id('kw').send_keys(Keys.ENTER) #ENTER鍵
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'c') # CTRL + C
driver.find_element_by_id('kw').send_keys(Keys.TAB) # TAB鍵
2.7 切換window或者Frame
對於現在的web應用程序來說,很少有單個window的情況,都是嵌入了其他的frame。WebDrvier支持使用”switchTO”方法切換到其他window。
切換window
獲取當前driver的所有窗口的方法:
driver.window_handles
切換到新窗口的方法:
driver.switch_to.window(窗口名或者窗口列表下標)
例如:
from selenium import webdriver from time import sleep # 打開chrome瀏覽器,並執行設置 driver = webdriver.Chrome() driver.implicitly_wait(30) driver.maximize_window() # 打開百度首頁 driver.get("https://www.baidu.com") # 輸入 騰訊課堂 driver.find_element_by_id('kw').send_keys('騰訊課堂') # 點擊 百度一下 driver.find_element_by_id("su").click() # 獲取所有窗口 windows = driver.window_handles print('切換之前的窗口{}'.format(windows)) # 點擊騰訊課堂鏈接 driver.find_element_by_xpath('//*[@id="1"]/h3/a[1]').click() sleep(4) # 切換到新窗口 driver.switch_to.window(driver.window_handles[-1]) print('切換后的窗口{}'.format(driver.current_window_handle)) # 點擊登錄按鈕 sleep(5) driver.find_element_by_id('js_login').click()
切換frame(或者iframe)
方法:driver.switch_to.frame(‘’)
例如:
from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.implicitly_wait(30) driver.maximize_window() # 打開百度首頁 driver.get("https://www.baidu.com") # 輸入 騰訊課堂 driver.find_element_by_id('kw').send_keys('騰訊課堂') # 點擊 百度一下 driver.find_element_by_id("su").click() # 獲取所有窗口 windows = driver.window_handles print('切換之前的窗口{}'.format(windows)) # 點擊騰訊課堂鏈接 driver.find_element_by_xpath('//a[contains(text(),"全部課程_在線 培訓 視頻 教程_")]').click() sleep(4) # 切換到新窗口 driver.switch_to.window(driver.window_handles[-1]) print('切換至后的窗口{}'.format(driver.current_window_handle)) # 點擊登錄按鈕 sleep(5) driver.find_element_by_id('js_login').click() sleep(5) # 點擊QQ登錄 driver.find_element_by_xpath('//div[@class="content-btns"]/a[1]').click() # 切換到qq登錄的frame driver.switch_to.frame('login_frame_qq') sleep(5) # 點擊賬號密碼登錄 driver.find_element_by_id('switcher_plogin').click() # 輸入賬號密碼,點確定 driver.find_element_by_id('u').send_keys('xx') driver.find_element_by_id('p').send_keys('xx') driver.find_element_by_id('login_button').click()
2.8 顯式等待和隱式等待
等待方法:
1.強制等待
time.sleep(3)
強制等待,不管你瀏覽器是否加載完,程序都得等待3秒,3秒一到,繼續執行下面的代碼,不建議經常使用這種強制等待方法
2.顯性等待WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(driver, 超時時長, 調用頻率x, 忽略異常).until(可執行方法, 超時時返回的信息)
WebDriverWait,配合該類的until()和until_not()方法,就能夠根據判斷條件而進行靈活地等待了,它主要的意思就是:程序每隔x秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設置的最長時間,然后拋出TimeoutException
例如:
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 打開會話 driver = webdriver.Chrome() driver.get('http://www.baidu.com') driver.find_element_by_id('kw').send_keys('selenium') driver.find_element_by_id('su').click() # 顯性等待,等找到百度翻譯selenium這個鏈接 WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,"//div[@id='5']/h3/a"))) #點擊百度翻譯 driver.find_element_by_xpath("//div[@id='5']/h3/a").click() print(driver.current_url) # driver.quit()
3.隱性等待implicitly_wait
driver.implicitly_wait(30)#在頁面上隱式等待30 秒
隱性等待是設置一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間截止,然后執行下一步。注意這里有一個弊端,那就是程序會一直等待整個頁面加載完成,也就是一般情況下你看到瀏覽器標簽欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在加載完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步
2.9 彈框處理
操作瀏覽器的時候偶爾會遇到彈框,一般彈框分為三種:1、警告類彈框alert(),就是只顯示一個信息,一個確認按鈕那種,用於通知用戶;
2、確認類彈框confirm(),有確定和取消兩個按鈕。
3、消息類彈框,prompt(),需要輸入一些信息后再點擊確認按鈕或者取消按鈕。
這些彈框一般都是JavaScript生成的,定位彈框使用的方法是:
driver.switch_to.alert()
找到彈框后對彈框可以做相應的操作:
text 屬性,返回 alert/confirm/prompt 中的文字信息
accept() 點擊確認按鈕。
dismiss() 點擊取消按鈕,如果有的話。
send_keys() 輸入值,這個 alert\confirm 沒有對話框就不能用了,不然會報錯。
舉例如下:
接受彈窗
driver.switch_to_alert().accept()
得到彈窗的文本消息,比如得到:請輸入用戶名!
message=driver.switch_to_alert().text
print(message)
取消按鈕
driver.switch_to_alert().dismiss()
輸入值
driver.switch_to_alert().send_keys(“hello”)
例如:
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep driver = webdriver.Chrome() 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() sleep(2) # 保存設置 driver.find_element_by_class_name('prefpanelgo').click() sleep(2) # 接受警告框 text = driver.switch_to_alert().text print(text) sleep(5) # 點擊確認按鈕 driver.switch_to_alert().accept() sleep(10) driver.quit()
2.10 下拉菜單處理
假如有一個這樣的下拉菜單,默認選中第三個,我們想選中第一個,怎么選?
源代碼:
<html> <body> <form> <select name="cars"> <option value="volvo">Volvo</option> <option value="saab">Saab</option> <option value="fiat" selected="selected">Fiat</option> <option value="audi">Audi</option> </select> </form> </body> </html>
使用python的webdriver來操作的話,如下:
import time from selenium import webdriver from selenium.webdriver.support.select import Select # 導入選中下拉菜單需要用的包 driver = webdriver.Chrome() driver.get('file:///C:/Users/Administrator/Desktop/a.html') time.sleep(2) # 創建一個Select實例,參數傳的是select菜單的element對象 s = Select(driver.find_element_by_name('cars')) # 第一種方式可以通過索引,索引從0開始,下面這句表示選擇第一個索引的內容Volvo s.select_by_index(0) time.sleep(2) # 第二種方式通過value值,注意value是一個屬性 s.select_by_value('audi') time.sleep(2) # 第三種方式通過顯示出來的文本值 s.select_by_visible_text('Saab')
上面的例子是選擇一個選項,那么怎么取消選擇呢?
用s.deselect_by_index(0)
s.deselect_by_value('audi')
s.deselect_by_visible_text('Saab')
s.deselect_all() # 將所有選中的都取消選擇
all_selected_options屬性是表示哪些元素被選中了,下面可以遍歷一下所有被選中的元素:
options = Select(driver.find_element_by_name('cars')).all_selected_options
for option in options:
print('已經被選中option文本值:' + option.text)
selenium IDE用法簡介
簡單說一下IDE的用法吧,IDE有時候也有點用處,比如你剛開始學習selenium,還不知道怎么下手,可以先用IDE錄制的方式去看看IDE是怎么形成自動化測試代碼的。
selenium IDE的安裝比較簡單,去Firefox的附加組件里面去搜索selenium IDE(注意中間有一個空格),安裝即可,我發的百度網盤鏈接里面也有一個IDE插件,可以直接裝到我發的那個火狐瀏覽器版本里面。
安裝好之后會有一個這個圖標:
這個就是selenium IDE插件了。使用它只需要三步,第一步,點擊它,打開如圖:
執行第二步:回放:
第三步:導出你想要的腳本
導出腳本以后打開,我導出的是Python2,unittest,webdriver,可以主要參考下面這塊,
class TestBaiDu(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.implicitly_wait(30) self.base_url = "https://www.baidu.com/" # self.verificationErrors = [] # self.accept_next_alert = True def test_TestBaiDu(self): driver = self.driver driver.get(self.base_url + "/") driver.find_element_by_id("kw").click() driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys("Python") driver.find_element_by_id("su").click()