UI自動化

1、什麼是自動化測試?
一、什麼是自動化?css

自動化谷歌使用驅動對應的版本地址:https://blog.csdn.net/huilan_same/article/details/51896672
概念:由機器設備代替人爲自動完成指標的過程
1.一、優勢:
a.減小人工勞動力
b.工做效率提升
c.產品規格統一標準
d.規模化(批量生產)

二、什麼是自動化測試?
概念:讓程序代替人爲去驗證程序功能的過程

2.1爲何要進行自動化測試?
a.解決--迴歸測試
b、解決--壓力測試
c、解決--兼容性測試
d、提升測試效率、保證產品質量

迴歸測試:項目在發新版本以後對項目以前的功能進行驗證;
壓力測試:能夠理解爲多用戶同時去操做軟件,統計軟件服務器處理多用戶請求的能力
兼容性測試:不一樣瀏覽器(IE/Firefox/Chrome)等

2.2自動化測試相關知識
自動化測試在什麼階段開始?
功能測試完畢(手工測試)
手工測試:就是由人一個一個輸入用例,而後觀察結果;

自動化測試所屬分類
常見的測試分類
a.黑盒測試(功能測試)
b.灰盒測試(接口測試)
c.白盒測試(單元測試)
提示:web自動化測試屬於黑盒測試(功能測試)

優勢:
a.較少的時間內運行更多的測試用例
b、自動化腳本可重複運行
c、減小人爲錯誤
d、測試數據存儲

缺點:
a.不能取代手工測試
b、手工測試比自動化測試發現的缺陷更多
c、測試人員技能要求(比手工測試高)
誤區:
1)、自動化測試徹底替代手工測試
2)、自動化測試必定比手工測試厲害
3)、自動化能夠挖掘更多的BUG

3.自動化測試分類
a.Web_(UI)自動化測試(本階段學習)
b、接口-自動化測試
c、移動(app)-自動化測試
d、單元測試-自動化測試
注意:什麼是web?
a.基於HTTP開發的項目
b.基於瀏覽器訪問的項目

Web自動化測試
1.什麼是web自動化測試?
概念:讓程序代替人爲自動驗證Web項目功能的過程

二、什麼Web項目適合作自動化測試?
a.需求變更不頻繁
b.項目週期長
c.項目須要迴歸測試

三、如何進行Web自動化測試?(主流測試工具)
a、QTP(收費)
        QTP是商業的功能測試工具,收費,支持web,桌面自動化測試
b、Selenium(開源)【本階段學習】
    Selenium是開源的web自動測試工具,免費,主要作功能測試
c、Jmeter(開源,Web,接口,性能)
    Jmeter是由Apache公司使用Java平臺開發的一款測試工具,支持(Web,接口測試,性能測試)
d、Loadrunner(收費、web、性能)
    Loadrunner是商業性能測試工具,收費,功能強大,適合作複雜場景的性能測試
e、Rob framework
    Rob framework是一個基於Python可擴展地(關鍵字驅動)的測試自動化框架

3.1主流工具-彙總:
Web自動化測試:selenium .rob framework
App端自動化測試:Appium、MonkeyRunner、UIautomation
PC客戶端(win32桌面程序)自動化測試:QTP
接口自動化測試:Jmeter,Postman,httpUnit,RESTClient
雲測試平臺:Testin Testbird
性能測試:Jmeter,LoadRunner

四、什麼是selenium?
    概念:selenium是一個用於Web應用程序測試的工具,中文的意思(硒 拼音:xi,第一聲)

4.1Selenium特色
A、開源軟件:源代碼開發能夠根據需求來增長工具的某些功能
B、誇平臺:linux、windows、mac
C、核心功能:就是能夠在多個瀏覽器上進行自動化測試
D、多語言:Java、Python、C#、JavaScript、Ruby等
E、成熟穩定:目前已經被谷歌、百度、騰訊等公司普遍使用
F、功能強大:可以實現相似商業工具的大部分功能,由於開源性,能夠實現定製化功能

4.1 Selenium家族(發展史)【瞭解】
(1)Selenium1.0
a.seleniumIDE
a.1 一個Friofox插件,能夠錄製用戶的基本操做,生成測試用例(記住這個就能夠了)
a.2測試用例在Friofox瀏覽器裏回放;
a.3測試用例能夠轉化成爲其餘語言的自動化腳本;

b.selenium Grid
容許selenium-RC針對規模龐大的測試案例或者須要在不一樣環境中運行的測試案例集進行擴展

