Selenium WebDriver API 進階使用,模塊化參數化進行自動化測試設計

WebDriver API 進階使用

元素定位

咱們知道,WebDriver API的調用以及自動化測試,務必從頁面元素的定位開始,WebDriver提供了一系列的定位符以便使用元素定位方法。常見的定位符有如下幾種:css

  • id
  • name
  • class name
  • tag
  • link text
  • partial link text
  • xpath
  • css selector

那麼咱們如下的操做將會基於上述的定位符進行定位操做。html

對於元素的定位,WebDriver API能夠經過定位簡單的元素和一組元素來操做。在這裏,咱們須要告訴Selenium如何去找元素,以致於他能夠充分的模擬用戶行爲,或者經過查看元素的屬性和狀態,以便咱們執行一系列的檢查。node

在Selenium2中,WebDriver提供了多種多樣的find_element_by方法在一個網頁裏面查找元素。這些方法經過提供過濾標準來定位元素。固然WebDriver也提供了一樣多種多樣的find_elements_by的方式去定位多個元素。web

Selenium2提供的8個find_element_by方法去定位元素。在這裏咱們來具體查看每一個方法的詳細使用方式。下面的表格將會列出這些具體的方法:面試

方法Method 描述Description 參數Argument 示例Example
id 該方法經過ID的屬性值去定位查找單個元素 id: 須要被查找的元素的ID find_element_by_id('search')
name 該方法經過name的屬性值去定位查找單個元素 name: 須要被查找的元素的名稱 find_element_by_name('q')
class name 該方法經過class的名稱值去定位查找單個元素 class_name: 須要被查找的元素的類名 find_element_by_class_name('input-text')
tag_name 該方法經過tag的名稱值去定位查找單個元素 tag: 須要被查找的元素的標籤名稱 find_element_by_tag_name('input')
link_text 該方法經過連接文字去定位查找單個元素 link_text: 須要被查找的元素的連接文字 find_element_by_link_text('Log In')
partial_link_text 該方法經過部分連接文字去定位查找單個元素 link_text: 須要被查找的元素的部分連接文字 find_element_by_partial_link_text('Long')
xpath 該方法經過XPath的值去定位查找單個元素 xpath: 須要被查找的元素的xpath find_element_by_xpath('//*[@id="xx"]/a')
css_selector 該方法經過CSS選擇器去定位查找單個元素 css_selector: 須要被查找的元素的ID find_element_by_css_selector('#search')

接下來的列表將會詳細展現find_elements_by的方法集合。這些方法依據匹配的具體標準返回一系列的元素。瀏覽器

方法Method 描述Description 參數Argument 示例Example
id 該方法經過ID的屬性值去定位查找多個元素 id: 須要被查找的元素的ID find_elements_by_id('search')
name 該方法經過name的屬性值去定位查找多個元素 name: 須要被查找的元素的名稱 find_elements_by_name('q')
class_name 該方法經過class的名稱值去定位查找多個元素 class_name: 須要被查找的元素的類名 find_elements_by_class_name('input-text')
tag_name 該方法經過tag的名稱值去定位查找多個元素 tag: 須要被查找的元素的標籤名稱 find_elements_by_tag_name('input')
link_text 該方法經過連接文字去定位查找多個元素 link_text: 須要被查找的元素的連接文字 find_elements_by_link_text('Log In')
partial_link_text 該方法經過部分連接文字去定位查找多個元素 link_text: 須要被查找的元素的部分連接文字 find_elements_by_partial_link_text('Long')
xpath 該方法經過XPath的值去定位查找多個元素 xpath: 須要被查找的元素的xpath find_elements_by_xpath("//div[contains(@class,'list')]")
css_selector 該方法經過CSS選擇器去定位查找多個元素 css_selector: 須要被查找的元素的ID find_element_by_css_selector('.input_class')

依據ID查找

請查看以下HTML的代碼,以便實現經過ID的屬性值去定義一個查找文本框的查找:bash

