Pythone4_Selenium實戰

 

 

 

 

 

 

 

Pythone_Selenium實戰javascript

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

自動化測試基礎

什麼樣的項目適合自動化測試php

1,任務測試明確,不會頻繁變更css

2,每日構建後的測試驗證;html

3,比較頻繁的迴歸測試;java

4,軟件系統界面穩定,變更少node

5,須要在多平臺運行的相同案例、組合遍歷型的測試、大量重複任務;python

6,軟件維護週期長;linux

7,項目進度壓力不大;android

8,被測軟件系統開發比較規範,可以保證系統的可測試性;git

9,具有大量的自動化測試平臺

10,測試人員具有較強的編程能力

以上具有 3個條件,既能夠開展;

 

什麼是 Selenium?


Selenium 自動化測試工具,它主要是用於 Web 應用程序的自動化測試,但並不僅侷限於此,它還支
持全部基於 web 的管理任務自動化。
Selenium 的特色:
l開源,免費
l多瀏覽器支持:FireFox、Chrome、IE、Opera
l多平臺支持:linux 、windows、MAC
l多語言支持:java、Python、Ruby、php、C#、JavaScript
l對 web 頁面有良好的支持
l簡單(API 簡單)、靈活(用開發語言驅動)
l支持分佈式測試用例執行

 

 

 

 

 

 

 

腳本編輯環境搭建

 

Phthon安裝

https://www.python.org/downloads/windows/

環境變量配置

步驟:a: 右鍵 個人電腦�>屬性->高級系統設置->環境變量配置 

 

步驟:   b: 在系統變量中點擊 新建,輸入以下內容(注意變量名能夠隨便取,變量值就是python的安裝目錄) 

 

步驟:c: 在系統變量中找到 Path->選擇編輯->新建,輸入%PYTHON_HOME%PYTHON_HOME就是上一步中的變量名),接着在新建再輸入以下內容:%PYTHON_HOME%\Scripts%PYTHON_HOME%\DLLs%PYTHON_HOME%\Lib\lib-tk (注意:後面這幾個是爲了使用pip,esay_install而添加的,若是不須要則可不用添加了)

 

瀏覽器環境搭建

 

 FireFox、  Chrome

 

安裝瀏覽器驅動driver

     1.chromedriver 下載地址:https://code.google.com/p/chromedriver/downloads/list

     2.Firefo驅動下載地址:https://github.com/mozilla/geckodriver/releases/

注意:下載解壓後,將chromedriver.exe , geckodriver.exe , Iedriver.exe發到Python的安裝目錄,例如 D:\python 。 而後再將Python的安裝目錄添加到系統環境變量的Path下面。

FireFox 須要安裝插件 : Firebug、Firepath、Xpath find;

 

Chrome須要安裝插件:     x path for free

編寫第一個自動化腳本

#coding = utf-8
#導入webdriver驅動
from selenium import  webdriver
#webdriver  Firefox 賦值給 browser
driver = webdriver.Firefox()
#給瀏覽器 定義一個地址
driver.get('http://www.baidu.com')
#查找元素,同時輸入selenium2
driver.find_element_by_id("kw").send_keys("selenium2")
#查找元素 點擊提交
driver.find_element_by_id("su").click()
#關閉
driver.quit()

 

WebDriver API

 

ID定位 (www.baidu.com)

driver.find_element_by_id("kw")

 