c.selenium RC
c.1RC是remote contro的縮寫,他的功能就是用來模擬一個瀏覽器,主要測試的就是web方面(使用JS腳本注入到瀏覽器中,模擬一個瀏覽器,使用者向被測軟件中請求輸入數據時,RC會攔截全部的信息,經過這種方式定位操做元素)
c.2支持多平臺(Windows,Linux,Solaris)和多種瀏覽器(IE,Firefox,Opera,Safari)能夠用多種語言(JAVA,Ruby,Python,Perl,PHP,C#)編寫測試用例

d.缺陷
d.1不支持本機鍵盤和鼠標事件
d.2不支持同源策略XSS/HTTP(S)(自身安全協議)
d.3不支持彈出框,對話框(基自己份證,自簽名的證書和文件上傳、下載)

(2)selenium
A.selenium2.0=selenium1.0+WebDriver
WebDriver經過瀏覽器的驅動來控制瀏覽器,它把控制瀏覽器驅動的方法,封裝成一個庫,簡稱API(把傳統的JS注入給替換掉了)
B、基於調用WebDriver Api來模擬用戶操做
C、webDriver的速度更快,由於它直接交互使用
D、支持更多編程語言

(3)Selenium 3.0
A.去掉了對selenium rc的支持
B、全面擁抱java8
C、支持masOS(Sirerra or later),支持官方的safaridirver
D、經過ms官方的webdriver server支持Edge瀏覽器
E、支持ie9.0版本以上
F、經過Mozilla官方的geckodriver來支持firefox

重點:
1.SeleniumIDE
2.WebDriver

WebDriver
目標:
掌握WebDriver元素定位方法

1.什麼是WebDriver?
a.WebDriver是一種用於Web應用程序的自動測試工具;
b.它提供了一套友好的API;
c.WebDriver徹底就是一套類庫,不依賴於任何測試框架,除了必要的瀏覽器驅動;
說明:
API:應用接口編程說明(WebDriver類庫內封裝很是多的方法,要使用這些方法,就須要友好的調用命名規則,說白了API就是這些方法的使用說明書)

1.1WebDriverAPI支持的瀏覽器
a.Fire(FirefoxDriver)【推薦-本階段學習使用】
b.IE(InternetExplorerDriver)
c.Opera(OperaDriver)
d.Chrome(ChromeDriver)谷歌瀏覽器
e.safari(SafariDriver)蘋果
f.HtmlUnit(HtnlUnit Driver)

提示:
Friefox、Chrome:對元素定位和操做有良好的支持,同時對JavaScript支持也很是好。
IE:只能在windows平臺運行,全部瀏覽器中運行速度最慢
HtmlUnit:無GUI(界面)運行,運行速度很是快

1.2 WebDriverAPI支持的開發語言
a.java
b.Python
c.PHP
d.JavaScript
e.Perl
f.Ruby
g.C#

2.
a.自動化測試概念
b.WebDriver提供了8中定位元素方法
c.WebDriver提供了豐富的操做元素方法

3.環境搭建
3.1爲何要環境搭建?
a.蓋房子(地基很重要)
b.MP3(有MP3播放器才能播放)
c.開發語言

3.2基於Python環境搭建
a.windows系統(這裏以windows7爲案例)
b.Python3.5(以上版本)注意:安裝時必須把添加到PATH的選項選中,安裝後在dos窗口中輸入python能夠看到版本號,輸入pip能夠看到使用說明便可

c.安裝selenium包
d.瀏覽器
e.安裝PyCharm

四、selenium安裝
說明:安裝selenium時,前提是Python3.5以上版本安裝完畢且能正常運行
4.1 selenium安裝、卸載、查看命令【重點】
安裝指定版本的:在dos窗口下輸入
pip install selenium == 版本號
1).pip通用的Python包管理功能。提供了對Python包的查找,下載,安裝,卸載的功能
2)install :安裝命令
3)selenium==版本號:指定安裝對應版本的selenium(若是不指定版本,默認安裝爲最新版本)

卸載:pip uninstall selenium

查看:pip show selenium


4.2火狐瀏覽器【推薦】
a.FireFox48以上版本,Selenium 3.X+FireFox驅動---geckodriver
b.Firefox 48 如下版本,Selenium 2.X 內置驅動
個人電腦--》右鍵--》屬性--》高級系統設置--》高級選項卡--》環境變量按鈕--》複製PATH的值

4.3IE瀏覽器(瞭解)
a.IE 9以上版本 Selenium3.X+IE驅動
b.IE 9如下版本 Selenium2.X+IE驅動

4.4谷歌瀏覽器
selenium2.X/3.X+Chrome驅動
谷歌瀏覽器於驅動版本必須一一對應

注意:
a.瀏覽器的版本和驅動版本要一致!(若是是32bit瀏覽器而驅動是64bit則會致使腳本運行失敗)
b.瀏覽器驅動下載好後須要添加到Path環境變量中,或者直接放到Python安裝目錄,由於Python已經添加到Path中
c.推薦使用火狐,谷歌瀏覽器

5.總結
a.WebDriver是什麼?
測試Web項目的自動化測試工具
一套友好的API
只須要瀏覽器驅動

b.爲何要搭建環境?
工具包
解釋器

c.selenium 安裝、卸載、查看命令
安裝:
安裝指定版本
pip install selenium==版本號
安裝最新版本
pip install selenium

查看:pip show selenium

卸載:pip uninstall selenium
 4.爲何推薦火狐瀏覽器
由於對WebDriver有良好的支持

小技巧:如何查看selenium有哪些版本
在dos命令下輸入pip install selenium==不存在的版本號

導入包:打開pyChram--》Settings--》選擇Project XXXX--->Project Interpreter


WebDriver-元素定位
頁面元素分析:
輸入框
選擇框
文本連接
懸浮
單選框
下拉框
按鈕
滾動條
彈窗
文件操做

1.爲何要學習元素定位方式?
a.讓程序操做指定元素,就必須先找到此元素;
b.程序不想人類用眼睛直接定位到元素;
c.WebDriver提供了八種定位元素的方法

2.WebDriver元素定位方式
a.id:經過元素的id屬性,定位元素
b.name:經過元素的name屬性,定位元素
c.class_name:經過元素的class屬性,定位元素,這裏name指的是class的值,一個元素能夠有多個class屬性,就像人在不一樣人口中稱呼不同。
d.tag_name:經過元素的標籤名稱
e.link_text:只對連接有效(精確匹配)
f.partial_link_text:對link_text的擴展,只要輸入表明這個標籤的,不重複的信息,便可對該連接生效(能夠理解爲模糊匹配)
g.Xpath:路徑定位
h.Css選擇器定位
注意:若是元素沒有id和name、class屬性,則id和name、class不生效