<input id="search" type="text" name="q" value=""
       class="input-text" maxlength="128" autocomplete="off"/>

複製代碼

根據上述代碼,這裏咱們使用find_element_by_id()的方法去查找搜索框而且檢查它的最大長度maxlength屬性。咱們經過傳遞ID的屬性值做爲參數去查找,參考以下的代碼示例:app

def test_search_text_field_max_length(self):
    # get the search textbox
    search_field = self.driver.find_element_by_id("search")
    # check maxlength attribute is set to 128
    self.assertEqual("128", search_field.get_attribute("maxlength"))

複製代碼

若是使用find_elements_by_id()方法,將會返回全部的具備相同ID屬性值的一系列元素。框架

依據名稱name查找

這裏仍是根據上述ID查找的HTML代碼,使用find_element_by_name的方法進行查找。參考以下的代碼示例:模塊化

# get the search textbox
self.search_field = self.driver.find_element_by_name("q")

複製代碼

一樣,若是使用find_elements_by_name()方法,將會返回全部的具備相同name屬性值的一系列元素。

依據class name查找

除了上述的ID和name的方式查找,咱們還可使用class name的方式進行查找和定位。

事實上,經過ID,name或者類名class name查找元素是最提倡推薦的和最快的方式。固然Selenium2 WebDriver也提供了一些其餘的方式,在上述三類方式條件不足,查找無效的時候,能夠經過這些其餘方式來查找。這些方式將會在後續的內容中講述。

請查看以下的HTML代碼,經過改代碼進行練習和理解.

<button type="submit" title="Search" class="button">
  <span><span>Search</span></span>
</button>

複製代碼

根據上述代碼,使用find_element_by_class_name()方法去定位元素。

def test_search_button_enabled(self):
    # get Search button
    search_button = self.driver.find_element_by_class_name("button")
    # check Search button is enabled
    self.assertTrue(search_button.is_enabled())

複製代碼

一樣的若是使用find_elements_by_class_name()方法去定位元素,將會返回全部的具備相同name屬性值的一系列元素。

依據標籤名tag name查找

利用標籤的方法相似於利用類名等方法進行查找。咱們能夠輕鬆的查找出一系列的具備相同標籤名的元素。例如咱們能夠經過查找表中的<tr>來獲取行數。

下面有一個HTML的示例,這裏在無序列表中使用了<img>標籤。

<ul class="promos">
    <li>
        <a href="http://demo.magentocommerce.com/home-decor.html">
            <img src="/media/wysiwyg/homepage-three-column-promo- 01B.png" alt="Physical & Virtual Gift Cards">
        </a>
    </li>
    <li>
        <a href="http://demo.magentocommerce.com/vip.html">
            <img src="/media/wysiwyg/homepage-three-column-promo- 02.png" alt="Shop Private Sales - Members Only">
        </a>
    </li>
    <li>
        <a href="http://demo.magentocommerce.com/accessories/ bags-luggage.html">
            <img src="/media/wysiwyg/homepage-three-columnpromo- 03.png" alt="Travel Gear for Every Occasion">
        </a>
    </li>
</ul>

複製代碼

這裏面咱們使用find_elements_by_tag_name()的方式去獲取所有的圖片,在此以前,咱們將會使用find_element_by_class_name()去獲取到指定的<ul>

具體代碼以下:

def test_count_of_promo_banners_images(self):
    # get promo banner list
    banner_list = self.driver.find_element_by_class_name("promos")
    # get images from the banner_list
    banners = banner_list.find_elements_by_tag_name("img")
    # check there are 20 tags displayed on the page
    self.assertEqual(20, len(banners))

複製代碼

依據連接文字link查找

連接文字查找一般比較簡單。使用find_element_by_link_text請查看如下示例

<a href="#header-account" class="skip-link skip-account">
    <span class="icon"></span>
    <span class="label">Account</span>
</a>

複製代碼

測試代碼以下:

