《selenium webdriver實(shí)戰(zhàn)寶典》記

? ? ? 最近在整理已有的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ā)展。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容