定位方式分類-彙總:
1)id、name、class_name:爲元素屬性定位
2)tag_name:爲元素標籤名稱
3)link_text,partial_link_text:爲超連接定位
4)Xpath:爲元素路徑定位
5)CSS:爲CSS選擇器定位

練習:
1)打開百度頁面,使用id定位,搜索欄輸入123456,暫停3秒後關閉
id定位方法
find_element_by_id()
語法:
driver.find_element_by_id(「id的值」)
元素定位方法:
1.使用瀏覽器的開發者工具
打開方法:
a,F12
b.在打開菜單中選擇「開發者」,查看器
2.在開發者工具中,選擇查看器,點擊查看器旁邊的「選擇頁面中的元素」按鈕(鼠標圖標)
3.把鼠標放在須要定位的元素上,點擊一下,便可在查看器中看到該元素對應的源碼

id定位實現,步驟分析
1.導入selenium包-->from seleium import webdriver
2.導入time包  import time
3.實例化一個瀏覽器,把實例化的瀏覽器賦值給一個變量
driver=webdriver.Firefox()
4.輸入網址-->driver.get("http://www.baidu.com")
語法:driver.get("網址")
5.調用id定位的方法,定位到瀏覽器中須要操做的元素,把元素賦值給一個變量
element=driver.find_element_by_id("kw")
6.使用send_keys()方法輸入數據-->element.send_keys("123456")
語法:元素.send_keys("要輸入的數據")
7.time.sleep(3)
語法:time.sleep(要暫停的時間),時間單位:秒
8.關閉瀏覽器-->driver.quit()

url的書寫方式:
a.url="網址"
b.url=r"file://E:\課程大綱\自動化"
r的做用:被r修飾的字符串後面的轉義符,不作轉義使用
c.url="file://E:\\課程大綱\\自動化"

定位於傳值的語句能夠合在一塊兒寫的
driver.find_element_by_id('kw').send_keys("123456")

快速導包方式
Ctrl+Alt+空格

反斜槓與斜槓的區別:
\:反斜槓爲轉義字符,因此必須在它以前在加一個\進行轉義,計算機中反斜槓作目錄結構使用
/:斜槓,計算機中作除法使用,5/3


2、8種元素定位html

name定位
說明:html規定name屬性來指定元素名稱,所以它的做用更像人名,name的屬性值在當前文檔中能夠不是惟一的,name定位就是根據name屬性來定位

前提:元素有name屬性

name定位方法:
find_element_by_name()
語法
driver.find_element_by_name("name的值")

class_name定位
說明:html規定了class來指定元素的類名,用法和name、id相似
前提:元素有class屬性

方法:find_element_by_class_name('class屬性值')

tag_name定位
說明:html本質就是由不一樣的tag(標籤)組成,而每一個tag指同一類,因此tag定位效率低,通常不建議使用;tag_name定位就是經過標籤名來定位;

方法:find_element_by_tag_name('標籤名')
做用:返回符合條件的第一個標籤

link_text定位
說明:link_text定位與前面4個定位有所不一樣,它專門用來定位超連接文本(<a>XXXXXXX</a>)
方法:
find_element_by_link_text('超連接對應的完整的文本內容')

partial_link_text定位
說明:partial_link_text定位是對link_text定位的補充,partial_link_text爲模糊匹配:link_text所有匹配
方法
find_element_by_partial_link_text('超連接對應的部分文本內容')
說明:須要傳入a標籤局部文本-能表達惟一性的

練習:
1.分別使用class_name定位百度搜索欄,並在搜索欄中,輸入123456,暫停三秒,關閉
2.打開Untitlred-2.html頁面,使用tag_name定位,手機號碼欄,輸入18811112222,暫停三秒,關閉
3.使用link_text定位百度的,hao123超連接,點擊(點擊的方法是:click())
4.使用partial_link_text定位百度的hao123超連接,點擊

6種元素定位梳理【重點】
1.id
說明:經過元素的id屬性來定位
前提:元素必須有id屬性
方法:find_element_by_id("id值")

2.name
說明:經過元素的name屬性來定位
前提:元素必須有name屬性
方法:find_element_by_name("name值")

3.class_name
說明:經過元素的class屬性來定位
前提:元素必須有class屬性
方法:find_element_by_class_name("class值")

4.tag_name
說明:經過元素的標籤名稱,如<input><a>……
前提:元素標籤名在當前頁面必須爲惟一元素,或者定位爲第一個元素
方法:find_element_by_tag_name("標籤名")
返回:符合條件的第一個元素

5.link_text
說明:只定位超連接<a>標籤
注意:必須爲所有匹配文本
方法:find_element_by_link_text(所有文本值)

6.partial_link_text
說明:它爲link_text定位的補充說明
注意:爲模糊匹配
方法:find_element_by_partial_link_text(局部文本)

find_elements_by_XXXXX()
做用:
1)查找定位全部符合條件的元素
2)返回的定位元素格式爲數組(列表)格式:
說明:
1)列表數據格式的讀取須要指定下標(下標從0開始)
tag_name如何獲取第二個元素

Xpath、CSS定位
爲何學習Xpath、CSS定位?
a.在實際項目中標籤沒有id、name、class屬性
b.id、name、class屬性值爲動態獲取,隨着刷新或者加載而變化

1.什麼是Xpath?
a.XPath即爲XML Path的簡稱,它是一種用來肯定XML文檔中某部分位置的語言
b.HTML能夠看作是XML的一種實現,因此Selenium用戶可使用這種強大的語言在    Web應用中定位元素
XML:一種標記語言,用於數據的存儲和傳遞,後綴.xml結尾
提示:Xpath爲強大的語言,那是由於它有很是靈活的定位策略;

