? ? ? 最近在整理已有的selenium 知識(shí),于是借來一本之前學(xué)習(xí)過程的書重新快讀了兩遍,結(jié)合自己的知識(shí)記錄下其中的一些內(nèi)容方便以后回顧;
? ? ? 內(nèi)容并不是selenium學(xué)習(xí)教程、答疑,且為自己做的筆記加上一些自己的經(jīng)驗(yàn),本是記錄在word中,后來還是決定放在網(wǎng)絡(luò)上保存便于隨時(shí)查看(從word里面復(fù)制過來的編號(hào)會(huì)有“ [if!supportLists]3.? ? [endif]“”? ,手動(dòng)刪掉),希望對(duì)某些正在selenium學(xué)習(xí)路上的人有一點(diǎn)點(diǎn)作用;有些內(nèi)容記錄較為抽象,或者沒有注意大小寫,如果有一定的selenium經(jīng)驗(yàn)會(huì)有助于對(duì)該文章內(nèi)容的理解,涵蓋的內(nèi)容也存在跨度,筆記的順序和書中內(nèi)容順序相同;
? ? ? ? 還請(qǐng)見諒沒有過多的時(shí)間進(jìn)行詳盡的整理,由于有些內(nèi)容個(gè)人比較熟悉,所以某些與selenium學(xué)習(xí)有幫助的內(nèi)容或許并沒有出現(xiàn)在該文章中或者是一筆帶過;
Ui自動(dòng)化之痛:
1.編寫代碼存在門檻,腳本執(zhí)行時(shí)間:
2.創(chuàng)建腳本、維護(hù)調(diào)試、排錯(cuò)時(shí)間長(zhǎng)
3.業(yè)務(wù)變更、頁(yè)面變更、腳本穩(wěn)定性、人員流動(dòng)性
4.多瀏覽器、多兼容設(shè)備、環(huán)境
自動(dòng)化創(chuàng)新
1.實(shí)用:減輕測(cè)試工作量,提高測(cè)試效率,減輕企業(yè)人員成本
2.效率:讓自動(dòng)化高效、實(shí)用
3.穩(wěn)定性、易維護(hù)性
4.簡(jiǎn)單:降低自動(dòng)化技術(shù)門檻
以下是記錄內(nèi)容:
初級(jí)自動(dòng)化:
TestNG:
優(yōu)點(diǎn):
1.漂亮html報(bào)告;
2.支持并發(fā)測(cè)試;如:testng配置文件設(shè)置
3.參數(shù)化測(cè)試;
4.支持輸出日志;
5.支持更多注釋;
Testng生成報(bào)告在工程目錄下“test-output”目錄里面,index.html報(bào)告;
Testng常用注解:before after suite\group\test\class\method
Testng報(bào)告自定義日志:
Reporter.log(‘記錄日志’);
Xpath定位方法:
相對(duì)路徑、索引號(hào)、屬性值、模糊屬性、xpath軸定位(parent\child\ancestor\descendant\following-sibling\preceding-sibling)、文本定位
特殊用法,某些特殊要求可能會(huì)用到,所有擁有子元素a的div://div[a]? ? ?
Css定位:
相對(duì)路徑、屬性值(其中包含id(#),class(.),部分屬性(^\$\*))、子元素(>)、偽類定位(first-child\nth-child(n)\last-child\focus\enabled\checked)、同級(jí)兄弟(+)
Firefox上以上兩者定位無差別,chrome兼容性稍差,注:Xpath在ie上兼容情況并不好,定位慢,以秒為單位,容易出錯(cuò),不穩(wěn)定,css未大量實(shí)踐過
等待alert彈窗:
public static void waitForAlert(WebDriverWait wait) {
wait.until(ExpectedConditions.alertIsPresent());
}
操作瀏覽器:
Driver.navigate().to(url);
Driver.navigate().back();
Driver.navigate().forward();
Driver.navigate().refresh();
看到有人面試遇到關(guān)于頁(yè)面刷新的問題,關(guān)于個(gè)人想到的selenium 瀏覽器刷新方法:
1.Driver.navigate().refresh();
2.模擬按鍵F5刷新;
3.js刷新;
操作瀏覽器窗口:
Driver.manage().window().setPosition(point);
Driver.manage().window().setsize(dimension);
Driver.manage().window().maximize();
殺掉windows瀏覽器進(jìn)程:
1. WindowsUtils.tryToKillByName(“chrome.exe”);
2.java執(zhí)行command命令:
Process p = Runtime.getRuntime().exec(command);
command: taskkill /f /im chrome.exe
執(zhí)行js:
String text = (String) (JavascriptExecutor)driver.executeScript(“var button = document.getElementById(‘std’); return button.value;”)
拖拽:
New actions(driver).dragAndDropBy(element, 0, 10).build().perform();
Selenium Action模擬鍵盤操作
普通鍵(table\space等,沒有字母按鍵),修飾鍵(ctrl\shift\alt\win等):
Action action= new Action(driver);
actions.sendKeys(Keys.ALT);? ? //相當(dāng)于actions.keyDown(keysToSend),而如果在現(xiàn)實(shí)的應(yīng)用中想要模擬按下并且釋放這些修飾鍵,應(yīng)該再調(diào)用 action.sendKeys(keys.NULL) 來完成這個(gè)動(dòng)作。
action.sendKeys(keys.NULL);
action.keyDown(Keys.ALT);
action.keyUp(Keys.ALT);
使用java Robot類操作keys沒有枚舉的按鍵:
比如字母鍵 a、b、c、d … z,一些符號(hào)鍵比如:‘ {}\[] ’、‘ \ ’、‘?!?、‘ ? ’、‘:’、‘ + ’、‘ - ’、‘ = ’、、‘“”’,還有一些不常用到的功能鍵如PrtSc、ScrLk/NmLk
Robot robot = new Robot();
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);
robot.keyRelease(java.awt.event.KeyEvent.VK_ALT);
上傳附件:
1.element.sendkey(“d:\\a.txt”); //注:一定要符合type="file"的input元素控件,適用范圍小
2.autoit工具上傳;
模擬鼠標(biāo)右鍵
action.contextClick(driver.findElement(By.id(“test”))).perfom();
懸?。?/h3>
action.moveToElement().perform(); Thread.sleep(1000);
鼠標(biāo)左鍵單擊和長(zhǎng)按:
Action.clickandHold(ele).perform();
Action.release(ele).perform();
顯示等待常用:
ExpectedConditions.presenceOfElementLocated(by);-----------頁(yè)面元素在頁(yè)面中是否存在
ExpectedConditions.elementToBeClickable(by);-------------------頁(yè)面元素是否在頁(yè)面上可用和可被單擊
建議擅用自定義顯示等待:
(new WebDriverWait(driver, time)).until(new ExpectedCondition<Boolean>()){
? ? ? ? @Override
? ? ? ? public Boolean apply(WebDriver arg0){
? ? ? ? ? ? ? return _____________________;
? ? ? ? }
}
自定義顯示等待ajax請(qǐng)求加載完成;
return(Boolean)js.executeScript(“return jQuery.active==0”);
ajax了解,w3school:
http://www.w3school.com.cn/ajax/index.asp
AJAX是一種在無需重新加載整個(gè)網(wǎng)頁(yè)的情況下,能夠更新部分網(wǎng)頁(yè)的技術(shù)。
所有現(xiàn)代瀏覽器均支持 XMLHttpRequest 對(duì)象(IE5 和 IE6 使用 ActiveXObject)。
XMLHttpRequest 用于在后臺(tái)與服務(wù)器交換數(shù)據(jù)。這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新。
GET 還是 POST?
與 POST 相比,GET 更簡(jiǎn)單也更快,并且在大部分情況下都能用。
然而,在以下情況中,請(qǐng)使用 POST 請(qǐng)求:
無法使用緩存文件(更新服務(wù)器上的文件或數(shù)據(jù)庫(kù))
向服務(wù)器發(fā)送大量數(shù)據(jù)(POST 沒有數(shù)據(jù)量限制)
發(fā)送包含未知字符的用戶輸入時(shí),POST 比 GET 更穩(wěn)定也更可靠
中級(jí)自動(dòng)化:
WebDriver高級(jí)應(yīng)用(絕大部分涉及到j(luò)s操作):
1.? ? 使用js語(yǔ)句代替某些無法操作的元素,如點(diǎn)擊無效:
((JavascriptExecutor)driver).executeScript(“arguments[0].click();”,element);
2.? ? 設(shè)置一個(gè)頁(yè)面元素的屬性:
((JavascriptExecutor)driver).executeScript(“arguments[0].setAttribute(argument[1],arguments[2]);”,element, attributeName, value);
3.? 某些日期控件設(shè)置日期:
Element.sendkeys(“12/31/2012”);
4.? ? 滾動(dòng)條操作:
a)? ? 將頁(yè)面滾動(dòng)條滑動(dòng)到最下方
((JavascriptExecutor)driver).executeScript(“window.scrollTo(0,document.body.scrollHeight)”);
b)? ? 滑動(dòng)800像素
((JavascriptExecutor)driver).executeScript(“window.scrollTo(0,800)”);
c)? ? 滾動(dòng)到指定的元素顯示在瀏覽器中
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoViewIfNeeded(true);", element);
5.? ? 啟動(dòng)帶有用戶配置信息的Firefox窗口
6.? ? Java 的Robot類操作對(duì)象,模擬鍵盤按鍵
7.? ? 對(duì)象庫(kù)(UI Map),可了解,屬于高級(jí)自動(dòng)化相關(guān)部分:
目的:使用配置文件存儲(chǔ)元素定位,做到將定位的配置文件和測(cè)試程序分離;可提供給不具備編碼能力的人員修改定位;
8.? ? 操作富文本框
a)? ? 使用js設(shè)置富文本框值
Driver.switchTo().frame(富文本框的frame);
// document.getElementsByTagName(‘body’)[0]獲取富文本框編輯區(qū)域?qū)ο?/p>
((JavascriptExecutor)driver).executeScript(“document.getElementsByTagName(‘body’)[0].innerHTML
= ‘內(nèi)容’ ”);
b)? ? Robot類模擬鍵盤操作:
可以通過先將光標(biāo)置于頁(yè)面某個(gè)元素,然后模擬鍵盤table按鍵將光標(biāo)跳轉(zhuǎn)到富文本框內(nèi),再模擬復(fù)制粘貼操作將文本框內(nèi)容寫入;
9.? ? 高亮顯示正在操作的元素,需要自行封裝定位元素操作,加上高亮代碼:
((JavascriptExecutor)driver).executeScript(“arguments[0].setAttribute(‘style’,arguments[1]);”, element, “background:yellow; border: 2px solid red;”);
10. 控制視頻播放
頁(yè)面對(duì)象(PO)模式:
? ? ? 關(guān)于頁(yè)面跳轉(zhuǎn)問題實(shí)現(xiàn):在頁(yè)面跳轉(zhuǎn)的方法里面new下一個(gè)頁(yè)面對(duì)象作為返回值;
數(shù)據(jù)驅(qū)動(dòng)測(cè)試:
? ? ? Testng數(shù)據(jù)驅(qū)動(dòng)注解:@DataProvider
? ? ? a)? ? 使用csv、Excel文件進(jìn)行數(shù)據(jù)驅(qū)動(dòng)
? ? ? b)? ? 使用數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)驅(qū)動(dòng)
行為驅(qū)動(dòng)BBD(Behavior Driven Development), Cucumber框架
關(guān)鍵詞:
Given: 用例開始的前置條件
When: 用例的關(guān)鍵操作步驟
Then:驗(yàn)證步驟
And: 一個(gè)步驟中存在多個(gè)Given操作,后面的Given用And替代
But:? 一個(gè)步驟中存在多個(gè)Then操作,后面的Then用But替代
高級(jí)自動(dòng)化:
Selenium grid組件用于遠(yuǎn)程分布式測(cè)試或并發(fā)測(cè)試;可以在一臺(tái)計(jì)算機(jī)上分發(fā)多個(gè)測(cè)試用例給多臺(tái)計(jì)算機(jī)(不同操作系統(tǒng)、瀏覽器環(huán)境)并發(fā)執(zhí)行,解決某些限時(shí)執(zhí)行、兼容性要求;
Selenium grid 使用hub和node模式(一個(gè)中心、多個(gè)節(jié)點(diǎn));
對(duì)于一個(gè)節(jié)點(diǎn)執(zhí)行一種瀏覽器的情況(個(gè)人觀點(diǎn)):
可以考慮使用Jenkins創(chuàng)建不同的任務(wù)(分別用于不同的瀏覽器兼容環(huán)境測(cè)試),取同一套自動(dòng)化代碼(項(xiàng)目目錄下有專門存放各種properties配置文件的文件夾),在Jenkins配置執(zhí)行command命令,從專門放置properties配置文件夾里面取出不同的兼容環(huán)境的properties配置文件(該文件中瀏覽器參數(shù)配置不同的瀏覽器,不同的grid節(jié)點(diǎn))拷貝覆蓋執(zhí)行時(shí)使用的properties配置文件(command命令原理:copy? testng配置文件夾路徑\**-testng.xml? testng.xml);在testng配置文件里將所有class用例劃分成多個(gè)test組,每個(gè)test組使用一個(gè)線程并行運(yùn)行里面包含的class,實(shí)現(xiàn)可持續(xù)集成遠(yuǎn)程分布兼容環(huán)境并發(fā)性測(cè)試;
自動(dòng)化測(cè)試框架常見的4種模式:
1.? ? 數(shù)據(jù)驅(qū)動(dòng)測(cè)試框架
2.? ? 關(guān)鍵字驅(qū)動(dòng)測(cè)試框架(用戶輸入框,輸入,內(nèi)容)
3.? ? 混合型測(cè)試框架(數(shù)據(jù)驅(qū)動(dòng)+關(guān)鍵字)
4.? ? 行為驅(qū)動(dòng)
Web自動(dòng)化測(cè)試框架搭建步驟:
1.? ? 篩選可自動(dòng)化執(zhí)行的用例和功能;
2.? ? 根據(jù)業(yè)務(wù)類型以及自身能力選擇框架類型;
3.? ? 確定框架后,將常用的瀏覽器選擇、測(cè)試數(shù)據(jù)處理、文件操作、數(shù)據(jù)庫(kù)操作、頁(yè)面元素的原始操作、日志和報(bào)告等功能進(jìn)行類方法的封裝實(shí)現(xiàn),放在項(xiàng)目工具類的包中。
4.? ? 采用pageobject模式和testng框架結(jié)合設(shè)計(jì)的自動(dòng)化框架展開自動(dòng)化腳本編寫,加強(qiáng)復(fù)用操作的封裝性,盡可能的貫徹?cái)?shù)據(jù)與代碼的分離的思想,降低腳本編寫的復(fù)雜度;
5.? ? 根據(jù)項(xiàng)目需求進(jìn)行Jenkins持續(xù)集成;
6.? ? 編寫自動(dòng)化框架常用api文檔,以供他人參閱;
7.? ? 不斷收集自動(dòng)化框架在實(shí)際使用中的問題,優(yōu)化提升框架功能;
框架搭建本身比實(shí)現(xiàn)單個(gè)用例要復(fù)雜很多,主要是抽象、提取、文件分離、易修改、可重用的思想,但是一個(gè)好的框架對(duì)于實(shí)現(xiàn)大量自動(dòng)化腳本來說是磨刀不誤砍柴功;
如項(xiàng)目中存在四類包:
1.? ? cn.gloryroad.appModules:實(shí)現(xiàn)復(fù)用業(yè)務(wù)邏輯的封裝
2.? ? cn.gloryroad.pageObjects:? ? 實(shí)現(xiàn)被測(cè)試對(duì)象的頁(yè)面類
3.? ? cn.gloryroad.testScripts: 實(shí)現(xiàn)具體測(cè)試腳本邏輯,測(cè)試用例實(shí)現(xiàn)
4.? ? cn.gloryroad.util: 實(shí)現(xiàn)測(cè)試過程匯總調(diào)用的工具類方法,如文件操作、mapObject、頁(yè)面元素操作等;
關(guān)鍵字驅(qū)動(dòng):
將操作方法關(guān)鍵字存在放在Excel中固定列,通過java反射機(jī)制獲取關(guān)鍵字類keyWordsaction中所有的方法:method = keyWordsaction.getCalss().getMethods();
找到keywordsaction類的映射方法后,通過invoke方法完成函數(shù)調(diào)用
Method[i].invoke(keywordsaction,value);
關(guān)鍵字框架比數(shù)據(jù)驅(qū)動(dòng)框架更加高級(jí),可以進(jìn)一步提高自動(dòng)化測(cè)試工作實(shí)施效率,實(shí)現(xiàn)在一個(gè)文件中完成測(cè)試用例的維護(hù):
1.? 使用外部測(cè)試數(shù)據(jù)文件,用Excel管理測(cè)試用例集、測(cè)試步驟,實(shí)現(xiàn)在一個(gè)文件中完成用例的維護(hù);
2.? ? 每個(gè)測(cè)試用例的結(jié)果可以再文件中查看;
3.? ? 通過定義關(guān)鍵字、操作元素定位表達(dá)式、操作值來實(shí)現(xiàn)測(cè)試步驟;
4.? ? 實(shí)現(xiàn)表達(dá)式和代碼的分離,實(shí)現(xiàn)表達(dá)式在單一文件中進(jìn)行維護(hù);
5.? ? 框架提供日志功能;
6.? ? 基于關(guān)鍵字的框架使得測(cè)試人員不懂開發(fā)技術(shù)也可以實(shí)現(xiàn)自動(dòng)化測(cè)試,便于在團(tuán)隊(duì)中推廣和使用,降低門檻;
7.? ? 可以進(jìn)行任意的關(guān)鍵字?jǐn)U展,可以滿足更加復(fù)雜的自動(dòng)化測(cè)試需求;
希望自動(dòng)化越走越遠(yuǎn),也祝正在學(xué)習(xí)自動(dòng)化的同學(xué)能夠更好的推進(jìn)自動(dòng)化發(fā)展。