Name定位(http://www.csdn.net/)

 

find_element_by_name("passwordtwo")

 

 

Class定位

find_element_by_class_name("s_ipt")

Tag定位

find_element_by_tag_name("input")
find_element_by_tag_name("input") 

 

Link定位

link 定位與前面介紹的幾種定位方法有所不一樣,它專門用來定位本連接。百度輸入框上面的幾個文本
連接的代碼以下:
<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新聞</a>
<a class="mnav" name="tj_trhao123" href="http://www.hao123.com">hao123</a>
<a class="mnav" name="tj_trmap" href="http://map.baidu.com">地圖</a>
<a class="mnav" name="tj_trvideo" href="http://v.baidu.com">視頻</a>
<a class="mnav" name="tj_trtieba" href="http://tieba.baidu.com">貼吧>

find_element_by_link_text("新聞")
find_element_by_link_text("hao123")

find_element_by_link_text()方法經過元素標籤對之間的部分文本信息來定位元素

 

Partial link定位

parial link 定位是對 link 定們的一個種補充,有些文本鏈接會比較長,這個時候咱們能夠取文本連接的

有一部分定位,只要這一部分信息能夠惟一的標識這個連接。
<a class="mnav" name="tj_lang" href="#">一個很長很長的文本連接</a>
經過 partial link 定位以下:
find_element_by_partial_link_text("一個很長的")
find_element_by_partial_link_text("文本鏈接")

 

Xpath定位

//表示當前頁面某個目錄下,input 表示定位元素的標籤名,[@id='kw'] 表示這個元素的 id 屬性值等於
kw。下面經過 name class 屬性值來定位。
find_element_by_xpath("//input[@id='wd']")
find_element_by_xpath("//input[@class='s_ipt']")
find_element_by_xpath("//*[@class='bg s_btn']")
若是不想指定標籤名也能夠用星號(*)代替。固然,使用 XPath 不只僅只侷限在 idname class
三個屬性值,元素的任意屬性值均可以使用,只要它能惟一的標識一個元素。
find_element_by_xpath("//input[@maxlength='100']")
find_element_by_xpath("//input[@autocomplete='off']")
find_element_by_xpath("//input[@type='submit']")

假如百度輸入框自己沒有可利用的屬性值,咱們能夠查找它的上一級屬性。好比,「小明」剛出生的
時候沒有名字,沒上戶口(沒身份證號),那麼親朋好友來找「小明」能夠先到小明的爸爸,由於他爸爸
是有不少屬性特徵的,找到了小明的爸爸,抱在懷裏的必定就是小明瞭。經過 XPath 描述以下:
Selenium2 Python 自動化測試實戰》樣張
66
find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")
find_element_by_xpath("//span[@class='bg s_btn_wr']/input")
span[@class='bg s_ipt_wr'] 經過 class 屬性定位到是父元素,後面/input 也就表示父元素下面標籤名爲
input 的子元素。若是父元素沒有可利用的屬性值,那麼能夠繼續向上查找「爺爺」元素。
find_element_by_xpath("//form[@id='form']/span/input")
find_element_by_xpath("//form[@id='form']/span[2]/input")

使用邏輯運算符
若是一個屬性不能惟一的區分一個元素,咱們還可使用邏輯運算符鏈接多個屬性來區別於其它屬
性。
……
<input id="kw" class="su" name="ie">
<input id="kw" class="aa" name="ie">
<input id="bb" class="su" name="ie">
……
如上面的三行元素,假如咱們如今要定位第一行元素,若是使用 id 將會與第二行元素重名,若是使用
class 將會與第三行元素的重名。那麼若是同時使用 id class 就會惟一的標識這個元素。那麼這個時候就
能夠經過邏輯運算符號鏈接。
find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")
固然,咱們也能夠用 and 鏈接更多的屬性來惟一的標識一個元素

Css定位

"百度搜索框"

<span class="soutu-btn"/>

<input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off"/>

<a id="quickdelete" class="quickdelete" href="javascript:;" title="清空" style="top: 0px; right: 0px; display: none;"/

 

  「百度提交按鈕」

<span class="bg s_btn_wr">

<input id="su" class="bg s_btn btnhover" value="百度一下" type="submit"/>

</span>

 

 

經過class 屬性定位:

find_element_by_css_selector(".s_ipt")

find_element_by_css_selector(".bg s btn btnhover")

經過id 屬性定位:

find_element_by_css_selector("#kw")

find_element_by_css_selector("#su")

經過標籤名定位:

find_element_by_css_selector("input")

經過父子關係定位:

find_element_by_css_selector("span>input")

上面的寫法表示有父親元素,它的標籤名叫 span,查找它的全部標籤名叫 input 的子元素

經過屬性定位:

find_element_by_css_selector("input[autocomple='off']"

find_element_by_css_selector("input[maxlength='255']")

find_element_by_css_selector("iniput[type='submit']")

在css當中也可使用元素的任意屬性,只要這些熟悉能夠惟一的標識這個元素。

組合定位:

find_element_by_css_selector("span.bg s_ipt_wr>input.s_ipt")

find_element_by_cess_selector("span.bg S_ipt_wr>input#su")

 

用By定位元素

from  selenium.webdriver.common.by import By

具體經過哪一種定位方式(id name)根據實際場景而定位,By 就能夠設
置定位策略

find_elenium(By.ID,"kw")

find_elenium(By.NAME,"wd")

find_elenium(By.CLASS_NAME,"s_ipt")

find_elenium(By.TAG_NAME,"input")

find_elenium(By.LINK_TEXT,u"新聞")

find_elenium(By.PARTIAL_LINK_TEXT,u"新聞")

find_elenium(By.XPATH,"//*[@class='bg s_btn]")

find_elenium(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")

控制瀏覽器

#設置瀏覽器大小
driver.set_window_size(480,800)

 

#設置瀏覽器最大化
driver.maximize_window()

瀏覽器的前進、後退

driver.get("http://www.baidu.com")

driver.get("http://news.baidu.com")

driver.back()

driver.forward()

簡單元素操做

clear()  清除文本、send_keys(*value) 輸入 、click()點擊元素;

案例: 登陸github

from selenium import webdriver

import time

driver = webdriver.Firefox()
driver.get("https://github.com/")

driver.find_element_by_xpath(".//*[@id='user[login]']").click()
driver.find_element_by_xpath(".//*[@id='user[email]']").send_keys("ppppppppppppppppp")
paswd=driver.find_element_by_xpath(".//*[@id='user[password]']")

paswd.send_keys("0000000000000000000000000000000000000")
paswd.clear()

time.sleep(100)
driver.quit()

 

注意 :接口提交數據使用submit()要求提交對象是一個表單

driver.find_element_by_xpath("xxxxx").submit()

 

 

l size 返回元素的尺寸。
l text 獲取元素的文本。

user=driver.find_element_by_xpath(".//*[@id='user[login]']").size

email=driver.find_element_by_xpath("html/body/div[4]/div[6]/div[2]/form/p").text

print(user)

print(email)


l get_attribute(name) 得到屬性值。


user=driver.find_element_by_xpath(".//*[@id='user[login]']").get_attribute("type")

get_attribute 能夠獲取 id、class、name、type


l is_displayed() 設置該元素是否用戶可見ss

#返回元素的結果是否可見,返回結果爲 True False

email=driver.find_element_by_xpath("html/body/div[4]/div[6]/div[2]/form/p").is_displayed()

鼠標事件

ActionChains 類提供的鼠標操做的經常使用方法:


l perform() 執行全部 ActionChains 中存儲的行爲
l context_click() 右擊
l double_click() 雙擊
l drag_and_drop() 拖動
l move_to_element() 鼠標懸停

 

#定位到要右擊的元素
right_click =driver.find_element_by_id("xx")
#對定位到的元素執行鼠標右鍵操做
ActionChains(driver).context_click(right_click).perform()

 

 

from selenium.webdriver import ActionChains
對於 ActionChains 類下面的方法,在使用以前須要先將模塊導入。
ActionChains(driver)
調用 ActionChains()方法,在使用將瀏覽器驅動 driver 做爲參數傳入。
context_click(right_click)
context_click()方法用於模擬鼠標右鍵事件,在調用時須要傳入右鍵的元素。
perform()
執行全部 ActionChains 中存儲的行爲,能夠理解成是對整個操做事件的提交動做

 

鼠標懸浮操做

#定位到要懸停的元素
above =driver.find_element_by_id("xx")
#對定位到的元素執行懸停操做
ActionChains(driver).move_to_element(above).perform()

 

鼠標雙擊操做

 

#定位到要懸停的元素
double_click = driver.find_element_by_id("xx")
#對定位到的元素執行雙擊操做
ActionChains(driver).double_click(double_click).perform()

 

鼠標堆放操做(拖動操做)

 

#定位元素的源位置
element = driver.find_element_by_name("xxx")
#定位元素要移動到的目標位置
target = driver.find_element_by_name("xxx")
#執行元素的拖放操做
ActionChains(driver).drag_and_drop(element,target).perform()

 

鍵盤事件

 

from selenium.webdriver.common.keys import Keys

 

#輸入框輸入內容
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(u"教程")
#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)

 

得到驗證信息

得到驗證處理 經常使用經過 title 和 URL   text 、get_attribute() 獲取屬性值

 

#獲取頁面 title
driver.title
#獲取頁面URL
driver.current_url
#獲取指定位置的,文本 信息
driver.find_element_by_xpath().text

 

#獲取頁面 title
title=driver.title
#獲取頁面URL
url=driver.current_url
#獲取指定位置的,文本 信息
baid=driver.find_element_by_xpath(".//*[@id='su']").get_attribute("value")

 

設置元素等待

顯示等待:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.common.by import By

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 - WebDriver 的驅動程序(IeFirefoxChrome 等)
timeout - 最長超時時間,默認以秒爲單位

until()
WebDriverWait()通常由 until()(或 until_not())方法配合使用,下面是 until()until_not()方法的說明。
until(method, message=’ ’)
調用該方法提供的驅動程序做爲一個參數,直到返回值爲 Ture
until_not(method, message=’ ’)
調用該方法提供的驅動程序做爲一個參數,直到返回值爲 False


Expected Conditions


在本例中, 咱們在使用 expected_conditions 類時對其時行了重命名, 經過 as 關鍵字對其重命名爲 EC
並調用 presence_of_element_located()判斷元素是否存在。
expected_conditions 類提供一些預期條件的實現。
title_is 用於判斷標題是否 xx
title_contains 用於判斷標題是否包含 xx 信息。
presence_of_element_located 元素是否存在。
visibility_of_element_located 元素是否可見。
visibility_of 是否可見
presence_of_all_elements_located 判斷一組元素的是否存在
text_to_be_present_in_element 判斷元素是否有 xx 文本信息
text_to_be_present_in_element_value 判斷元素值是否有 xx 文本信息
frame_to_be_available_and_switch_to_it 表單是否可用,並切換到該表單。
invisibility_of_element_located 判斷元素是否隱藏
element_to_be_clickable 判斷元素是否點擊,它處於可見和啓動狀態
staleness_of 等到一個元素再也不是依附於 DOM
element_to_be_selected 被選中的元素。

element_located_to_be_selected 一個指望的元素位於被選中。
element_selection_state_to_be 一個指望檢查若是給定的元素被選中。
element_located_selection_state_to_be 指望找到一個元素並檢查是否選擇狀態
alert_is_present 預期一個警告信息

隱式等待

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.common.by import By

driver=webdriver.Firefox()
driver.get("http://www.baidu.com")

driver.implicitly_wait(10)

 

休眠設置

from time import sleep

 

sleep(2)

 

定位一組元素

 

經過 find_elements_xxx  

 

若是遇到 checkbox 點擊操做:

 

 1,driver.find_element_by_xx().pop().click()

 

 2, ActionChains(driver).double_click(driver.find_element_by_xx).perform()

 

若是遇到重複多的 須要進行過濾:

#而後從中過濾出 tpye checkbox 的元素,單擊勾選
for i in inputs:
if i.get_attribute('type') == 'checkbox':
i.click()

 

多表單切換

from selenium import webdriver
import time
import os

driver=webdriver.Firefox()

file_path='file:///'+ os.path.abspath('fram.html')

driver.get(file_path)

driver.switch_to.frame("if")

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()

time.sleep(3)
driver.quit()

 

 

切換表單:

driver.switch_to.frame("if")

 

退回到上一步驟:

driver.switch_to.default_content()

 

若是表單嵌套在當前頁面,要先定位表單frame:

切換表單:

driver.switch_to.frame("if")

 

多窗口切換

current_window_handle 得到當前窗口句柄
window_handles 返回的全部窗口的句柄到當前會話
switch_to_window()

 

from selenium import webdriver
from time import sleep

driver=webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

sreach_windows=driver.current_window_handle

driver.find_element_by_xpath(".//*[@id='u1']/a[7]").click()

sleep(3)

driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_10__submitWrapper']/a[1]").click()
sleep(3)

all_windos=driver.window_handles

for handle in all_windos:
    if handle!=sreach_windows:
        driver.switch_to.window(handle)
        print("now register window")
        driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_3__userName']").send_keys("username")
        driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_3__password']").send_keys("userpassd")


for handle in all_windos:

    if handle == sreach_windows:
        driver.switch_to.window(handle)
        print("now sreach winow")

        #關閉登陸tab
        driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_4__closeBtn']").click()
        driver.find_element_by_id("kw").send_keys("selenium")
        driver.find_element_by_id("su").click()
        sleep(3)

driver.quit()

 

警告框處理

switch_to_alert

 

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

sleep(2)
move=driver.find_element_by_xpath(".//*[@id='u1']/a[8]")
ActionChains(driver).move_to_element(move).perform()
sleep(2)
driver.find_element_by_xpath(".//*[@id='wrapper']/div[6]/a[1]").click()
sleep(2)
driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()

sleep(2)
driver.switch_to.alert.accept()

 

上傳文件

#coding=utf-8
from selenium import webdriver
import os
driver = 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()
經過這種方法上傳,就繞開了操做 Windows 控件的步驟。若是能找上傳的 input 標籤,那麼基本均可
以經過 send_keys()方法向其輸入一個文件地址來實現上傳

 

下載文件

FireFox 讓瀏覽器能實現文件的載,咱們須要經過 FirefoxProfile() 對其參數作一個設置。
browser.download.folderList
設置成 0 表明下載到瀏覽器默認下載路徑;設置成 2 則能夠保存到指定目錄。
browser.download.manager.showWhenStarting
是否顯示開始,Ture 爲顯示,Flase 爲不顯示。
browser.download.dir
用於指定你所下載文件的目錄。os.getcwd() 該函數不須要傳遞參數,用於返回當前的目錄。
browser.helperApps.neverAsk.saveToDisk
指定要下載頁面的 Content-type 值,「application/octet-stream」爲文件的類型。HTTP Content-type
用對照表:http://tool.oschina.net/commons
這些參數的設置能夠經過在 Firefox 瀏覽器地址欄輸入:about:config 進行設置,如圖 4.17
4.17 FireFire 參數設置

 

操做 Cookie

業務場景:

開發人員開發一個功能,當用戶登陸後,會將用戶的用戶名寫入瀏覽器 cookie,指定的 key 爲「username」,那麼咱們就能夠經過 get_cookies() 找到 useranme
打印 vlaue,若是找不到 username 或對應的 value 爲空,那麼說明保存瀏覽器的 cookie 是有問題的

#coding=utf-8
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

#獲取cookie信息
cookie = driver.get_cookies()

#將得到cookie 的信息打印
print(cookie)

driver.add_cookie({'name':'key-aaaaa','value':'value-bbbbbb'})

#遍歷cookiesname  value

for cookie in driver.get_cookies():

    print("%s  -> %s"%(cookie['name'],cookie['value']))

driver.quit()

l webdriver 操做 cookie 的方法有:
l get_cookies() 得到全部 cookie 信息
l get_cookie(name) 返回有特定 name 值有
l add_cookie(cookie_dict) 添加 cookie,必須有 n
l delete_cookie(name) 刪除特定(部分)cook
l delete_all_cookies() 刪除全部 cookie 信息

 

調用 JavaScript

經過瀏覽器打開百度進行搜索,搜索的一屏沒法徹底顯示將會出現滾動條。這個時候就能夠經過
JavaScript 代碼控制滾動條在任意位置,須要改變的就是 scrollTop 的值。經過 execute_script()方法來執行這段 JavaScript 代碼

 

般用到操做滾動條的會兩個場景:
l 註冊時的法律條文的閱讀,判斷用戶是否閱讀完成的標準是:滾動條是否拉到最下方。
l 要操做的頁面元素不在視覺範圍,沒法進行操做,須要拖動滾動條。

#coding=utf-8
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()

driver.get("http://www.baidu.com")

#搜索

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(3)
#將頁面滾動條拖到底部
js = "var q=document.documentElement.scrollTop=1000"
driver.execute_script(js)

js_="var q = document.documentElement.scrollTop=0"
driver.execute_script(js_)
sleep(3)
driver.quit()

 

窗口截圖


#coding=utf-8
from  selenium import webdriver
import logging
logging.basicConfig(level=logging.DEBUG)

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

try:
    driver.find_element_by_id("kw_error").send_keys('selenium')
    driver.find_element_by_id("su").click()

except :
    driver.get_screenshot_as_file("D:\\baidu_error\\baidu_error.jpg")
    driver.quit()

 

自動化測試模型

線性測試

模塊化與類庫

 

public.py

#coding=utf-8
from selenium import webdriver
#登錄
def login():
driver.find_element_by_id("idInput").clear()
driver.find_element_by_id("idInput").send_keys("username")
driver.find_element_by_id("pwdInput").clear()
driver.find_element_by_id("pwdInput").send_keys("password")
driver.find_element_by_id("loginBtn").click()
#退出
def logout():
driver.find_element_by_link_text(u"退出").click()
driver.quit()
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.126.com")
login() #調用登錄模塊
#收信、寫信、刪除信件等操做
logout() #調用退出模塊

 

mail126.py

#coding=utf-8
from selenium import webdriver
from time import sleep

import public

driver = webdriver.Firefox()

driver.get("http://www.126.com")

#調用登陸模塊

public.login(driver)

#調用退出模塊

public.logout(driver)

 

數據驅動

#coding=utf-8

from selenium import  webdriver
file_info=open('info.txt','r')

values = file_info.readlines()
file_info.close()

for serch in values:
    driver=webdriver.Firefox()
    driver.implicitly_wait(10)
    driver.get("http://www.baidu.com")
    driver.find_element_by_id("kw").send_keys(serch)
    driver.find_element_by_id("su").click()
    driver.quit()

 

文本讀取

讀取txt文件

l read() 讀取整個文件。
l readline() 讀取一行數據。
l readlines() 讀取全部行的數據

#coding=utf-8

zhangsan,123
lisi,456
wangwu,789

from selenium import  webdriver
file_info=open('info.txt','r')

values = file_info.readlines()
file_info.close()

for serch in values:
    username= serch.split(',')[0]
    passwd=serch.split(',')[1]

讀取 csv 文件

import csv

#讀取本地csv文件

my_file='E:\\info.csv'
date = csv.reader(open(my_file,'rb'))

#循環輸出
for user in date:
    
    print(user)

讀取xml文件

 

import xml.dom.minidom as do

#打開xml文檔
dom=do.parse('info.xml')

#得到文檔元素對象

root=dom.documentElement

 

獲取標籤的屬性值

#coding=utf-8
import xml.dom.minidom
#打開 xml 文檔
dom = xml.dom.minidom.parse('info.xml')
#獲得文檔元素對象
root = dom.documentElement
logins = root.getElementsByTagName('login')
#得到 login 標籤的 username 屬性值
username=logins[0].getAttribute("username")
print username
#得到 login 標籤的 passwd 屬性值
password=logins[0].getAttribute("passwd")
print password
items = root.getElementsByTagName('item')
#得到第一個 item 標籤有 id 屬性值
id1=items[0].getAttribute("id")
print id1
#得到第二個 item 標籤有 id 屬性值
id2=items[1].getAttribute("id")

 

獲取標籤之間的數據

 

#coding=utf-8
import xml.dom.minidom
#打開 xml 文檔
dom = xml.dom.minidom.parse('info.xml')
#獲得文檔元素對象
root = dom.documentElement
captions=dom.getElementsByTagName('caption')
#得到第一個標籤對的值
c1=captions[0].firstChild.data
print c1
#得到第二個標籤對的值
c2=captions[1].firstChild.data
print c2
#得到第三個標籤對的值
c3=captions[2].firstChild.data
print c3

 

unittest 單元測試框架

提供用例組織與執行:對一個功能編寫幾個測試用例來講,固然不一樣講究用例的組織,但測試用例達
到成百上千時,就須要考慮編寫用例的規範與組織,不然後期的維護成本是呈現指數級增長的。可能,我
們都沒法顧及開發新功能,而花費大量的時間和精力在維護測試用例。這也是單元測試用例的目的。
提供比較方法:不是管是功能測試用例,仍是單元測試都會有一個預期結果,測試的過程其實就是執
行某些操做以後拿實際的結果與預期結果進行比較,固然,這個比較有咱們前面介紹來的斷言與驗證。
提供豐富的日誌:當全部用例執行完成,要有足夠清晰的日誌信息告訴我哪些用例失敗以及它們失敗
的位置,若是沒這清晰的日誌,那麼將會大大提供 debug 問題也是一件很是耗時的工做。

#coding=utf-8

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest2,time,re


class BaiduTest(unittest2.TestCase):
    def setUp(self):
        self.driver=webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url="http://www.baidu.com"
        self.verificationErrors=[]
        self.accept_next_alert= True

    def test_baidu(self):
        driver=self.driver
        driver.get(self.base_url+"/")
        driver.find_element_by_id("kw").click()
        driver.find_element_by_id("kw").send_keys("selenium ide")
        driver.find_element_by_id("su").click()

    def is_element_present(self,how,what):
        try:
            self.driver.find_element(by=how,value=what)
        except NoSuchElementException as e:
            return False
        return True

    def is_alert_present(self):
        try:
            self.driver.switch_to.alert()
        except NoAlertPresentException as e:
            return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert=self.driver.switch_to.alert()
            alert_text=alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally:
            self.accept_next_alert=True

    def tearDown(self):
        self.driver.quit()
        self.assertAlmostEqual([],self.verificationErrors)


if __name__ == '__main__':
    unittest2.main()

 

unittest 單元測試框架解析

#coding=utf-8
from count import Count
import unittest
class TestCount(unittest.TestCase):
def setUp(self):
self.j = Count(2,3)
def test_add(self):
self.add = self.j.add()
self.assertEqual(self.add,5)
def tearDown(self):
pass
if __name__ == '__main__':
unittest.main()

unittest 的文檔中開篇就介紹了 4 個重要的概念:test fixture, test case, test suite, test
runner,我以爲只有理解了這幾個概念,才能真正的理解單元測試的基本原理。
test case --測試用例
一個 TestCase 的實例就是一個測試用例。什麼是測試用例呢?就是一個完整的測試流程,包括測試
前準備環境的搭建(setUp),實現測試過程的代碼(run),以及測試後環境的還原(tearDown)。元測試(unit
test)的本質也就在這裏,一個測試用例是一個完整的測試單元,經過運行這個測試單元,能夠對某一個
功能進行驗證。
test suite ---測試方案
對一個功能的驗證每每是須要多測試用例的,能夠把多的測試用例集合在一塊兒執行,這就產生了測試
套件 TestSuite 的概念,它用來組裝單個測試用例,並且 TestSuite 也能夠嵌套 TestSuite。
能夠經過 addTest 加載 TestCase 到 TestSuite 中,再返回一個 TestSuite 實例。
test runner  ----測試執行
TextTestRunner 是來執行測試用例的,其中的 run(test)用來執行 TestSuite/TestCase。測試的結果
會保存到 TextTestResult 實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息。
test fixture  -----建立於銷燬
對一個測試用例環境的搭建和銷燬,是一個 fixture,經過覆蓋 TestCase 的 setUp()和 tearDown()
方法來實現。這個有什麼用呢?好比說在這個測試用例中須要訪問數據庫,那麼能夠在 setUp()中創建數
據庫鏈接以及進行一些初始化, 在 tearDown()中清除在數據庫中產生的數據, 而後關閉鏈接。 注意 tearDown
的過程很重要,要爲之後的 TestCase 留下一個乾淨的環境。

 

# coding=utf-8

import unittest2


class Count:
    def __index__(self, a, b):
        self.a = a
        self.b = b

    def add(self):
        return self.a + self.b


class TestCount(unittest2.TestCase):
    def setUp(self):
        self.j = Count(2, 3)

    def test_add(self):
        self.add = self.j.add()
        self.assertEqual(self.add, 5)

    def tearDown(self):
        pass


if __name__ == '__main__':
    # 構造suit

    suit = unittest2.TestSuite()
    suit.addTest(TestCount("test_add"))

    # 執行測試

    test_suit = unittest2.TextTestRunner()

    test_suit.run(suit)

 

count.py

 

#coding=utf-8
#計算器類
class Count:

    def __init__(self,a,b):
        self.a = a
        self.b = b

    def add(self):
        return self.a + self.b

 

all_count.py

 

#coding=utf-8
from .count import Count
import unittest

class Testcase(unittest.TestCase):
    def setUp(self):
        pass

    #測試整數相加

    def test_add(self):
        self.j=Count(2,3)
        self.add=self.j.add()
        self.assertEqual(self.add,5)

    # 測試小數相加

    def test_add2(self):
        self.j=Count(2.3,4.2)
        self.add=self.j.add()
        self.assertEqual(self.add,6.5)
    #測試字符竄 相加

    def test_add3(self):
        self.j=Count("hello","world")
        self.add=self.j.add()
        self.assertEqual(self.add,"helloworld")

if __name__ == '__main__':

    #構造測試集
  suit= unittest.TestSuite()
    suit.addTest(Testcase("test_add"))
    suit.addTest(Testcase("test_add2"))
    suit.addTest(Testcase("test_add3"))

    #執行測試
  runner = unittest.TextTestRunner()
    runner.run(suit)

 

 

TestLoader

 


該類根據各類標準負責加載測試用例,並它們返回給測試套件。正常狀況下沒有必要建立這個類的實
例。unittest 提供了能夠共享了 defaultTestLoader 類,可使用其子類和方法建立實例,因此咱們能夠
使用其下面的 discover()方法來建立一個實例。
discover(start_dir,pattern='test*.py',top_level_dir=None)
找到指定目錄下全部測試模塊,並可遞歸查到子目錄下的測試模塊,只有匹配到文件名才能被加載。
若是啓動的不是頂層目錄,那麼頂層目錄必需要單獨指定。
start_dir :要測試的模塊名或測試用例目錄。
pattern='test*.py' :表示用例文件名的匹配原則。星號「*」表示任意多個字符。
top_level_dir=None:測試模塊的頂層目錄。若是沒頂層目錄(也就是說測試用例不是放在多級目錄
中),默認爲 None。

 

#coding =utf-8
import unittest

def creatsuit():
    testnuit=unittest.TestSuite()

    test_dir='E:\\hello'

    discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py',top_level_dir=None
                                                 )

    #discover篩選出來,
    for test_unit in discover:
        for test_case in test_unit:
            testnuit.addTest(test_case)

    return testnuit

if __name__ == '__main__':
    #測試執行

    runner=unittest.TextTestRunner()

    runner.run(creatsuit())
    

 

建立 creatsuite()函數用於查找指定條件的下的全部測試用例,並將其組裝到測試套件中。
調用 discover()方法,首先經過 test_dir 定義查找測試文件的目錄,pattern 用來定義匹配測試文
件的文件名,若是文件名以 test 開頭的.py 文件,那麼就認爲它是一個測試文件。top_level_dir 默認爲
None。
discover()只能找到了測試文件,接下來經過 for 循環來找到測試文件下的每個測試用例,而且將
其添加測試套件中

項目實戰

測試類型

測試靜態內容
靜態內容測試是最簡單的測試,用於驗證靜態的、不變化的 UI 元素的存在性。例如:
每一個頁面都有其預期的頁面標題?這能夠用來驗證連接指向一個預期的頁面。
•應用程序的主頁包含一個應該在頁面頂部的圖片嗎?
•網站的每個頁面是否都包含一個頁腳區域來顯示公司的聯繫方式,隱私政策,以及商標信息?
•每一頁的標題文本都使用的<h1>標籤嗎?每一個頁面有正確的頭部文本內嗎?
您可能須要或也可能不須要對頁面內容進行自動化測試。若是您的網頁內容是不易受到影響手工對內
容進行測試就足夠了。若是,例如您的應用文件的位置被移動,內容測試就很是有價值。


測試連接


Web 站點的一個常見錯誤爲的失效的連接或連接指向無效頁。連接測試涉及點各個連接和驗證預期的
頁面是否存在。若是靜態連接不常常更改,手動測試就足夠。可是,若是你的網頁設計師常常改變連接,或者
文件不時被重定向,連接測試應該實現自動化。
功能測試
在您的應用程序中,須要測試應用的特定功能,須要一些類型的用戶輸入,並返回某種類型的結果。一般
一個功能測試將涉及多個頁面,一個基於表單的輸入頁面,其中包含若干輸入字段、提交「和」取消「操做,
以及一個或多個響應頁面。用戶輸入能夠經過文本輸入域,複選框,下拉列表,或任何其餘的瀏覽器所支持的
輸入。
功能測試一般是須要自動化測試的最複雜的測試類型,但也一般是最重要的。典型的測試是登陸,註冊
網站帳戶,用戶賬戶操做,賬戶設置變化,複雜的數據檢索操做等等。功能測試一般對應着您的應用程序的描
述應用特性或設計的使用場景。


測試動態元素


一般一個網頁元素都有一個惟一的標識符,用於惟一地定位該網頁中的元素。一般狀況下,惟一標識符
用 HTML 標記的’id’屬性或’name’屬性來實現。這些標識符能夠是一個靜態的,即不變的、字符串常量。
它們也能夠是動態生產值,在每一個頁面實例上都是變化的。例如,有些 Web 服務器可能在一個頁面實例
上命名所顯示的文件爲 doc3861,並在其餘頁面實例上顯示爲 doc6148,這取決於用戶在檢索的‘文檔’。
驗證文件是否存在的測試腳本,可能沒法找到不變的識別碼來定位該文件。一般狀況下,具備變化的標識符
的動態元素存在於基於用戶操做的結果頁面上,然而,顯然這取決於 Web 應用程序。


Ajax 的測試


Ajax 是一種支持動態改變用戶界面元素的技術。頁面元素能夠動態更改,但不須要瀏覽器從新載入頁
面,如動畫,RSS 源,其餘實時數據更新等等。Ajax 有不可勝數的更新網頁上的元素的方法。可是瞭解 AJAX
的最簡單的方式,能夠這樣想,在 Ajax 驅動的應用程序中,數據能夠從應用服務器檢索,而後顯示在頁面上,
而不需從新加載整個頁面。只有一小部分的頁面,或者只有元素自己被從新加載

 

編寫自動化測試用例

在編寫用例過程當中應該遵照如下幾點原則:
1、一個腳本是一個完整的場景,從用戶登錄操做到用戶退出系統關閉瀏覽器。
2、一個腳本腳本只驗證一個功能點,不要試圖用戶登錄系統後把全部的功能都進行驗證再退出系統
3、儘可能只作功能中正向邏輯的驗證,不要考慮太多逆向邏輯的驗證,逆向邏輯的狀況不少(例如手
號輸錯有不少種狀況),驗證一方面比較複雜,須要編寫大量的腳本,另外一方面自動化腳本自己比較脆弱,
不少非正常的邏輯的驗證能力不強。(咱們儘可能遵循用戶正常使用原則編寫腳本便可)
4、腳本之間不要產生關聯性,也就是說編寫的每個腳本都是獨立的,不能依賴或影響其餘腳本。
5、若是對數據進行了修改,須要對數據進行還原。
6、在整個腳本中只對驗證點進行驗證,不要對整個腳本每一步都作驗證。

 

用例存放&維護:

 

發送郵件:

#coding=utf-8
from selenium import webdriver
import unittest, time
from public import login
import xml.dom.minidom
#打開 xml 文檔
dom = xml.dom.minidom.parse('E:\\test_object\\test_date\\login.xml')
#獲得文檔元素對象
root = dom.documentElement
Selenium2 Python 自動化測試實戰》樣張
193
class TestSendMail(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.maximize_window()
self.driver.implicitly_wait(30)
logins = root.getElementsByTagName('url')
self.base_url=logins[0].firstChild.data
self.verificationErrors = []
#只填寫收件人發送郵件
def test_send_mail(self):
driver = self.driver
driver.get(self.base_url)
#登陸
login.login(self,"testingwtb","a123456")
#寫信
driver.find_element_by_css_selector("#_mail_component_47_47 >
span.oz0").click()
#填寫收件人
driver.find_element_by_xpath("//*[@class='bz0']/div[2]/div/input")
.send_keys('testingwtb@126.com')
#發送郵件
driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/header
/div/div/div/span[2]").click()
driver.find_element_by_xpath("//*[@class='nui-msgbox-ft-btns']
/div/span").click()
#斷言發送結果
text = driver.find_element_by_class_name('tK1').text
self.assertEqual(text,u'發送成功')
login.logout(self)
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()

 

系統會彈框提示「肯定真的不須要寫主題嗎?」,在用例中默認 click
「肯定」。郵件發送成功,驗證「發送成功」的提示信息

 

搜索郵件:

............................

#搜索郵件
def test_search_mail(self):
driver = self.driver
driver.get(self.base_url)
#調用登陸模塊

login.login(self,'testingwtb','a123456')
#搜索郵件
driver.find_element_by_xpath("//input[@class='nui-ipt-input' and
@type='text']").send_keys(u'小明')
driver.find_element_by_xpath("//input[@class='nui-ipt-input' and
@type='text']").send_keys(Keys.ENTER)
#斷言搜索郵件標籤頁面
text= driver.find_element_by_xpath("//div[@id='dvMultiTab']/ul
/li[5]/div[3]").text
self.assertEqual(text,u'搜索郵件')
#調用退出
login.logout(self)

.........................................

自動化測試高級應用

安裝和使用HTMLTestRunner生成測試報告

HTMLTestRunner 是 Python 標準庫的 unittest 單元測試框架的一個擴展。它生成易於使用的 HTML 測
試報告。 HTMLTestRunner 是在 BSD 許可證下發布。
首先要下 HTMLTestRunner.py 文件,下載地址:
http://tungwaiyip.info/software/HTMLTestRunner.html
HTMLTestRunner.py 本是一個.py 文件,將它放到 Python 安裝目錄下便可調用。
Windows :將下載的文件放入...\Python\Lib 目錄下。

#coding=utf-8
from selenium import webdriver
import unittest, time
import HTMLTestRunner #引入 HTMLTestRunner

class Baidu(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(10)
        self.base_url = "http://www.baidu.com/"
        self.verificationErrors = []

    # 百度搜索用例
    def test_baidu_search(self):
        driver = self.driver
        driver.get(self.base_url)
        driver.find_element_by_id("kw").send_keys("HTNMLTestRunner")
        driver.find_element_by_id("su").click()

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
#測試套件
    testunit=unittest.TestSuite()
#添加測試用例到測試套件中
    testunit.addTest(Baidu("test_baidu_search"))
#定義個報告存放路徑
    filename = 'E:\\result.html'
    fp = open(filename, 'wb')
#定義測試報告
    runner =HTMLTestRunner.HTMLTestRunner(
stream=fp,
title=u'百度搜索測試報告',
description=u'用例執行狀況:')
#運行測試用例
    runner.run(testunit)
#關閉報告文件
    fp.close()

 

更易讀的測試報告

……
#百度搜索用例
def test_baidu_search(self):
u'''百度搜索用例'''
driver = self.driver
driver.get(self.base_url)
driver.find_element_by_id("kw").send_keys("HTNMLTestRunner")
driver.find_element_by_id("su").click()
……
再次運行測試用例,查看測試報告。如圖 9.2

 

測試報告文件名稱

time

time.time() 獲取當前時間戳。
time.ctime() 當前時間的字符串形式。
time.localtime() 當前時間的 struct_time 形式。
time.strftime() 用來得到當前時間,能夠將時間格式化爲字符串。
Python 中時間日期格式化符號(區分大小寫):

Directive

Meaning

%a

星期幾的簡寫

%A

星期幾的全稱

%w

十進制表示的星期幾(值從 0 6,星期天爲 0

%d

十進制表示的每個月的第幾天

%b

月份的簡寫

%B

月份的全稱

%m

十進制表示的月份

%y

不帶世紀的十進制年份(值從 0 99

%Y

帶世紀部分的十制年份

%H

24 小時制的小時

%I

12 小時制的小時

%p

本地的 AM PM 的等價顯示

%M

十時製表示的分鐘數

 

Directive

Meaning

%S

十進制的秒數

%f

十進制的微秒,零填充左邊

%Z

當前時區的名稱

%j

十進制表示的每一年的第幾天

%U

一年中的星期數(00-53)星期天爲星期的開始

%W

一年中的星期數(00-53)星期一爲星期的開始

%x

本地相應的日期表示

%X

本地相應的時間表示

%%

%號自己


#獲取當前時間
now = time.strftime("%Y-%m-%d %H_%M_%S")
#定義個報告存放路徑
filename = 'E:\\test_object\\report\\'+now+'result.html'

 

#coding=utf-8
import unittest
import HTMLTestRunner
import time
def creatsuite():
testunit=unittest.TestSuite()
#定義測試文件查找的目錄
test_dir='E:\\test_object\\test_case'
#定義 discover 方法的參數
discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py',
top_level_dir=None)
#discover 方法篩選出來的用例,循環添加到測試套件中
for test_case in discover:
print test_case
testunit.addTests(test_case)
return testunit
now = time.strftime("%Y-%m-%d %H_%M_%S")
filename = 'E:\\test_object\\report\\'+now+'result.html'
fp = file(filename, 'wb')
runner =HTMLTestRunner.HTMLTestRunner(
stream=fp,
title=u'百度搜索測試報告',
description=u'用例執行狀況:')

alltestnames = creatsuite()
runner.run(alltestnames)
fp.close()

 

 

Selenium Grid2

Selenium2 工做原理
Selenium2 中由於使用的 WebDriver,這個技術不是靠 js 驅動的,而是直接調用瀏覽器的原生態接口
驅動的。因此就沒有同源問題,也就不須要使用 RC 來執行本地腳本了(固然缺點就是並非全部的瀏覽
器都有提供很好的驅動支持,但 JavaScript 倒是全部瀏覽器都通用的)。因此 Selenium2 中執行本地腳
本的方式是:經過本地 WebDriver 驅動直接調用本地瀏覽器接口就能夠了。
Selenium 1(RC)代碼
咱們能夠經過 Selenium IDE 將錄製的腳本導出爲「Python2/unittest/Remote Control」格式。經過
編輯器打開導出的腳本

selenium grid 工做方式

#coding=utf-8
from selenium import selenium
import unittest, time, re
class serc(unittest.TestCase):
def setUp(self):
self.verificationErrors = []
self.selenium = selenium("localhost", 4444, "*chrome",
"http://www.baidu.com/")
self.selenium.start()
def test_serc(self):
sel = self.selenium
sel.open("/")
sel.type("id=kw", "selenium grid")
sel.click("id=su")
sel.wait_for_page_to_load("30000")
def tearDown(self):
self.selenium.stop()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()

Selenium Server 環境配置

 

環境搭建

第一步、 配置 java 環境
java 下載地址:http://www.java.com/zh_CN/download/manual.jsp

第二步、下載運行 selenium server
下載地址:http://selenium-release.storage.googleapis.com/2.41/selenium-server-2.41.0.zip
在頁面的左側列表中找到 selenium-server-standalone-XXX.jar 進行下載。下載完成能夠放到任意
位置,直接在命令提示符下啓動 Selenium Server:
C:\selenium> java -jar selenium-server-standalone-XXX.jar

 

調用 Selenium Grid 的基本結構圖

樣例演示 :

 

 

在瀏覽器中打開:http://127.0.0.1:4444/grid/console

Selenium Grid 應用

WebDriver 提供了 Remote 能夠發送指令到遠程服務器控制瀏覽器。 首先咱們先來認識 Remote 的格式

from selenium.webdriver import Remote
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.CHROME
)
driver.get('http://www.baidu.com')
……
driver.quit()

 

 

 

 

Desired Capabilities 本質上是 key value 的對象,它告訴 Selenium Server 腳本執行的基本運行環
境:
'platform': 'ANY' 平臺默承認以是任何(Windows,MAC,android)。
'browserName': 'chrome' 瀏覽器名字是 chrome。
'version': '' 瀏覽器的版本默認爲空。
'javascriptEnabled': True javascript 啓動狀態爲 True

 

from selenium.webdriver import Remote
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'platform': 'ANY',
'browserName':'chrome',
'version': '',
'javascriptEnabled': True
})
driver.get('http://www.baidu.com')
……
driver.quit()

 

WebDriver API 提供了不一樣平臺及瀏覽器的參數:

 

ANDROID = {'platform': 'ANDROID', 'browserName': 'android', 'version': '',
'javascriptEnabled': True}

CHROME = {'platform': 'ANY', 'browserName': 'chrome', 'version': '',
'javascriptEnabled': True}

FIREFOX = {'platform': 'ANY', 'browserName': 'firefox', 'version': '',
'javascriptEnabled': True}

HTMLUNIT = {'platform': 'ANY', 'browserName': 'htmlunit', 'version': ''}

HTMLUNITWITHJS = {'platform': 'ANY', 'browserName': 'htmlunit', 'version':
'firefox', 'javascriptEnabled': True}

INTERNETEXPLORER = {'platform': 'WINDOWS', 'browserName': 'internet
explorer', 'version': '', 'javascriptEnabled': True}

IPAD = {'platform': 'MAC', 'browserName': 'iPad', 'version': '',
'javascriptEnabled': True}

IPHONE = {'platform': 'MAC', 'browserName': 'iPhone', 'version': '',
'javascriptEnabled': True}

 

SAFARI = {'platform': 'ANY', 'browserName': 'safari', 'version': '',
'javascriptEnabled': True}

PHANTOMJS = {'platform': 'ANY', 'browserName': 'phantomjs', 'version': '',
'javascriptEnabled': True}

OPERA = {'platform': 'ANY', 'browserName': 'opera', 'version': '',
'javascriptEnabled': True}

 

參數化瀏覽器執行用例


#coding=utf-8
from selenium.webdriver import Remote
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
#瀏覽器數組
lists=['chrome','firefox','internet explorer']
#讀取不一樣的瀏覽器執行腳本
for browser in lists:
print browser
driver = Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'platform': 'ANY',
'browserName':browser,
'version': '',
'javascriptEnabled': True
})
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys(browser)
driver.find_element_by_id("su").click()
driver.close()

 

多節點執行用例

#coding=utf-8
from selenium.webdriver import Remote
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
#定義主機與瀏覽器
lists={'http://127.0.0.1:4444/wd/hub':'chrome',
'http://127.0.0.1:5555/wd/hub':'firefox',
'http://127.0.0.1:5556/wd/hub':'internet explorer'}
#經過不一樣的瀏覽器執行腳本
for host,browser in lists.items():
print host,browser
driver = Remote(
command_executor=host,
desired_capabilities={'platform': 'ANY',
'browserName':browser,
'version': '',
'javascriptEnabled': True
})

driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys(browser)
driver.find_element_by_id("su").click()
driver.close()

 

啓動遠程 node

 

咱們目前啓動的 hub 與 node 都是在一臺主機上。 那麼要在其它主機啓動 node 必須知足如下幾個要求:
l 本地 hub 主機與遠程 node 主機之間能夠相互 ping 通。
l 遠程主機必須安裝運行腳本的運行環境(Python 、Selenium、瀏覽器及瀏覽器驅動 )。
l 遠程主機必須安裝 java 環境,由於須要運行 Selenium Server。
操做步驟以下:
啓動本地 hub 主機(本地主機 IP 爲:172.16.10.66):

C:\selenium>java -jar selenium-server-standalone-2.39.0.jar -role hub


啓動遠程主機(操做系統:Ubuntu ,IP 地址:172.16.10.34):
遠程主機啓動 node 方式以下:

fnngj@fnngj-VirtualBox:~/selenium$ java -jar selenium-server-standalone-2.39.0ar -role node -port 5555
-hub http://172.16.10.66:4444/grid/register


(設置的端口號爲:5555 ,指向的 hub ip 爲 172.16.10.66)
修改遠程主機的 IP 地址及端口號,在其上面的 firefox 瀏覽下運行腳本。
hosts.py
……
#定義主機與瀏覽器
lists={'http://127.0.0.1:4444/wd/hub':'chrome',
'http://127.0.0.1:5555/wd/hub':'internet explorer',
'http://172.16.10.34:5555/wd/hub': 'firefox'}
……

 

小技巧:
自從使用 Selenium Server 執行自動化腳本後,經常會由於忘記啓動 Selenium Server 致使腳本運行
報錯。其實咱們以在腳本中執行 cmd 命令。如在咱們建立的 all_test.py 文件中添加:
import os
os.chdir('E:\\selenium')
os.system('java -jar selenium-server-standalone-2.39.0.jar')
這樣就不再會由於忘記啓動 Selenium Server 致使測試腳本運行失敗了

 

 

 

https://www.cnblogs.com/yufeihlf/p/5764099.html

 

http://blog.csdn.net/boonya/article/details/55049483

相關文章
相關標籤/搜索