1.路徑-定位
1)絕對路徑
2)相對路徑

二、利用元素屬-定位
與相對路徑結合使用

3.層級與屬性結合
給出上一個標籤,父元素與屬性結合

4.屬性與邏輯結合-定位
多個屬性經過邏輯語言結合,符合條件的元素會被篩選出來 and

方法:
find_element_by_xpath("路徑或路徑+屬性")

2.1路徑(絕對路徑、相對路徑)
絕對路徑:從最外層元素到指定元素之間全部通過元素層級的路徑;
好比:/html/body/div/div/div/div/div/form/span/input
1)絕對路徑以/開始
2)使用開發者工具,能夠查看到對應的路徑

相對路徑
1)相對路徑以//開始,以第一個符合條件的元素開始
2)爲了方便練習Xpath,能夠安裝擴展插件 Try XPath插件
火狐瀏覽器-->組件管理器-->搜索Try XPath

2.2利用元素屬性
說明:快速定位元素,利用元素的惟一屬性
例子://*[@id='kw']
其中*表示全部的路徑,[]裏面填寫: 屬性='值',屬性必須使用@修飾
若是要重要input標籤且id屬性爲111的元素,則輸入//*input[@id='111']
注意事項:
1.絕對路徑以單斜槓/開頭,中間不能跳躍元素
2.相對路徑以雙斜槓//開頭;後面必須跟標籤名稱或者*
3.Xpath路徑內使用屬性時,必需要使用@修飾

2.3層級與屬性結合
說明:要找的元素沒有屬性,可是它的父級有;
例子://*[@class='bg s_ipt_wr iptfocus quickdelete-wrap']/input

2.4屬性與邏輯結合
說明:解決元素之間相同屬性重名問題(屬性名同樣,屬性值也同樣)
例子://*[@class='txt1' and @placeholder='手機號碼']

2.5Xpath-延伸
//*[text()="xxx"]文本內容是xxx的元素
//*[starts-with(@attribute,'xxx')]屬性以xxx開頭的元素
//*[contains(@attribute,'xxx')]屬性種含有xxx的元素

2.6Xpath-總結
1.如何經過開發者工具快速生成絕對路徑
a.使用開發者功能定位元素,在開發者工具下方查看路徑,而且用Try XPath確認路徑
b.選中定位到的元素的上一級元素,右鍵複製XPATH一般能夠獲得上一級元素的絕對路徑
弊端:侷限性很大,有些路徑生成不了

練習:使用XPATH定位
1.使用絕對路徑在百度搜索中搜索123456
2.使用相對路徑在百度搜索中搜索123456
3.使用層級與屬性結合在百度搜索中搜索123456
4.使用屬性與邏輯合在百度搜索中搜索123456
5.使用屬性在百度搜索中搜索123456

3.XPATH策略有哪些?
a.路徑
1)絕對路徑,以單斜槓開頭
2)相對路徑,以雙斜槓開頭,後邊必須跟標籤或者*
b.屬性
1)全部屬性必須以@修飾
2)例子://*[@id='id']

c.層級與屬性
層級:父子標籤

d.屬性與邏輯
兩個屬性以上時使用,使用邏輯符號and鏈接

3.CSS定位
3.1什麼是CSS?
CSS(Cascading Style Sheets)是一種語言,它用來描述HTML和XML的元素顯示樣式;
CSS語言書寫的兩個格式:
a.寫在HTML語言中<style type="text/css">
b.寫在單獨文件中,後綴.css
2.而在CSS語言中有CSS選擇器(根據不一樣策略選擇元素),在Selenium中也可使用這種選擇器;
提示:
a.在selenium中極力推薦CSS定位,由於它比XPATH定位速度要快
b.Css選擇器語法很是強大,在這裏咱們只學習測試中經常使用的幾個CSS定位方法

方法:find_element_by_css_selector("傳入路徑或元素")

3.2 CSS定位經常使用策略(方式)
a.id選擇器
b.class選擇器
c.元素選擇器
d.屬性選擇器
e.層級選擇器

Id選擇器
說明:根據元素的id屬性來選擇
格式:#id值  
例子:#userA<選擇全部id屬性爲userA的元素>

在開發者工具搜索欄中輸入,便可定位到元素

class選擇器
說明:根據元素class屬性來選擇
格式:.class值
例子:.telA<選擇全部class屬性爲telA的元素>

元素選擇器
說明:根據元素的標籤名選擇
格式:element
例子:input<選擇全部input元素>

層級選擇器
說明:根據元素的父子關係來選擇
格式:element1>element2
例子:p>input<返回全部p元素下全部的input元素>

屬性選擇器
說明:根據元素的屬性名和值來選擇
格式:[屬性名=值]
例子:[type="password"]<選擇全部type屬性值爲password的元素>

3.3CSS延伸
a.input[type^='p']說明:定位type屬性以p字母開頭的元素
b.input[type$='d']說明:定位type屬性以d字母結束的元素
c.input[type*='w']說明:定位type屬性包含w字母的元素


練習:CSS定位
使用id定位,在百度搜索欄中搜索123456
使用class定位,在百度搜索欄中搜索123456
使用元素定位,在百度搜索欄中搜索123456
使用屬性定位,在百度搜索欄中搜索123456
使用層級定位,在百度搜索欄中搜索123456


3、如何打開不一樣的瀏覽器java