def test_my_account_link_is_displayed(self):
    # get the Account link
    account_link =
    self.driver.find_element_by_link_text("ACCOUNT")
    # check My Account link is displayed/visible in
    # the Home page footer
    self.assertTrue(account_link.is_displayed())

複製代碼

依據部分連接文字partial text查找

這裏依舊使用上述的列子進行代碼編寫:

def test_account_links(self):
    # get the all the links with Account text in it
    account_links = self.driver.\\
    find_elements_by_partial_link_text("ACCOUNT")
    # check Account and My Account link is
    displayed/visible in the Home page footer
    self.assertTrue(2, len(account_links)) 

複製代碼

依據XPath進行查找

XPath是一種在XML文檔中搜索和定位節點node的一種查詢語言。全部的主流Web瀏覽器都支持XPath。Selenium2能夠用強大的XPath在頁面中查找元素。

經常使用的XPath的方法有starts-with()contains()ends-with()

若是對軟件測試、接口測試、自動化測試、性能測試、LR腳本開發、面試經驗交流。感興趣能夠175317069,羣內會有不按期的發放免費的資料連接,這些資料都是從各個技術網站蒐集、整理出來的,若是你有好的學習資料能夠私聊發我,我會註明出處以後分享給你們。

以下有一段HTML代碼,其中裏面的<img>沒有使用ID,name或者類屬性,因此咱們沒法使用以前的方法。亞這裏咱們能夠經過<img>alt屬性,定位到指定的tag。

<ul class="promos">
    <li>
        <a href="http://demo.magentocommerce.com/home-decor.html">
            <img src="/media/wysiwyg/homepage-three-column-promo- 01B.png" alt="Physical & Virtual Gift Cards">
        </a>
    </li>
    <li>
        <a href="http://demo.magentocommerce.com/vip.html">
            <img src="/media/wysiwyg/homepage-three-column-promo- 02.png" alt="Shop Private Sales - Members Only">
        </a>
    </li>
    <li>
        <a href="http://demo.magentocommerce.com/accessories/ bags-luggage.html">
            <img src="/media/wysiwyg/homepage-three-columnpromo- 03.png" alt="Travel Gear for Every Occasion">
        </a>
    </li>
</ul>

複製代碼

具體代碼以下:

def test_vip_promo(self):
    # get vip promo image
    vip_promo = self.driver.\\
    find_element_by_xpath("//img[@alt='Shop Private Sales - Members Only']")
    # check vip promo logo is displayed on home page
    self.assertTrue(vip_promo.is_displayed())
    # click on vip promo images to open the page
    vip_promo.click()
    # check page title
    self.assertEqual("VIP", self.driver.title)

複製代碼

固然,若是使用find_elements_by_xpath()的方法,將會返回全部匹配了XPath查詢的元素。

依據CSS選擇器進行查找

CSS是一種設計師用來描繪HTML文檔的視覺的層疊樣式表。通常來講CSS用來定位多種多樣的風格,同時能夠用來是一樣的標籤使用一樣的風格等。相似於XPath,Selenium2也可使用CSS選擇器來定位元素。

請查看以下的HTML文檔。

<div class="minicart-wrapper">
    <p class="block-subtitle">Recently added item(s)
        <a class="close skip-link-close" href="#" title="Close">×</a>
    </p>
    <p class="empty">You have no items in your shopping cart.
    </p>
</div>

複製代碼

咱們來建立一個測試,驗證這些消息是否正確。

def test_shopping_cart_status(self):
    # check content of My Shopping Cart block on Home page
    # get the Shopping cart icon and click to open the
    # Shopping Cart section
    shopping_cart_icon = self.driver.\\
    find_element_by_css_selector("div.header-minicart span.icon")
    shopping_cart_icon.click()
    # get the shopping cart status
    shopping_cart_status = self.driver.\\
    find_element_by_css_selector("p.empty").text
    self.assertEqual("You have no items in your shopping cart.",
    shopping_cart_status)
    # close the shopping cart section
    close_button = self.driver.\\
    find_element_by_css_selector("div.minicart-wrapper a.close")
    close_button.click()

