版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
7.1UI自動(dòng)化測(cè)試介紹在學(xué)習(xí)UI自動(dòng)化測(cè)試之前.需要先了解自動(dòng)化測(cè)試是什么.自動(dòng)化測(cè)試是把以人為驅(qū)動(dòng)的測(cè)試行為轉(zhuǎn)化為機(jī)器執(zhí)行的一種過(guò)程.通常.在設(shè)計(jì)了測(cè)試用例并通過(guò)評(píng)審之后.由測(cè)試人員根據(jù)測(cè)試用例中描述的規(guī)程一步步執(zhí)行測(cè)試.將得到的實(shí)際結(jié)果與期望結(jié)果比較.在此過(guò)程中.為了節(jié)省人力、時(shí)間或硬件資源.提高測(cè)試效率.減少人工重復(fù)工作.便引入了自動(dòng)化測(cè)試的概念.在自動(dòng)化測(cè)試中.基于人機(jī)交互的自動(dòng)化測(cè)試.稱為UI自動(dòng)化(UserInterfaceAutoma ̄tion).下一頁(yè)返回7.1UI自動(dòng)化測(cè)試介紹7.1.1自動(dòng)化測(cè)試的優(yōu)勢(shì)和劣勢(shì)自動(dòng)化測(cè)試的優(yōu)勢(shì):回歸測(cè)試更方便可靠.可運(yùn)行更多、更煩瑣的測(cè)試.且快速高效.可執(zhí)行一些手工測(cè)試執(zhí)行相當(dāng)困難或者做不到的測(cè)試.如大量的用戶并發(fā).可更好地利用資源.具有一致性和可重復(fù)性的特點(diǎn).自動(dòng)化測(cè)試腳本完全可復(fù)用.可提升軟件的可信度.可進(jìn)行多環(huán)境下測(cè)試等.自動(dòng)化測(cè)試的劣勢(shì):永遠(yuǎn)不可能完全替代手工測(cè)試.自動(dòng)化測(cè)試無(wú)法做到手工測(cè)試的覆蓋率.不是每個(gè)測(cè)試用例都適合做成自動(dòng)化.如建議一個(gè)界面的布局是否正確.上一頁(yè)下一頁(yè)返回7.1UI自動(dòng)化測(cè)試介紹手工測(cè)試發(fā)現(xiàn)的缺陷遠(yuǎn)比自動(dòng)化測(cè)試多.自動(dòng)化測(cè)試是幾乎無(wú)法發(fā)現(xiàn)新缺陷的.其最大的用途是用來(lái)回歸.確保曾經(jīng)的bug沒(méi)有在新的版本上重新出現(xiàn).自動(dòng)化測(cè)試工具是死的.它不具備任何想象力.自動(dòng)化測(cè)試的好壞完全取決于測(cè)試工程師.自動(dòng)化測(cè)試成本投入高.風(fēng)險(xiǎn)大.對(duì)測(cè)試人員的技術(shù)要求高.對(duì)測(cè)試工具同樣有要求.7.1.2適合自動(dòng)化測(cè)試的項(xiàng)目從投入產(chǎn)出比的角度衡量.只要自動(dòng)化產(chǎn)出大于投入的產(chǎn)品.都可以考慮進(jìn)行自動(dòng)化測(cè)試.那么如何計(jì)算自動(dòng)化產(chǎn)出呢?用一個(gè)簡(jiǎn)化的公式可以表達(dá)如下:上一頁(yè)下一頁(yè)返回7.1UI自動(dòng)化測(cè)試介紹自動(dòng)化的收益=迭代次數(shù)×全手動(dòng)執(zhí)行成本-首次自動(dòng)化成本-維護(hù)次數(shù)×維護(hù)成本從產(chǎn)品維度的角度出發(fā).全部手動(dòng)執(zhí)行成本越高.迭代次數(shù)越多.則收益越明顯.所以體量越大.成熟度越高.更新頻率越高.就越適合進(jìn)行自動(dòng)化測(cè)試.簡(jiǎn)而言之.項(xiàng)目周期長(zhǎng).系統(tǒng)版本不斷.并且需求不會(huì)頻繁變更.此時(shí)是適合引入自動(dòng)化測(cè)試的.上一頁(yè)下一頁(yè)返回7.1UI自動(dòng)化測(cè)試介紹7.1.3進(jìn)行自動(dòng)化測(cè)試需要具備的技能1.建立自動(dòng)化思維能夠發(fā)現(xiàn)問(wèn)題.并輔以自動(dòng)化方式解決問(wèn)題.這就是自動(dòng)化思維.就像學(xué)習(xí)一門(mén)武功.自動(dòng)化思維就是武林秘籍.而編程語(yǔ)言就是使用的兵器.語(yǔ)言的選擇決定了兵器是否好用.而最重要的還是能否了解武林秘籍的精髓.也就是建立自動(dòng)化思想.2.測(cè)試相關(guān)的知識(shí)儲(chǔ)備比如進(jìn)行Web測(cè)試.就需要懂得JS、CSS、HTML、XPath.如果進(jìn)行移動(dòng)端測(cè)試.就得具備Android開(kāi)發(fā)基礎(chǔ)和iOS開(kāi)發(fā)基礎(chǔ).會(huì)調(diào)試APP.上一頁(yè)下一頁(yè)返回7.1UI自動(dòng)化測(cè)試介紹3.掌握一門(mén)開(kāi)發(fā)語(yǔ)言學(xué)習(xí)一種編程語(yǔ)言.Java、Python、Ruby、C#等都可以.4.善于學(xué)習(xí).能夠知其然且知其所以然IT行業(yè)發(fā)展太快.每隔一段時(shí)間就會(huì)出現(xiàn)一些新的東西.原來(lái)很火的東西也會(huì)逐漸沒(méi)落.誰(shuí)都無(wú)法預(yù)測(cè).上一頁(yè)返回7.2PC端UI自動(dòng)化測(cè)試這里的PC指的是Windows系統(tǒng)的電腦端.在現(xiàn)有的眾多UI自動(dòng)化工具中.PC端的UI自動(dòng)化工具無(wú)疑是最多的.歸納為測(cè)試方案.主要有以下兩種:1.錄屏回放方式按時(shí)間間隔完全記錄用戶的鼠標(biāo)和鍵盤(pán)操作.錄制完成后可進(jìn)行回放操作.完全回放用戶的操作.該測(cè)試方案使用最為簡(jiǎn)易.基本上無(wú)法進(jìn)行復(fù)用.一旦UI發(fā)生了變化.或UI出現(xiàn)了卡頓導(dǎo)致UI未加載完畢.后續(xù)的操作就無(wú)法按照既定目標(biāo)進(jìn)行操作.所以錄屏回放方式常用于界面固定、業(yè)務(wù)簡(jiǎn)單的UI測(cè)試.網(wǎng)絡(luò)上這樣的測(cè)試工具較多.這里不再贅述.下一頁(yè)返回7.2PC端UI自動(dòng)化測(cè)試
2.圖片識(shí)別方式對(duì)用戶要操作的UI位置進(jìn)行截圖.使用圖片識(shí)別技術(shù)獲取截圖坐標(biāo)位置.并將工具或代碼編輯的操作在此坐標(biāo)位置進(jìn)行播放.例如:用戶要在打開(kāi)“我的電腦”后再打開(kāi)“D盤(pán)”中的“MYTEST.TXT”文件.使用截圖識(shí)別方式則需要對(duì)“我的電腦”“D盤(pán)”“MYTEST.TXT”這三個(gè)圖標(biāo)進(jìn)行截圖.按順序設(shè)置鼠標(biāo)移動(dòng)到圖片識(shí)別到的位置.進(jìn)行“雙擊”操作.圖片識(shí)別方式相對(duì)錄屏回放方式更加靈活.不受UI卡頓的影響.可通過(guò)圖片識(shí)別方式確認(rèn)UI是否加載完畢.再進(jìn)行下一步操作.圖片識(shí)別方式還可以事先對(duì)操作成功的界面的上一頁(yè)下一頁(yè)返回7.2PC端UI自動(dòng)化測(cè)試
關(guān)鍵位置進(jìn)行截圖.從而達(dá)到在UI自動(dòng)化操作完成后確認(rèn)操作結(jié)果是否成功的目的.圖片識(shí)別方式雖然靈活.但是也有缺點(diǎn).當(dāng)產(chǎn)品UI變化頻繁的時(shí)候.這種測(cè)試方案付出的代價(jià)就很大.UI有變化的截圖都需要重新截取.目前互聯(lián)網(wǎng)公司使用較多的是Python腳本自動(dòng)化.其利用Python的圖片處理庫(kù)進(jìn)行圖片識(shí)別.配合WIN32API進(jìn)行鍵盤(pán)和鼠標(biāo)的操作.在實(shí)際工作中.PC端UI自動(dòng)化還有一種特殊的存在方式.它需要產(chǎn)品接入UI自動(dòng)化SDK.通過(guò)SDK獲取產(chǎn)品UI界面中控件的id、名稱、坐標(biāo)位置.再通過(guò)WIN32API操控鼠標(biāo)和鍵盤(pán)實(shí)現(xiàn)對(duì)產(chǎn)品UI的操作.比較有名的UI自動(dòng)化SDK是GAutomator上一頁(yè)返回7.3Web自動(dòng)化測(cè)試WebUI自動(dòng)化測(cè)試開(kāi)源框架———Selenium2.01.框架初識(shí)WebUI自動(dòng)化自從提出到現(xiàn)在.經(jīng)過(guò)多年的發(fā)展.互聯(lián)網(wǎng)中存在多種多樣的自動(dòng)化框架.比如Selenium、HPQuickTestProfessional、WATIN、SilkTest等.這些框架各有優(yōu)勢(shì).目前多數(shù)企業(yè)級(jí)項(xiàng)目使用的自動(dòng)化框架為Selenium2.0.之所以選擇此框架.主要是此框架有如下特點(diǎn):(1)Selenium是一套開(kāi)源框架.支持多種腳本語(yǔ)言.方便對(duì)其進(jìn)行定制開(kāi)發(fā).下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(2)支持原生JS.兼容性強(qiáng).適用于多數(shù)測(cè)試場(chǎng)景.(3)SeleniumWebDriver成為W3C標(biāo)準(zhǔn).得到Chrome、IE、Edge、Opera、Safari、Fire ̄fox等廣泛的瀏覽器廠商支持.可以使用框架進(jìn)行瀏覽器適配測(cè)試.本書(shū)以Selenium2.0為主.而腳本語(yǔ)言則選用Java.上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
2.環(huán)境搭建(1)環(huán)境準(zhǔn)備.①JavaJDK1.8.②IntelliJIDEA(本書(shū)使用的版本為15.0.1).③WebDriver文件.主流瀏覽器Driver文件下載地址如下:http://chromedriver.storage.googleapis.com/index.html(ChromeDriver).上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
https://github.com/mozilla/geckodriver/releases(FirefoxDrivier).http://selenium-release.storage.googleapis.com/index.html(IEDriver).(2)安裝JDK和IntelliJIDEA.(3)搭建Selenium環(huán)境.①啟動(dòng)IntelliJIDEA.如圖7-1所示.②新建Maven項(xiàng)目.單擊“Next”按鈕.如圖7-2所示.上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
③輸入Maven項(xiàng)目的GroupId和ArtifactId.單擊“Next”按鈕.如圖7-3所示.④輸入工程名稱.單擊“Finish”按鈕.完成項(xiàng)目創(chuàng)建.如圖7-4所示.⑤打開(kāi)Maven配置文件.導(dǎo)入Selenium安裝包.在Maven文件中增加如下配置.如圖7-5所示.<dependencies><dependency><groupId>org.seleniumhq.selenium</groupId>上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
<artifactId>selenium-java</artifactId><version>3.4.0</version></dependency></dependencies>⑥單擊Maven項(xiàng)目->重新導(dǎo)入按鈕.重新導(dǎo)入Maven包.如圖7-6所示.⑦復(fù)制WebDriver可執(zhí)行文件至工程根目錄下.如圖7-7所示.⑧至此.完成配置.上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
3.WebDriverAPI介紹Selenium2.0的主要特性就是與WebDriverAPI的集成.WebDriver旨在提供一個(gè)更簡(jiǎn)單、更簡(jiǎn)潔的編程接口以及解決一些Selenium-RCAPI的限制.Selenium-WebDriver更好的支持頁(yè)面本身不重新加載而頁(yè)面的元素改變的動(dòng)態(tài)網(wǎng)頁(yè).WebDriver的目標(biāo)是提供一個(gè)良好設(shè)計(jì)的面向?qū)ο蟮模粒校?提供對(duì)現(xiàn)代先進(jìn)Web應(yīng)用程序測(cè)試問(wèn)題的改進(jìn)支持.上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
1)用WebDriver打開(kāi)一個(gè)瀏覽器常用的瀏覽器有Firefox和IE兩種.Firefox是Selenium支持得比較成熟的瀏覽器.但是做頁(yè)面的測(cè)試.其速度通常很慢.嚴(yán)重影響持續(xù)集成的速度.這個(gè)時(shí)候建議使用HtmlUnit.不過(guò)HtmlUnitDirver運(yùn)行時(shí)是看不到界面的.對(duì)于調(diào)試來(lái)說(shuō)很不方便.使用哪種瀏覽器可以做成配置項(xiàng).應(yīng)根據(jù)需要靈活配置.(1)打開(kāi)Firefox瀏覽器:publicstaticvoidmain(String[]args){上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
WebDriverwebDriver=newFirefoxDriver().}(2)打開(kāi)IE瀏覽器:publicstaticvoidmain(String[]args){WebDriverwebDriver=newInternetExplorerDriver().}上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(3)打開(kāi)HtmlUnit瀏覽器:publicstaticvoidmain(String[]args){WebDriverwebDriver=newChromeDriver().}2)打開(kāi)測(cè)試頁(yè)面對(duì)頁(yè)面測(cè)試.首先要打開(kāi)被測(cè)試頁(yè)面的地址(如:http://www.baidu.com).WebDriver提供的get方法可以打開(kāi)一個(gè)頁(yè)面:上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
publicstaticvoidmain(String[]args){WebDriverwebDriver=newChromeDriver().System.setProperty("webdriver.chrome.driver"."chromedriver.exe").webDriver.get("http://www.baidu.com").//or上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
webDriver.navigate().to("http://www.baidu.com").webDriver.quit().}至此已經(jīng)可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的自動(dòng)化腳本:importorg.openqa.selenium.By.importorg.openqa.selenium.WebDriver.importorg.openqa.selenium.WebElement.上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
importorg.openqa.selenium.chrome.ChromeDriver.importorg.openqa.selenium.firefox.FirefoxDriver.importorg.openqa.selenium.ie.InternetExplorerDriver.importorg.openqa.selenium.support.ui.ExpectedCondition.importorg.openqa.selenium.support.ui.WebDriverWait.publicstaticvoidexample(){上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
//CreateanewinstanceoftheFirefoxdriver//Noticethattheremainderofthecodereliesontheinterface//nottheimplementation.WebDriverdriver=newFirefoxDriver().//AndnowusethistovisitGoogledriver.get("http://www.baidu.com").上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
//Alternativelythesamethingcanbedonelikethis//driver.navigate().to("http://www.google.com").//FindthetextinputelementbyitsnameWebElementelement=driver.findElement(By.name("q")).上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
//Entersomethingtosearchforelement.sendKeys("Cheese!").//Nowsubmittheform.WebDriverwillfindtheformforusfromtheelementelement.submit().//CheckthetitleofthepageSystem.out.println("Pagetitleis:"+driver.getTitle()).
上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
//Google?ssearchisrendereddynamicallywithJavaScript.//Waitforthepagetoload.timeoutafter10seconds(newWebDriverWait(driver.10)).until(newExpectedCondition<Boolean>(){publicBooleanapply(WebDriverd){returnd.getTitle().toLowerCase().startsWith("cheese!").上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
}}).//Shouldsee:"cheese!-GoogleSearch"System.out.println("Pagetitleis:"+driver.getTitle()).//Closethebrowserdriver.quit().}上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
3)基本操作(1)get方法.操作瀏覽器跳轉(zhuǎn)到指定地址.比如打開(kāi)http://www.baidu.com.driver.get("http://www.baidu.com").(2)navigate方法.操作瀏覽器上方的導(dǎo)航功能(前進(jìn)、后退、刷新、跳轉(zhuǎn)等).上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
webDriver.navigate().to("http://www.baidu.com").webDriver.navigate().forward().webDriver.navigate().back().webDriver.navigate().refresh().(3)getCurrentUrl方法獲取瀏覽器地址欄中的地址信息.Stringurl=webDriver.getCurrentUrl().上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(4)switchTo方法WebDriver進(jìn)行對(duì)象切換.可以切換Iframe、窗體等.webDriver.switchTo().activeElement().//切換至焦點(diǎn)元素webDriver.switchTo().frame().//切換至Iframe元素.webDriver.switchTo().window().//切換至窗體(5)findElements方法上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
WebDriver根據(jù)搜索條件查出所有符合條件的元素.List<WebElement>webElements=webDriver.findElements(By.name("wd")).//通過(guò)name獲取百度搜索框控件集合(6)findElement方法WebDriver根據(jù)搜索條件查出符合條件的第一個(gè)元素.WebElementwebElement=webDriver.findElement(By.id("kw")).//通過(guò)ID獲取百度搜索框控件上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(7)By.id方法查找元素時(shí).定位元素的條件方法.通過(guò)元素ID獲取元素.由于ID在HTML文檔中具有唯一性.所以ID定位的方式準(zhǔn)確度高.WebElementwebElement=webDriver.findElement(By.id("kw")).//通過(guò)ID獲取百度搜索框控件上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(8)By.name方法查找元素時(shí).定位元素的條件方法.通過(guò)元素的name獲取元素.由于name在HTML并不是唯一性質(zhì).所以在查詢時(shí)需要注意篩選正確元素.WebElementwebElement=webDriver.findElement(By.name("wd")).//通過(guò)name獲取百度搜索框控件(9)By.xpath方法查找元素時(shí).定位元素的條件方法.通過(guò)元素的xpath獲取元素.xpath指向的元素在上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
HTML中具有唯一性.所以xpath定位方式準(zhǔn)確度高WebElementwebElement=webDriver.findElement(By.xpath("http://input[@id=?kw?]")).//通過(guò)xpath獲取百度搜索框控件上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(10)By.className方法查找元素時(shí).定位元素的條件方法.通過(guò)元素的className獲取元素.className一般指向元素的樣式名稱.所以通過(guò)className獲取元素通常可以獲取一組樣式相同的元素集合.WebElementwebElement=webDriver.findElement(By.className("s_ipt")).//通過(guò)className獲取百度搜索框控件上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(11)By.linkText方法查找元素時(shí).定位元素的條件方法.通過(guò)連接的文本信息獲取<a/>元素.WebElementwebElement=webDriver.findElement(By.linkText("新聞")).//通過(guò)文本獲取百度首頁(yè)上的新聞連接(12)BytageName方法上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
查找元素時(shí).定位元素的條件方法.通過(guò)元素的標(biāo)簽名來(lái)獲取元素.一般情況下tag ̄Name定位比較麻煩.需要很多前置元素來(lái)輔助定位.WebElementwebElement=webDriver.findElement(By.tagName("in ̄put")).//通過(guò)輸入框的<input>標(biāo)簽定位百度搜索框上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(13)sendKeys方法元素的操作方法.對(duì)HTML頁(yè)面上的輸入框發(fā)送文本信息.WebElementwebElement=webDriver.findElement(By.id("kw")).webElement.sendKeys("軟件自動(dòng)化測(cè)試").//在百度輸入框中輸入文本上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(14)clear方法元素的操作方法.對(duì)HTML輸入框進(jìn)行內(nèi)容清除.WebElementwebElement=webDriver.findElement(By.id("kw")).webElement.sendKeys("軟件自動(dòng)化測(cè)試").webElement.clear().//清空文本信息上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(15)click方法元素的操作方法.模擬用戶單擊HTML元素.WebElementwebElement=webDriver.findElement(By.id("kw")).webElement.click().//單擊百度搜索框上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(16)getText方法獲取元素的文本信息.WebElementwebElement=webDriver.findElement(By.id("kw")).webElement.sendKeys("軟件自動(dòng)化測(cè)試").Stringtext=webElement.getText().//獲取輸入框中的文本信息上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
4)特定控件操作(1)下拉選擇框(Select).找到下拉選擇框的元素:Selectselect=newSelect(webDriver.findElement(By.id("se ̄lect"))).選擇對(duì)應(yīng)的選擇項(xiàng):select.selectByVisibleText("mediaAgencyA").上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
或select.selectByValue("MA_ID_001").不選擇對(duì)應(yīng)的選擇項(xiàng):select.deselectAll().select.deselectByValue("MA_ID_001").select.deselectByVisibleText("mediaAgencyA").上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
或者獲取選擇項(xiàng)的值:select.getAllSelectedOptions().select.getFirstSelectedOption().(2)單選項(xiàng)(RadioButton).找到單選框元素:WebElementbookMode=driver.findElement(By.id("BookMode")).選擇某個(gè)單選項(xiàng):bookMode.click().上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
清空某個(gè)單選項(xiàng):bookMode.clear().判斷某個(gè)單選項(xiàng)是否已經(jīng)被選擇:bookMode.isSelected().(3)多選項(xiàng)(CheckBox)多選項(xiàng)的操作和單選項(xiàng)差不多:WebElementcheckbox=driver.findElement(By.id("myCheckbox.")).checkbox.click().上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
checkbox.clear().checkbox.isSelected().checkbox.isEnabled().(4)按鈕(Button).找到按鈕元素:WebElementsaveButton=driver.findElement(By.id("save")).上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
單擊按鈕:saveButton.click().判斷按鈕是否enable:saveButton.isEnabled().(5)左、右選擇框.左邊是可供選擇項(xiàng).選擇后移動(dòng)到右邊的框中.反之亦然.例如:Selectlang=newSelect(driver.findElement(By.id("languages"))).lang.selectByVisibleText("English").上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
WebElementaddLanguage=driver.findElement(By.id("addButton")).addLanguage.click().(6)彈出對(duì)話框(PopupDialogs).Alertalert=driver.switchTo().alert().alert.accept().alert.dismiss().alert.getText().上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(7)表單(Form).表單中元素的操作和其他元素的操作一樣.對(duì)元素操作完成后對(duì)表單進(jìn)行提交:WebElementapprove=driver.findElement(By.id("approve")).approve.click().或approve.submit().//只適合表單的提交(8)上傳文件(UploadFile).上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
上傳文件的元素操作:WebElementadFileUpload=driver.findElement(By.id("WAP-upload")).StringfilePath="C:\test\\uploadfile\\media_ads\\test.jpg".adFileUpload.sendKeys(filePath).(9)window和frame之間的切換.一般來(lái)說(shuō).登錄后建議:driver.switchTo().defaultContent().上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
切換到某個(gè)frame:driver.switchTo().frame("leftFrame").從一個(gè)frame切換到另一個(gè)frame:driver.switchTo().frame("mainFrame").切換到某個(gè)window:driver.switchTo().window("windowName").上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(10)拖拉(DragandDrop).WebElementelement=driver.findElement(By.name("source")).WebElementtarget=driver.findElement(By.name("target")).(newActions(driver)).dragAndDrop(element.target).perform().上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(11)導(dǎo)航(NavigationandHistory).打開(kāi)一個(gè)新的頁(yè)面:driver.navigate().to("http://www.example.com").通過(guò)歷史導(dǎo)航返回原頁(yè)面:driver.navigate().forward().driver.navigate().back().上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
5)高級(jí)使用(1)讀取Cookie.經(jīng)常要對(duì)Cookie的值進(jìn)行讀取和設(shè)置.增加Cookie://Nowsetthecookie.Thisone?svalidfortheentiredomainCookiecookie=newCookie("key"."value").driver.manage().addCookie(cookie).上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
獲?。茫铮铮耄椋宓闹?//AndnowoutputalltheavailablecookiesforthecurrentURLSet<Cookie>allCookies=driver.manage().getCookies().for(CookieloadedCookie:allCookies){System.out.println(String.format("%s->%s".loadedCookie.getName上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
().loadedCookie.getValue())).}根據(jù)某個(gè)Cookie的name獲?。茫铮铮耄椋宓闹?driver.manage().getCookieNamed("mmsid").刪除Cookie://Youcandeletecookiesin3ways//Bynamedriver.manage().deleteCookieNamed("CookieName").上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
//ByCookiedriver.manage().deleteCookie(loadedCookie).//Orallofthemdriver.manage().deleteAllCookies().(2)調(diào)用JavaScript.WebDriver?qū)Γ剩幔觯幔樱悖颍椋穑舻恼{(diào)用是通過(guò)JavaScriptExecutor來(lái)實(shí)現(xiàn)的.例如:上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
JavascriptExecutorjs=(JavascriptExecutor)driver.js.executeScript("(function(){inventoryGridMgr.setTableFieldVal ̄ue(?+inventoryId+"?.?"+fieldName+"?.?"+value+"?).})()").上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(3)WebDriver截圖.用WebDriver截圖:driver=webdriver.Firefox()driver.save_screenshot("C:\error.jpg")(4)頁(yè)面等待.因?yàn)榧虞d頁(yè)面需要一段時(shí)間.如果頁(yè)面還沒(méi)加載完就查找元素.必然是查找不到的.最好的方式就是設(shè)置一個(gè)默認(rèn)等待時(shí)間.在查找頁(yè)面元素的時(shí)候如果找不到就等待一段時(shí)間再找.直到超時(shí).上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
WebDriver提供兩種方法.一種是顯性等待.另一種是隱性等待.顯性等待:WebDriverdriver=newFirefoxDriver().driver.get("http://somedomain/url_that_delays_loading").WebElementmyDynamicElement=(newWebDriverWait(driver.10))上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
.until(newExpectedCondition<WebElement>(){@OverridepublicWebElementapply(WebDriverd){returnd.findElement(By.id("myDynamicElement")).}}).上一頁(yè)下一頁(yè)返回7.3Web自動(dòng)化測(cè)試
(5)隱性等待:WebDriverdriver=newFirefoxDriver().driver.manage().timeouts().implicitlyWait(10.TimeUnit.SECONDS).driver.get("http://somedomain/url_that_delays_loading").WebElementmyDynamicElement=driver.findElement(By.id("myDynamicEle ̄ment")).上一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架7.4.1框架初識(shí)Appium是一個(gè)開(kāi)源、跨平臺(tái)的測(cè)試框架.可以用來(lái)測(cè)試原生及混合的移動(dòng)端應(yīng)用.Ap ̄pium支持iOS、Android及FirefoxOS平臺(tái).Appium使用WebDriver的JSONWire協(xié)議.來(lái)驅(qū)動(dòng)Apple系統(tǒng)的UIAutomation庫(kù)、Android系統(tǒng)的UIAutomator框架.Appium對(duì)iOS系統(tǒng)的支持得益于DanCuellars對(duì)于iOS自動(dòng)化的研究.Appium也集成了Selendroid.以支持Android的老版本.下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
Appium選擇了client-server的設(shè)計(jì)模式.只要client能夠發(fā)送HTTP請(qǐng)求給server.cli ̄ent用什么語(yǔ)言來(lái)實(shí)現(xiàn)都是可以的.這就是為什么Appium及WebDriver能夠支持多語(yǔ)言.如果只使用蘋(píng)果公司的UIAutomation.則只能用JavaScript來(lái)編寫(xiě)測(cè)試用例.而且只能用In ̄struction來(lái)運(yùn)行測(cè)試用例.同樣.如果只使用谷歌公司的UIAutomation.則只能用Java來(lái)編寫(xiě)測(cè)試用例.Appium實(shí)現(xiàn)了真正的跨平臺(tái)自動(dòng)化測(cè)試.選擇Appium的原因如下:(1)Appium支持Android和iOS自動(dòng)化測(cè)試.上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
(2)Appium支持SeleniumWebDriver所支持的所有語(yǔ)言.如Java、Object-C、JavaS ̄cript、Php、Python、Ruby、C#、Clojure.以及Perl語(yǔ)言.還可以使用SeleniumWebDriver的API.(3)Appium是一個(gè)開(kāi)源框架.方便擴(kuò)展和定制.7.4.2環(huán)境搭建1.安裝node.js(1)到官網(wǎng)下載安裝軟件(https://nodejs.org/en/download/).如圖7-8所示.上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
(2)獲取安裝文件后.直接雙擊安裝文件.根據(jù)程序的提示.完成node.js的安裝.(3)安裝完成后.運(yùn)行cmd.輸入“node-v”.如果安裝成功.會(huì)輸出對(duì)應(yīng)的版本信息.如圖7-9所示.2.配置AndroidSDK環(huán)境(1)SDK環(huán)境配置:http://www.cnblogs.com/puresoul/p/4597211.html.(2)確保安裝了Level17或以上版本的API.(3)設(shè)置ANDROID_HOME系統(tǒng)變量為用戶的AndroidSDK路徑.如圖7-10所示:上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
(4)把“tools”和“platform-tools”兩個(gè)目錄加入到系統(tǒng)的Path路徑里.如圖7-11所示:F:\ProgramFiles(x86)\Android\android-sdk\platform-tools.F:\ProgramFiles(x86)\Android\android-sdk\tools3.安裝手機(jī)驅(qū)動(dòng)并測(cè)試連接真機(jī)完成上述步驟以后.將手機(jī)與PC通過(guò)USB線相連.在cmd中輸入“adbdevices”.若能看到設(shè)備則表示連接成功.上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
4.安裝Appium(1)下載安裝文件:https://bitbucket.org/appium/appium.app/downloads/.(2)直接雙擊“appium-installerexe”文件進(jìn)行安裝.桌面上會(huì)生成一個(gè)Appium的圖標(biāo).(3)把node_modules的“bin”目錄放到系統(tǒng)的Path路徑里.C:\ProgramFiles(x86)\Appium\node_modules\.bin上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
(4)檢查Appium所需的環(huán)境是否成功.進(jìn)入cmd命令行.輸入“appium-doctor”.出現(xiàn)提示“AllChecksweresuccessful”.說(shuō)明環(huán)境成功.5.配置UI自動(dòng)化項(xiàng)目(1)啟動(dòng)IntelliJIDEA.如圖7-15所示.(2)新建Maven項(xiàng)目.單擊“Next”按鈕.如圖7-16所示.(3)輸入Maven項(xiàng)目的GroupId和ArtifactId.單擊“Next”按鈕.如圖7-17所示.上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
(4)輸入工程名稱.單擊“Finish”按鈕.完成項(xiàng)目創(chuàng)建.如圖7-18所示.(5)打開(kāi)Maven配置文件.導(dǎo)入Selenium安裝包.在Maven文件中增加如下配置.如圖7-19所示:<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId>上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
<version>3.4.0</version></dependency><dependency><groupId>io.appium</groupId><artifactId>java-client</artifactId><version>3.4.0</version></dependency>上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
(6)單擊Maven項(xiàng)目→重新導(dǎo)入按鈕.重新導(dǎo)入Maven包.如圖7-20所示.(7)至此.完成配置.6.測(cè)試APP下載(1)下載測(cè)試的文件ContactManager.apk:https://github.com/appium/sample-code/tree/master/sample-code/apps/ContactManager(2)將下載的APK放到項(xiàng)目的“apps”目錄下.如圖7-21所示.上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
7.4.3框架API介紹1.打開(kāi)一個(gè)應(yīng)用在開(kāi)始了解AppiumAPI之前.需要了解API的驅(qū)動(dòng)是怎么初始化的.并啟動(dòng)APP上的應(yīng)用.前面已經(jīng)了解了Selenium的啟動(dòng)方式.Appium的啟動(dòng)方式與Selenium相似.但是在啟動(dòng)之前需要配置應(yīng)用的啟動(dòng)信息.才能讓驅(qū)動(dòng)識(shí)別出要測(cè)試的應(yīng)用.并分配元素解析策略.如圖7-22所示.上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
AppiumDriverdriver.FileclasspathRoot=newFile(System.getProperty("user.dir")).FileappDir=newFile(classpathRoot."/apps").Fileapp=newFile(appDir."ContactManager.apk").上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
DesiredCapabilitiescapabilities=newDesiredCapabilities().capabilities.setCapability("deviceName"."4d1219502472216f").capabilities.setCapability("platformVersion"."4.4").capabilities.setCapability("app".app.getAbsolutePath()).上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
capabilities.setCapability("appPackage"."com.example.android.con ̄tactmanager").capabilities.setCapability("appActivity".".ContactManager").driver=newAndroidDriver<AndroidElement>(newURL("http://127.0.0.1:4723/wd/hub").capabilities).System.out.println("Appislaunched!").上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
2.基本操作1)getAppStrings()默認(rèn)系統(tǒng)語(yǔ)言對(duì)應(yīng)的“Strings.xml”文件內(nèi)的數(shù)據(jù).2)getAppStrings(Stringlanguage)查找某一個(gè)語(yǔ)言環(huán)境對(duì)應(yīng)的字符串文件“Strings.xml”內(nèi)的數(shù)據(jù).3)sendKeyEvent(intkey)按下某個(gè)鍵.具體哪個(gè)鍵由key值決定.key值定義在AndroidKeyCode類(lèi)中:driver.sendKeyEvent(AndroidKeyCode.BACK).//發(fā)送回退鍵上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
4)sendKeyEvent(intkey.Integermetastate)在按下某個(gè)鍵的同時(shí)按下附加鍵(Ctrl/Alt/Shift鍵等).具體是哪些鍵.由key值(在AndroidKeyCode類(lèi)中定義)和metastate值(在AndroidKeyMetastate類(lèi)中定義)決定:driver.sendKeyEvent(AndroidKeyCode.BACK.AndroidKeyMetastate.META_ALT_LEFT_ON).//發(fā)送左Alt+回退鍵上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
5)currentActivity()獲取當(dāng)前activity.比如(.ApiDemos):driver.currentActivity().//獲取當(dāng)前的activity6)isAppInstalled(StringbundleId)根據(jù)bundleId來(lái)判斷該應(yīng)用是否已經(jīng)安裝.7)installApp(StringappPath)安裝APP.appPath為應(yīng)用的本地路徑.上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
8)removeApp(StringbundleId)卸載APP.bundleId在Android系統(tǒng)中代表的是報(bào)名.而在iOS中有專門(mén)的bundleId號(hào).9)closeApp()關(guān)閉應(yīng)用.其實(shí)就是按Home鍵把應(yīng)用置于后臺(tái).10)launchApp()啟動(dòng)應(yīng)用.11)resetApp()先關(guān)閉App.然后再啟動(dòng)APP.上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
12)pushFile(StringremotePath.byte[]base64Data)將字符數(shù)組用64位格式寫(xiě)到遠(yuǎn)程目錄的某個(gè)文件中.也可以理解為把本地文件push到設(shè)備上.13)pullFile(StringremotePath)將設(shè)備上的文件pull到本地硬盤(pán)上.14)pullFolder(StringremotePath)將設(shè)備上的文件夾pull到本地硬盤(pán)上.一般遠(yuǎn)程文件為“/data/local/tmp”下的文件.上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
15)setNetworkConnection(NetworkConnectionSettingconnection)設(shè)置手機(jī)的網(wǎng)絡(luò)連接狀態(tài).可以開(kāi)關(guān)藍(lán)牙、WiFi、數(shù)據(jù)流量.通過(guò)NetworkConnectionS ̄etting中的屬性來(lái)設(shè)置各個(gè)網(wǎng)絡(luò)連接的狀態(tài):driver.setNetworkConnection(newNetworkConnectionSetting(false.true.false)).//設(shè)置當(dāng)前狀態(tài).飛行模式關(guān)閉、WiFi開(kāi)啟、數(shù)據(jù)網(wǎng)絡(luò)關(guān)閉上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
16)openNotifications()打開(kāi)通知欄.17)runAppInBackground(intseconds)與resetApp類(lèi)似.區(qū)別是resetApp關(guān)閉后立即啟動(dòng).而這個(gè)方法是關(guān)閉后等待seconds秒后再啟動(dòng).18)hideKeyboard()在iOS系統(tǒng)中隱藏鍵盤(pán).19)hideKeyboard(Stringstrategy.StringkeyName)隱藏鍵盤(pán).只能用于iOS系統(tǒng).上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
20)performTouchAction(TouchActiontouchAction)執(zhí)行一個(gè)touch動(dòng)作.該touch動(dòng)作是由TouchAction封裝的:TouchActiontouchAction=newTouchAction(dr).touchAction.moveTo(10.100).driver.performTouchAction(touchAction).21)performMultiTouchAction(MultiTouchActionmultiAction)上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
執(zhí)行多步touch動(dòng)作.即由MultiTouchAction封裝的多步操作:TouchActiontouchAction=newTouchAction(dr).touchAction.moveTo(10.100).MultiTouchActionmultiTouchAction=newMultiTouchAction(driver).上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
multiTouchAction.add(touchAction).driver.performMultiTouchAction(multiTouchAction).22)tap(intfingers.WebElementelement.intduration)按下element控件中心點(diǎn).duration×5毫秒后松開(kāi).如此重復(fù)fingers次:上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
List<AndroidElement>androidElement=driver.findElements(By.id("kw")).driver.tap(5.androidElement.get(0).5).23)tap(intfingers.intx.inty.intduration)按下(x.y)點(diǎn).duration×5毫秒后松開(kāi).如此重復(fù)fingers次.24)swipe(intstartx.intstarty.intendx.intendy.intduration)上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
從(startx.starty)滑到(endx.endy).分duration步滑.每一步用時(shí)是5毫秒.25)pinch(WebElementel)用2個(gè)手指操作控件.從對(duì)角線向中心點(diǎn)滑動(dòng):List<AndroidElement>androidElement=driver.findElements(By.id("kw")).driver.pinch(androidElement.get(0)).上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
26)pinch(intx.inty)以(x.y)為基準(zhǔn).計(jì)算得出(x.y-100).(x.y+100)兩個(gè)點(diǎn).然后用2個(gè)手指按住這兩個(gè)點(diǎn)同時(shí)滑到(x.y).27)zoom(WebElementel)與pinch(el)的動(dòng)作剛好相反.用兩個(gè)手指由控件的中心點(diǎn)慢慢移向控件的左頂點(diǎn)后右底點(diǎn)滑動(dòng).28)zoom(intx.inty)和pinch(x.y)的動(dòng)作相反.用兩個(gè)手指從(x.y)點(diǎn)開(kāi)始向(x.y-100)和(x.y+100)兩個(gè)點(diǎn)滑動(dòng).上一頁(yè)下一頁(yè)返回7.4移動(dòng)端UI自動(dòng)化框架
29)getNamedTextField(Stringname)一般
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金礦采選建設(shè)項(xiàng)目經(jīng)濟(jì)效益和社會(huì)效益分析報(bào)告
- 鋼結(jié)構(gòu)冷彎設(shè)計(jì)方案
- 腳手架施工中時(shí)間管理策略方案
- 未來(lái)五年動(dòng)物毛類(lèi)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級(jí)戰(zhàn)略分析研究報(bào)告
- 土方工程施工現(xiàn)場(chǎng)交通疏導(dǎo)方案
- 未來(lái)五年綠化苗木企業(yè)縣域市場(chǎng)拓展與下沉戰(zhàn)略分析研究報(bào)告
- 2025年樂(lè)業(yè)縣委社會(huì)工作部下屬事業(yè)單位招聘職業(yè)能力測(cè)試備考題庫(kù)300道附答案
- 未來(lái)五年安保服裝企業(yè)縣域市場(chǎng)拓展與下沉戰(zhàn)略分析研究報(bào)告
- 施工現(xiàn)場(chǎng)施工日志管理方案
- 模板施工效率提升方案
- 駁回再審裁定書(shū)申請(qǐng)抗訴范文
- 果園租賃協(xié)議書(shū)2025年
- 2025北京高三二模語(yǔ)文匯編:微寫(xiě)作
- DB6301∕T 4-2023 住宅物業(yè)星級(jí)服務(wù)規(guī)范
- 護(hù)理查房與病例討論區(qū)別
- 公司特殊貢獻(xiàn)獎(jiǎng)管理制度
- T/CA 105-2019手機(jī)殼套通用規(guī)范
- 2025-2031年中國(guó)汽車(chē)維修設(shè)備行業(yè)市場(chǎng)全景評(píng)估及產(chǎn)業(yè)前景研判報(bào)告
- 門(mén)窗拆除合同協(xié)議書(shū)范本
- GB/T 1040.1-2025塑料拉伸性能的測(cè)定第1部分:總則
- 重癥胰腺炎的中醫(yī)護(hù)理
評(píng)論
0/150
提交評(píng)論