driver=webdriver.Chrome()打開谷歌瀏覽器
driver=webdriver.Firefox()打開火狐瀏覽器
driver=webdriver.Ie()打開ie瀏覽器
driver=webdriver.Edge()打開win10的瀏覽器

try:
    代碼塊1:
except:
    代碼塊2:

若是程序沒有拋出異常,則執行代碼塊1,不然執行代碼塊2


瀏覽器操做
最大化:maxmize_window()
最小化:minimize_window()
設置大小:set_window_size(x,y)
後退:back()
前進:forward()
刷新:refresh()
關閉瀏覽器:quit()


host:
網頁的域名 對應的IP地址

www.baidu.com   111.111.111.111

如何判斷頁面是否正確
driver.title():獲取頁面的title

EC.title_is()
功能:對title進行精確匹配,若是匹配返回true不然返回false
要求:導入from selenium.webdriver.support import expected_conditions as EC

語法:
變量名=EC.title_is("須要校驗的標題")
變量名(瀏覽器對象)

1.title_is()是一個類,使用它會建立一個title_is的對象
2.若是須要判斷傳入的title是否正確,還須要在這個對象中傳入瀏覽器對象


EC.title_contains()
功能:對title進行模糊查詢,若是匹配返回true不然返回false
要求:導入from selenium.webdriver.support import expected_conditions as EC
語法:
變量名=EC.title_contains("須要校驗的標題")
變量名(瀏覽器對象)

3.title_contains()是一個類,使用它會建立一個title_contains的對象
4.若是須要判斷傳入的title是否正確,還須要在這個對象中傳入瀏覽器對象


如何實現多窗口的切換
窗口的惟一表示用句柄表示

函數
1.獲取當前頁面的句柄:driver.current_window_handle
所謂句柄,請理解爲窗口的身份證號碼,它是惟一的

當前句柄,就是當前程序所操做的窗口的句柄

2.獲取全部句柄:driver.window_handles

3.切換窗口:switch_to.window(i)
其中i爲目標句柄,若是你想從窗口1切換到窗口2,i必須爲窗口2的句柄
#for循環,從全部句柄中隨機取一個賦值給i
for i in handl_list:
    #判斷i是否等於當前句柄,若是不等於,則切換到句柄i所在窗口,若是等於則進入下一次循環
    if i!=current_handle:
        #切換到句柄i所在窗口
        driver.switch_to.window(i)
        driver.find_element_by_id('userId').send_keys('test')



4、對複選框狀態進行判斷python

焦點定位:
方法:swith_to.active_element

checkbox(複選框)操做
方法:element.is_selected()
功能:判斷複選框是否被選中,若是選中,則返回true,不然返回false

需求:如何把這個功能封裝起來

需求分析:
chenkbox有一個默認的狀態:勾選or沒有勾選
咱們對該控件也有一個操做,要求選中,或者要求不要選中,那麼如何用一個方法知足咱們的所有要求

思路:
獲取複選框
對複選框狀態進行判斷
傳入check,若是check值爲t,表示要選中複選框,不然取消選中
使用if進行兩次判斷,第一次對複選框狀態進行判斷,查看是否選中
第二次則是在第一次判斷的基礎上,判斷check參數,查看是否要求選中複選框
根據判斷結果,處理代碼

在自動化測試過程當中,網絡緣由,頁面加載時間好久,致使要操做的元素沒有顯示出來,此時若是加入等待時間,咱們沒法肯定等待時間是多久。可是咱們能夠經過is_displayed()判斷,被操做元素是否存在,若是存在,在進行下一步操做
方法:
is_displayed():判斷元素是否可見,若是可見返回True
語法:driver.find_element_by_xxx(xxx).is_displayed()

方法:append(元素)
功能:將元素添加到數組中

如何讀取配置文件
首先,setting->Plugins->marketplace搜索ini,而後進行安裝,重啓pycharm
讀取配置文件,須要安裝插件cmd->pip install ConfigParser

新建一個ini文件,文件中配置以下:
[節點名稱]:好比element
變量名=定位方式<定位值
其中‘<’分割符

如何對文件進行讀取
須要導入import configparser
建立configparser實例
cf=configparser.ConfigParser()
調用read方法讀取文件
cf.read('文件所在路徑')
5、複選框方法定位linux

http://192.168.10.47:8081/aaa/index2.jsp

複選框方法

2.複選框默認選中,要求不選中
3.複選框默認不選中,要求選中

is_selected():判斷複選框是否被選中,若是選中,則方法返回True,不然返回False

判斷元素是否可見方法:
is_displayed():判斷元素是否可見,若是可見,返回True

get_elements改造思路
如何將判斷元素是否可見的函數與get_elements函數結合
1.定義一個數組(列表)用於接受可見元素
2.在定位到元素後,使用for循環,遍歷定位到的每個元素
3.在遍歷的過程當中,對元素進行判斷,使用element_isdisplay判斷元素是否可見
1)若是元素不可見,就使用continue跳出本次循環,進入下一次for循環
2)若是元素可見,使用append()方法將元素添加到事先定義好的列表中
4.將可見元素列表返回到調用get_elements函數的地方

新老代碼容錯處理
修改send_value方法
修改click_element方法
修改check_box_isselected方法
緣由:元素必須可見,才能進行輸入,點擊操做,因此要修改這些對元素操做的方法,先判斷元素是否可見,而後才能對元素進行操做,不然一旦報錯,你沒法定位問題所在


讀取配置文件:
爲何?
方便測試數據的維護
使測試數據與測試腳本分離