複製代碼

鼠標事件

Web測試中,有關鼠標的操做,不僅是單擊,有時候還要作右擊、雙擊、拖動等操做。這些操做包含在ActionChains類中。

經常使用的鼠標方法:

  • context_click() ##右擊
  • douch_click() ##雙擊
  • drag_and_drop() ##拖拽
  • move_to_element() ##鼠標停在一個元素上
  • click_and_hold() # 按下鼠標左鍵在一個元素上

例子:

#圖3.4
#如圖3.x4,假如一個web 應用的列表文件提供了右擊彈出快捷菜單的的操做。能夠經過context_click()
#方法模擬鼠標右鍵,參考代碼以下:
#引入ActionChains 類
from selenium.webdriver.common.action_chains import ActionChains
...
#定位到要右擊的元素
right =driver.find_element_by_xpath("xx")
#對定位到的元素執行鼠標右鍵操做
ActionChains(driver).context_click(right).perform()

複製代碼
#引入ActionChains 類
from selenium.webdriver.common.action_chains import ActionChains
...
#定位到要雙擊的元素
double =driver.find_element_by_xpath("xxx")
#對定位到的元素執行鼠標雙擊操做
ActionChains(driver).double_click(double).perform()

複製代碼

鍵盤事件

鍵盤操做常常處理的以下:

代碼 描述
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)

代碼以下

#coding=utf-8
from selenium import webdriver
#引入Keys 類包
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)
#刪除多輸入的一個m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
time.sleep(3)
#輸入空格鍵+「教程」
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
time.sleep(3)
#ctrl+a 全選輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')

複製代碼

模塊化與類庫

線性測試

至此以前,咱們介紹的測試腳本,儘管使用了unittest測試框架,可是測試是按照指定的線路進行的,是線性的測試,徹底遵循了腳本的執行順序。

測試腳本1

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://wwww.xxx.com")
driver.find_element_by_id("tbUserName").send_keys("username")
driver.find_element_by_id("tbPassword").send_keys("123456")
driver.find_element_by_id("btnLogin").click()
#執行具體用例操做
......
driver.quit ()

複製代碼

如上圖,其實登陸的模塊能夠共用。

模塊化

模塊話是自動化測試的第一個延伸和基礎。須要對自動化重複編寫的腳本進行重構(refactor),將重複的腳本抽取出來,放到指定的代碼文件中,做爲共用的功能模塊。

測試腳本1:Login.py

#登陸模塊
def login():
driver.find_element_by_id("tbUserName").send_keys("username")
driver.find_element_by_id("tbPassword").send_keys("456123")
driver.find_element_by_id("btnLogin").click()

複製代碼

另外一份文件 quit.py

#退出模塊
def quit():
..............

複製代碼

自動化的測試:代碼以下

#coding=utf-8
from selenium import webdriver
import login,quit_ #調用登陸、退出模塊
driver = webdriver.Firefox()
driver.get("http://wwww.xxx.com")
#調用登陸模塊
login.login()
#其它個性化操做
......
#調用退出模塊
quit.quit()

複製代碼

參數化驅動

數據驅動

若是說模塊化是自動化測試的第一步,那麼數據驅動是自動化的第二步,從本意上來說。數據改變動新驅動自動化的執行。從而引發測試結果的改變。其實相似於參數化。

示例代碼

#coding=utf-8
from selenium import webdriver
import time
values=['selenium','webdriver',u'軟件自動化測試']
# 執行循環
for serch in values:
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    driver.find_element_by_id("kw").send_keys(serch)
    time.sleep(3)
    .....

複製代碼

關於參數化驅動,咱們能夠將數據放到csv中,而後經過讀取csv的數據進行自動化測試。

關鍵字驅動

這裏的數據換成了特別的數據,就是關鍵字。

相關文章
相關標籤/搜索