Selenium提供了8種定位方式。
· id
· name
· class name
· tag name
· link text
· partial link text
· xpath
· css selector
這8種定位方式在Python selenium中所對應的方法為:
· find_element_by_id()
· find_element_by_name()
· find_element_by_class_name()
· find_element_by_tag_name()
· find_element_by_link_text()
· find_element_by_partial_link_text()
· find_element_by_xpath()
· find_element_by_css_selector()
定位方法的用法
假如我們有一個Web頁面,通過前端工具(如,Firebug)查看到一個元素的屬性是這樣的。
<html> <head> <body link="#0000cc"> <a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})"> <form id="form" class="fm" name="f" action="/s"> <span class="soutu-btn"></span> <input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">
我們的目的是要定位input標簽的輸入框。
· 通過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("//*[@id='kw']") dr.find_element_by_xpath("//*[@name='wd']") dr.find_element_by_xpath("//input[@class='s_ipt']") dr.find_element_by_xpath("/html/body/form/span/input") dr.find_element_by_xpath("//span[@class='soutu-btn']/input") dr.find_element_by_xpath("//form[@id='form']/span/input") dr.find_element_by_xpath("//input[@id='kw' 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 class="mnav" href="http://news.baidu.com" name="tj_trnews">新聞</a> <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
· 通過link text定位:
dr.find_element_by_link_text("新聞") dr.find_element_by_link_text("hao123")
· 通過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")
2 控制瀏覽器操作
控制瀏覽器窗口大小
有時候我們希望能以某種瀏覽器尺寸打開,讓訪問的頁面在這種尺寸下運行。例如可以將瀏覽器設置成移動端大小(480* 800),然后訪問移動站點,對其樣式進行評估;WebDriver提供了set_window_size()方法來設置瀏覽器的大小。
from selenium import webdriver driver = webdriver.Firefox() driver.get("http://m.baidu.com") # 參數數字為像素點 print("設置瀏覽器寬480、高800顯示") driver.set_window_size(480, 800) driver.quit()
在PC端執行自動化測試腳本大多的情況下是希望瀏覽器在全屏幕模式下執行,那么可以使用maximize_window()方法使打開的瀏覽器全屏顯示,其用法與set_window_size() 相同,但它不需要參數。
控制瀏覽器后退、前進
在使用瀏覽器瀏覽網頁時,瀏覽器提供了后退和前進按鈕,可以方便地在瀏覽過的網頁之間切換,WebDriver也提供了對應的back()和forward()方法來模擬后退和前進按鈕。下面通過例子來演示這兩個方法的使用。
from selenium import webdriver driver = webdriver.Firefox() #訪問百度首頁 first_url= 'http://www.baidu.com' print("now access %s" %(first_url)) driver.get(first_url) #訪問新聞頁面 second_url='http://news.baidu.com' print("now access %s" %(second_url)) driver.get(second_url) #返回(后退)到百度首頁 print("back to %s "%(first_url)) driver.back() #前進到新聞頁 print("forward to %s"%(second_url)) driver.forward() driver.quit()
為了看清腳本的執行過程,下面每操作一步都通過print()來打印當前的URL地址。
刷新頁面
有時候需要手動刷新(F5) 頁面。
…… driver.refresh() #刷新當前頁面 ……
3 WebDriver常用方法
點擊和輸入
前面我們已經學習了定位元素, 定位只是第一步, 定位之后需要對這個元素進行操作, 或單擊(按鈕) 或輸入(輸入框) , 下面就來認識 WebDriver 中最常用的幾個方法:
· clear(): 清除文本。
· send_keys (value): 模擬按鍵輸入。
· click(): 單擊元素。
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com") driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() driver.quit()
提交
· submit()
submit()方法用於提交表單。 例如, 在搜索框輸入關鍵字之后的“回車” 操作, 就可以通過該方法模擬。
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com") search_text = driver.find_element_by_id('kw') search_text.send_keys('selenium') search_text.submit() driver.quit()
有時候 submit()可以與 click()方法互換來使用, submit()同樣可以提交一個按鈕, 但 submit()的應用范圍遠不及 click()廣泛。
其他常用方法
· size: 返回元素的尺寸。
· text: 獲取元素的文本。
· get_attribute(name): 獲得屬性值。
· is_displayed(): 設置該元素是否用戶可見。
from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com") # 獲得輸入框的尺寸 size = driver.find_element_by_id('kw').size print(size) # 返回百度頁面底部備案信息 text = driver.find_element_by_id("cp").text print(text) # 返回元素的屬性值, 可以是 id、 name、 type 或其他任意屬性 attribute = driver.find_element_by_id("kw").get_attribute('type') print(attribute) # 返回元素的結果是否可見, 返回結果為 True 或 False result = driver.find_element_by_id("kw").is_displayed() print(result) driver.quit()
輸出結果:
{'width': 500, 'height': 22}
©2015 Baidu 使用百度前必讀 意見反饋 京 ICP 證 030173 號
text
True
執行上面的程序並查看結果: size 方法用於獲取百度輸入框的寬、 高, text 方法用於獲得百度底部的備案信息,get_attribute()用於獲得百度輸入的 type 屬性的值, is_displayed()用於返回一個元素是否可見, 如果可見則返回True, 否則返回 False。
4 鼠標事件
在 WebDriver 中, 將這些關於鼠標操作的方法封裝在 ActionChains 類提供。
ActionChains 類提供了鼠標操作的常用方法:
· perform(): 執行所有 ActionChains 中存儲的行為;
· context_click(): 右擊;
· double_click(): 雙擊;
· drag_and_drop(): 拖動;
· move_to_element(): 鼠標懸停。
鼠標懸停操作
from selenium import webdriver # 引入 ActionChains 類 from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://www.baidu.cn") # 定位到要懸停的元素 above = driver.find_element_by_link_text("設置") # 對定位到的元素執行鼠標懸停操作 ActionChains(driver).move_to_element(above).perform() ……
· from selenium.webdriver import ActionChains
導入提供鼠標操作的 ActionChains 類。
· ActionChains(driver)
調用 ActionChains()類, 將瀏覽器驅動 driver 作為參數傳入。
· move_to_element(above)
context_click()方法用於模擬鼠標右鍵操作, 在調用時需要指定元素定位。
· perform()
執行所有 ActionChains 中存儲的行為, 可以理解成是對整個操作的提交動作。
5 鍵盤事件
Keys()類提供了鍵盤上幾乎所有按鍵的方法。 前面了解到, send_keys()方法可以用來模擬鍵盤輸入, 除此 之外, 我們還可以用它來輸入鍵盤上的按鍵, 甚至是組合鍵, 如 Ctrl+A、 Ctrl+C 等。
from selenium import webdriver # 引入 Keys 模塊 from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get("http://www.baidu.com") # 輸入框輸入內容 driver.find_element_by_id("kw").send_keys("seleniumm") # 刪除多輸入的一個 m driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) # 輸入空格鍵+“教程” driver.find_element_by_id("kw").send_keys(Keys.SPACE) driver.find_element_by_id("kw").send_keys("教程") # ctrl+a 全選輸入框內容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a') # ctrl+x 剪切輸入框內容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x') # ctrl+v 粘貼內容到輸入框 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v') # 通過回車鍵來代替單擊操作 driver.find_element_by_id("su").send_keys(Keys.ENTER) driver.quit()
需要說明的是, 上面的腳本沒有什么實際意義, 僅向我們展示模擬鍵盤各種按鍵與組合鍵的用法。
· from selenium.webdriver.common.keys import Keys
在使用鍵盤按鍵方法前需要先導入 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) 鍵盤 F1
· ……
· send_keys(Keys.F12) 鍵盤 F12
6 獲取斷言信息
不管是在做功能測試還是自動化測試,最后一步需要拿實際結果與預期進行比較。這個比較的稱之為斷言。
我們通常可以通過獲取title 、URL和text等信息進行斷言。text方法在前面已經講過,它用於獲取標簽對之間的文本信息。 下面同樣以百度為例,介紹如何獲取這些信息。
from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get("https://www.baidu.com") print('Before search================') # 打印當前頁面title title = driver.title print(title) # 打印當前頁面URL now_url = driver.current_url print(now_url) driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() sleep(1) print('After search================') # 再次打印當前頁面title title = driver.title print(title) # 打印當前頁面URL now_url = driver.current_url print(now_url) # 獲取結果數目 user = driver.find_element_by_class_name('nums').text print(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... 搜索工具 百度為您找到相關結果約5,380,000個
· title:用於獲得當前頁面的標題。
· current_url:用戶獲得當前頁面的URL。
· text:獲取搜索條目的文本信息。
7 設置元素等待
WebDriver提供了兩種類型的等待:顯式等待和隱式等待。
顯式等待
顯式等待使WebdDriver等待某個條件成立時繼續執行,否則在達到最大時長時拋出超時異常(TimeoutException)。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://www.baidu.com") element = WebDriverWait(driver, 5, 0.5).until( EC.presence_of_element_located((By.ID, "kw")) ) element.send_keys('selenium') driver.quit()
WebDriverWait類是由WebDirver 提供的等待方法。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過設置時間檢測不到則拋出異常。具體格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
· driver :瀏覽器驅動。
· timeout :最長超時時間,默認以秒為單位。
· poll_frequency :檢測的間隔(步長)時間,默認為0.5S。
· ignored_exceptions :超時后的異常信息,默認情況下拋NoSuchElementException異常。
WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的說明。 * until(method, message=‘’) 調用該方法提供的驅動程序作為一個參數,直到返回值為True。 * until_not(method, message=‘’)調用該方法提供的驅動程序作為一個參數,直到返回值為False。
在本例中,通過as關鍵字將expected_conditions 重命名為EC,並調用presence_of_element_located()方法判斷元素是否存在。
隱式等待
WebDriver提供了implicitly_wait()方法來實現隱式等待,默認設置為0。它的用法相對來說要簡單得多。
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from time import ctime driver = webdriver.Firefox() # 設置隱式等待為10秒 driver.implicitly_wait(10) driver.get("http://www.baidu.com") try: print(ctime()) driver.find_element_by_id("kw22").send_keys('selenium') except NoSuchElementException as e: print(e) finally: print(ctime()) driver.quit()
implicitly_wait()默認參數的單位為秒,本例中設置等待時長為10秒。首先這10秒並非一個固定的等待時間,它並不影響腳本的執行速度。其次,它並不針對頁面上的某一元素進行等待。當腳本執行到某個元素定位時,如果元素可以定位,則繼續執行;如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。假設在第6秒定位到了元素則繼續執行,若直到超出設置時長(10秒)還沒有定位到元素,則拋出異常。
8 定位一組元素
WebDriver還提供了8種用於定位一組元素的方法。
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
定位一組元素的方法與定位單個元素的方法類似,唯一的區別是在單詞element后面多了一個s表示復數。
接下來通過例子演示定位一組元素的使用:
from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get("https://www.baidu.com") driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() sleep(1) # 定位一組元素 texts = driver.find_elements_by_xpath('//div/h3/a') # 循環遍歷出每一條搜索結果的標題 for t in texts: print(t.text) driver.quit()
程序運行結果:
Selenium - Web Browser Automation
官網
功能自動化測試工具——Selenium篇
selenium + python自動化測試環境搭建 - 蟲師 - 博客園
selenium是什么?_百度知道
怎樣開始用selenium進行自動化測試(個人總結)_百度經驗
Selenium_百度百科
selenium_百度翻譯
Selenium官網教程_selenium自動化測試實踐_Selenium_領測軟件測試網
Selenium(瀏覽器自動化測試框架)_百度百科
自動化基礎普及之selenium是啥? - 蟲師 - 博客園
python十大主流開源框架 「菜鳥必看」