例子:不使用讀取配置文件的方法寫了六百個腳本,這六百個腳本里面,都用到了同一個用戶名,密碼,後續若是該用戶名,或密碼被刪除或修改,咱們就要手動修改這600個腳本
可是一個使用讀取配置文件的方法,那麼咱們只要把這600個腳本對應的一個配置文件裏面的用戶名,密碼改一改便可


C:/Users/Administrator.USER-20190219YL/PycharmProjects/untitled1/fengzhuang01/a


如何將讀取配置文件的類與封裝好的方法結合在一塊
方法1:
導入類ReadIni
from fengzhuang01.peizhi01 import ReadIni
而後實例化後直接用
弊端:這樣會讓內存中存在多個ReadIni對象

方法2:單例模式,在編寫ReadIni類的下面進行實例化,導入文件時,直接導入實例化的對象
from fengzhuang01.peizhi01 import read_ini

應爲讀取到的數據是以by<value的格式存儲的,全部咱們使用的時候,須要先把by和value分割出來,封裝方法,分割讀取到的數據,
    def get_local_element(self,info):
        #定義一個變量,接收讀取到的數據
        data=read_ini.get_value(info)
        #定義一個列表,接收分割收的多個數據
        data_list=data.split('<')
        #將分割後的數據返回到調用該方法的地方
        return data_list

改造get_element方法,將傳入的by和value參數,改爲配置文件中的變量info,而後調用分割數據的方法,根據傳入的info信息,將定位控件所須要的by和value分割出來

自動化中如何處理下拉框
方法1:經過下拉框的腹肌定位到下拉框,而後經過標籤名稱結合數組定位到要選擇的元素

方法2:使用Select
1.須要導入:from selenium.webdriver.support.select import Select
語法:Select(element).select_by_index(n)
其中
element爲要操做的下拉框元素
n爲要選擇的下拉框選項的下標,下標從0開始

功能,根據傳入的下標n,在下拉框列表中選擇對應的選項

其餘方法:
Select(element).select_by_value('value值')
經過value定位選項

Select(element).select_by_visible_text('文本值')
經過文本定位下拉框


封裝思路
咱們對下拉框選擇功能,進行封裝時,可能會遇到以下問題,定位下拉框元素時,可能定位到一個數組,也可能定位到一個元素
封裝時要對傳入的父元素下標給予一個默認值None,而且進行判斷,若是父元素爲空,表示程序只會定位到一個元素,不須要指定父元素的下標。此時調用get_element方法定位元素便可
若是父元素下標非空,表示定位的元素是一個表,此時使用get_list_element去處對應下標的元素

將定位的父元素賦值給一個變量,而後直接使用
Select(selected_element).select_by_index(子元素標籤)的方法,選擇下拉項



C:\\Users\\Administrator.USER-20190219YL\\Desktop\\1559176560(1)

對於非input類型上傳文件操做,須要使用鍵盤事件
Python3使用:PyUserInput擴展包
依次執行以下命令:順序不可逆
pip install pywin32-224-cp36-cp36m-win32.whl
pip install pyHook-1.5.1-cp36-cp36m-win32.whl
pip install PyUserInputweb

6、鼠標滑動事件編程

鍵盤事件須知方法
1.實例化
pykey=PyKeyboard()

方法1:
type_string('要上傳的文件路徑')
功能,輸入字符串

方法2:tap_key()
語法1:tap_key(enter_key)
功能:點擊回車鍵
語法2:pykey.tap_key(pykey.shift_key)
功能:敲擊鍵盤上的shift鍵


C:\\Users\\Administrator.USER-20190219YL\\Desktop\\1559176560(1).png

先完成基本功能,而後在進行拋出異常,if判斷,循環等強化工做


下載文件
經過設置瀏覽器配置完成
參數:
1.download.default_diretory:設置下載路徑
2.profile.default_content_settings.popups:表示是否彈出下載的窗口,0表示不彈出(這個設置不必定生效)
函數:
options.add_experimental_option('prefs',prefs)
功能:添加下載配置(路徑,是否彈窗)
語法:
options.add_experimental_option('變量名',變量值)

ActionsCharins鼠標滑動事件
有些控件只有鼠標放到上面後,才能出現,要定位這類控件須要書法鼠標滑動事件
前提:
須要導入:from selenium.webderiver.common.action_chains import ActionChains
方法:
move_to_element('元素'):把鼠標放到指定元素上面,可是注意,這個函數只是把這個操做記錄下來,須要結合perform()才能執行
perform():提交,執行鼠標的操做

例子:
ActionChinas(瀏覽器對象).move_to_element(傳入元素).perform()


強制刷新
從功能角度,咱們須要同時按下Ctrl和F5
這裏須要使用鍵盤事件,須要導入包:
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
方法:
key_down(Keys.xxx):按下XXX按鈕
key_up(Keys.xxx):放開xxx按鈕


富文本操做iframe
方法:switch_to.frame('能夠傳入屬性值或元素')
功能:切換到指定的富文本
注意:切換須要時間,執行該代碼後須要等待幾秒

方法:switch_to.default_content()
功能:將鼠標從富文本中切換出來


滾動條自動化
1.設置滾動條滾動的距離(幅度)
js='document.documentElement.scrollTop=滾動距離';
2.執行滾動操做
deriver.execute_script(js)

練習:在慕課網手記頁面找到指定(Java必學只是,引用篇)的課程,點擊打開
思路:建立兩個循環,外層一個while循環,只要循環條件爲真,則獲取當前頁面全部的課程,並將獲取的課程元素放到一個list變量中,而後嵌套FOR循環,在FOR循環中對獲取到的頁面元素進行遍歷,使用被遍歷的元素的text屬性進行比較,查看是不是咱們要選擇的元素。若是是,進行點擊操做,而且將while循環條件改成False,不然繼續遍歷。FOR循環完畢,若是尚未找到元素,則使用driver.execute_script(js)滑動滾動條



深刻SourceMap原理


C:\Users\Administrator.USER-20190219YL\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/Administrator.USER-20190219YL/PycharmProjects/untitled1/jiaoxue01/cookie01.py


[{'domain': '.imooc.com', 'expiry': 1592392577, 'httpOnly': False, 'name': 'zg_f375fe2f71e542a4b890d9a620f9fb32', 'path': '/', 'secure': False, 'value': '%7B%22sid%22%3A%201560856567301%2C%22updated%22%3A%201560856577369%2C%22info%22%3A%201560856567306%2C%22superProperty%22%3A%20%22%7B%5C%22%E5%BA%94%E7%94%A8%E5%90%8D%E7%A7%B0%5C%22%3A%20%5C%22%E6%85%95%E8%AF%BE%E7%BD%91%E6%95%B0%E6%8D%AE%E7%BB%9F%E8%AE%A1%5C%22%2C%5C%22Platform%5C%22%3A%20%5C%22web%5C%22%7D%22%2C%22platform%22%3A%20%22%7B%7D%22%2C%22utm%22%3A%20%22%7B%7D%22%2C%22referrerDomain%22%3A%20%22%22%2C%22cuid%22%3A%20%22GwndWsS_9fo%2C%22%7D'}, {'domain': '.imooc.com', 'httpOnly': False, 'name': 'apsid', 'path': '/', 'secure': False, 'value': 'g0NTZmYjI0MmY5NzU3ZThhOTZhYmRhN2VkOWNiMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzg3MDIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIzYjUzZGQ4YTcxM2QyMjNhNzY1NWY2ZWFkMTY3NWMzAsgIXQLICF0%3DMT'}, {'domain': '.imooc.com', 'httpOnly': False, 'name': 'Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968', 'path': '/', 'secure': False, 'value': '1560856578'}, {'domain': '.imooc.com', 'expiry': 1592392577, 'httpOnly': False, 'name': 'zg_did', 'path': '/', 'secure': False, 'value': '%7B%22did%22%3A%20%2216b6a4d1dfe84-02a8e16d8b274a-591d3314-15f900-16b6a4d1dff3b8%22%7D'}, {'domain': '.imooc.com', 'httpOnly': False, 'name': 'loginstate', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.imooc.com', 'expiry': 1592392577, 'httpOnly': False, 'name': 'Hm_lvt_f0cfcccd7b1393990c78efdeebff3968', 'path': '/', 'secure': False, 'value': '1560856567'}, {'domain': '.imooc.com', 'expiry': 1592392566.62759, 'httpOnly': False, 'name': 'imooc_isnew_ct', 'path': '/', 'secure': False, 'value': '1560856569'}, {'domain': '.imooc.com', 'httpOnly': False, 'name': 'cvde', 'path': '/', 'secure': False, 'value': '5d08c7f93b5e0-5'}, {'domain': '.imooc.com', 'expiry': 1592392566.627548, 'httpOnly': False, 'name': 'imooc_isnew', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.imooc.com', 'expiry': 1560942977, 'httpOnly': False, 'name': 'IMCDNS', 'path': '/', 'secure': False, 'value': '0'}, {'domain': '.imooc.com', 'expiry': 1592392566.627463, 'httpOnly': False, 'name': 'imooc_uuid', 'path': '/', 'secure': False, 'value': '3a3c1561-8d40-4afb-ae86-3dd84608464a'}]

Process finished with exit code 0
7、獲取服務器返回的cookiewindows

在自動化測試中,若是直接訪問某一個功能地址,可能會報錯,緣由是由於用戶沒有登陸,爲了不這樣的現象,咱們在用戶登陸後須要獲取服務器返回的cookie,並將其種植到本地頁面

方法:
1.get_cookies()
語法:瀏覽器對象.get_cookies()
功能:獲取所有cookie

2.delete_all_cookies()
語法:瀏覽器對象.delete_all_cookies()
功能:刪除全部的cookies

3.add_cookie(cookie)
功能:在當前頁面植入cookie
語法:瀏覽器對象.add_cookie(cookie)
其中cookie是要植入瀏覽器的cookie

截圖自動化
方法:save_screenshot('路徑\\圖片名.png')
功能:截取瀏覽器圖片,以指定圖片名命名,以png格式保存到指定路徑
注意:若是不指定路徑,則保存的當前指定的python.file所在文件夾下

方法:time.strftime("時間格式")
功能:將時間戳按照指定格式轉化爲字符串
例子:time.strftime('%Y%m%d,%H%M%S)
程序會按照「年月日,時分秒」的格式將數據保存到字符串
若是截取到的時間戳是2019年6月15日12時13分11秒
則字符串爲‘20190615121311’


帳號:lxl
密碼:123

[{'domain': '192.168.10.101', 'httpOnly': False, 'name': 'username', 'path': '/aaa', 'secure': False, 'value': 'lxl'},{'domain': '192.168.10.101', 'httpOnly': True, 'name': 'JSESSIONID', 'path': '/aaa', 'secure': False, 'value': '928BDB14DD02A77E9B3759113FF09FDE'}]
八錄製web操做腳本數組

Selenium IDE
1.Selenium IDE是什麼?
Selenium IDE:是一個Firefox插件,用於記錄和播放用戶與瀏覽器的交互(錄製web操做腳本)

1.1爲何學習selenium IDE?【重點】
使用SeleniumIDE錄製的腳本能夠轉換爲代碼語言

環境
1.火狐瀏覽器使用35版本的
2.SeleniumIDE使用2.9.1版本的
3.Firebug


測試網址:
1號店(測試滾動條):http://192.168.10.85:8081/aaa/index2.htm
1號店登陸:http://192.168.10.85:8081/aaa/Login.jsp
富文本:
http://192.168.10.85:8081/aaa/kindeditor/examples/default.html

Selenium IDE如何運行的?
1.Ctrl+Alt+S
2.工具欄中選擇SeleniumIDE
若是看不到工具欄怎麼辦:網頁標籤旁邊的空白處,右鍵-->菜單欄

Selenium IDE菜單說明
1.文件:建立、打開和保存測試案例或測試案例集
2.編輯:複製、粘貼、刪除、撤銷和選擇測試案例中的全部命令
3.Base URL:用來填寫被測網站的地址
4.Fast Slow:速度控制,控制案例的運行速度,最快是Fast,最慢是slow
5.Play entire test suite 運行一個測試案例集中的全部案例
6.Play current test case:運行當前所選定的測試案例
7.Step單步:能夠運行一個案例中的一行命令
8.Click to Record錄製:點擊以後,開始記錄你對瀏覽器的操做。
9.Test Case:案例集列表
10.測試腳本:
table標籤:用表格形式展示命令及參數(至關於測試用例中的測試步驟)。
source標籤:用原始的方式展示,默認是HTML語言格式,也可使用其它展現。
11.RunsFailures:查看腳本運行/失敗的個數
12.Commadn/Target/Value:描述的步驟使用了哪些命令,以及命令對應的參數
13.Log 日誌:將Selenium腳本的運行狀況記錄下來,咱們能夠經過日誌,查看腳本出問題的地方
Refernerce:參考
UI-ELEMENT:UI 元素

腳本重點分析:
1.錄製:錄製時紅色錄製按鈕必定要打開->按下狀態
2.回放:因爲網絡延遲緣由,建議選擇最慢的回放速度
3.瀏覽器:回放時瀏覽器要保持打開狀態(不然點擊回放,彈出提示框報錯)

重點說明:
1.css=input.s_ipt:是1號店搜索框的class屬性和值還有定位方式呀

如何將SeleniumIDE錄製的腳本轉化爲代碼語言?
文件->Export Test Case As->Python 2/unittest/WebDriver

SeleniumIDE腳本編輯與操做【瞭解】
目的:手動修改或者編寫腳本(由於採用錄製方式很容易記錄出多餘的操做)

a.編輯一行命令
在Table標籤下選中某一行命令,命令有command、Target、value組成,能夠對着三部份內容進行編輯

b.插入命令
在某一條命令上右擊,選擇「Insert new Command」命令,就能夠插入一個空白命令行,而後對空白行進行編輯

c.插入註釋
在SeleniumIDE某一行命令上,鼠標右擊,選擇「Insert new Comment」命令插入註釋空白行,本行內容不被執行,可是能夠幫咱們理解腳本,插入的內容以紫色字體顯示。

d.移動命令
有時候咱們須要移動某行命令的順序,咱們只須要左擊鼠標拖動到相應的位置便可。

e.刪除命令
選擇單個或多個命令,而後點擊鼠標右鍵選擇「Delete」

f.命令執行
選定要執行的命令行雙擊便可
注意:有一些命令必須依賴於前面命令的運行結果才能成功執行,不然會大體執行失敗

Selenium IDE經常使用命令【瞭解】
a.open(url)命令
做用:打開指定的URL,URL能夠相對或是絕對的URL

Targert:要打開的URL:value爲空

1)當Target爲空,將打開Base URL中填寫的頁面;
2)當Target不爲空且值爲相對路徑,將打開Base URL+Target頁面。例子:假設Base URL爲http://www.zhi97.com而Target爲/about.aspx,則執行open命令時,將打開http://www.zhi97.com//about.aspx
3)當Target以http://開頭時,將忽略Base URL,直接打開Target的網址;

b.pause(waitTime)
做用:暫停腳本運行
waitTime:等待時間,單位ms(1秒等於1000毫秒)
設置:
在Command中輸入pause
在Target中輸入等待時間,好比等待5秒則輸入5000
value不須要輸入值

c.refresh()
做用:刷新當前頁面
提示:因爲沒有參數,因此Target和Value可不填
設置:
在Command中輸入refresh

d.goBack()
做用:模擬單擊瀏覽器的後退按鈕
提示:因爲沒有參數,因此Target和Value可不填
設置:
在Command中輸入goBack

e.click(locator)
做用:點擊一個鏈接、按鈕、複選框或單選按鈕
提示:若是該點擊事件致使新的頁面加載,命令將會加上後綴「AndWait」,即「clickAnd wait」或「waitForPage Toload」命令;(其實就是多了一個加載的等待時間而已)


f.type(locator,value)
做用:向指定輸入域輸入指定值;也能夠爲下拉框,複選框和單選按鈕賦值
注意:locator也是定位器的意思,和Target一個意思
value表示要輸入的值

g.close()
做用:模擬用戶單擊窗口上的關閉按鈕;
提示:因爲沒有參數,因此Target和Value可不填


經常使用命令總結
1.open-打開網頁
2.pause-暫停,一般於等待頁面加載元素
3.goback-後退 (注意:必須是同一個窗口打開2個以上url才生效)
4.refresh-刷新
5.click-點擊
6.type-輸入
7.close-關閉


瀏覽器

相關文章
相關標籤/搜索