目錄
一、了解自動(dòng)化測(cè)試和selenium
1.?什么是自動(dòng)化測(cè)試?為什么要使用自動(dòng)化測(cè)試?
2.?為什么使用selenium?
3.?環(huán)境部署
4.?什么是驅(qū)動(dòng)?驅(qū)動(dòng)的工作原理
5.?selenium?的依賴(lài)代碼
二、selenium?的基礎(chǔ)語(yǔ)法
1.?元素的定位
(1)css選擇器的定位
(2)xpath?路徑
2.?元素的操作
(1)點(diǎn)擊:click() ;提交:submit()
(2)模擬按鍵輸入:sendKeys()
(3)清除文本內(nèi)容 clear()
(4)獲取文本 getText()
?3.?等待
(1)強(qiáng)制等待
(2)隱式等待
(3)顯式等待
4.?信息的打印
5.?窗口
(1)窗口的切換
(2)窗口的大小
(3)頁(yè)面的上下滾動(dòng)
6.?導(dǎo)航
(1)前進(jìn)
(2)后退
7.?警告框(彈窗)
8.?鼠標(biāo)和鍵盤(pán)的操作
(1)鼠標(biāo)
(2)鍵盤(pán)
9.?選擇框
10.?文件上傳
11.?屏幕截圖
一、了解自動(dòng)化測(cè)試和selenium
1.?什么是自動(dòng)化測(cè)試?為什么要使用自動(dòng)化測(cè)試?
? ? ? ? 自動(dòng)化測(cè)試能夠代替一小部分的手工測(cè)試,提高測(cè)試的效率。比如在回歸測(cè)試時(shí),當(dāng)軟件的版本不斷跟新,而以前的每一個(gè)舊的版本仍然需要進(jìn)行測(cè)試,如果是手工測(cè)試的話,效率會(huì)大大降低,所以我們需要借助自動(dòng)化測(cè)試來(lái)進(jìn)行回歸測(cè)試。?
2.?為什么使用selenium?
(1)開(kāi)源免費(fèi)
(2)支持多瀏覽器。(Chrome、Firefox、IE、edge、Safari(Mac默認(rèn)瀏覽器)....)
(3)支持多系統(tǒng)。(Linux、Windows、MacOS....)
(4)支持多語(yǔ)言。(Java、Python...)
(5)selenium?底層實(shí)現(xiàn)了很多可供我們使用的API。
3.?環(huán)境部署
- selenium?工具包
- Chrome瀏覽器
- Chromedriver谷歌驅(qū)動(dòng)
- java版本最低要求8
4.?什么是驅(qū)動(dòng)?驅(qū)動(dòng)的工作原理
? ? ? ? 類(lèi)似汽車(chē)的驅(qū)動(dòng)一樣,汽車(chē)有兩輪驅(qū)動(dòng)、四輪驅(qū)動(dòng),可以讓那個(gè)汽車(chē)跑起來(lái)。這里的驅(qū)動(dòng)是指打開(kāi)瀏覽器。
? ? ? ? 因?yàn)橐褂米詣?dòng)化測(cè)試,人工測(cè)試要打開(kāi)瀏覽器,自動(dòng)化測(cè)試?yán)锞褪褂抿?qū)動(dòng)來(lái)打開(kāi)瀏覽器。我們可以通過(guò)代碼來(lái)讓驅(qū)動(dòng)打開(kāi)瀏覽器。
selenium?和?驅(qū)動(dòng)?和 瀏覽器?之間的關(guān)系:
根據(jù)圖中,代碼要發(fā)送請(qǐng)求,驅(qū)動(dòng)要接收請(qǐng)求、解析請(qǐng)求。因此這里是驅(qū)動(dòng)就是一個(gè)服務(wù)器。其IP:127.0.0.1,端口號(hào):9515 。(可以打開(kāi)驅(qū)動(dòng)的文件看到)
5.?selenium?的依賴(lài)代碼
? ? ? ? 在Maven項(xiàng)目中的?pom.xml?中導(dǎo)入?selenium?的依賴(lài)。(也可以在Maven Repository: Search/Browse/Explore? 搜索selenium?找到依賴(lài)代碼)?
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
二、selenium?的基礎(chǔ)語(yǔ)法
1.?元素的定位
driver.findElement() : 定位頁(yè)面的元素
參數(shù):抽象類(lèi)By里的方法,如cssSelector、xpath、id、name、classname。
?css與xpath:
css選擇器:依據(jù)頁(yè)面的數(shù)據(jù)樣式定位,有標(biāo)簽選擇、類(lèi)選擇、id選擇,或者他們的交并集。
xpath路徑:xpath是路徑表達(dá)式,所有元素和內(nèi)容都可以成為路徑的一部分。
? ? ? ? 兩種定位方式功能基本一致,但是:
css選擇器:定位方式速度更快,較為簡(jiǎn)潔,但是結(jié)構(gòu)不夠靈活,不能定位復(fù)雜的html元素。
xpath路徑:功能更強(qiáng)大,雖然寫(xiě)起來(lái)比較復(fù)雜,但是可以選取的內(nèi)容更豐富。特別是父節(jié)點(diǎn)的反向選擇上,這是css選擇器無(wú)法完成的,而xpath內(nèi)置的函數(shù)又使結(jié)構(gòu)更易定制。并且某些瀏覽器不支持css定位,在一般的自動(dòng)化測(cè)試過(guò)程中使用xpath定位方式要比css更普遍。
(在實(shí)際使用中,對(duì)二者進(jìn)行適當(dāng)選擇)
(下面的代碼只是使用方法代碼,進(jìn)行自動(dòng)化測(cè)試還要加上?獲取drive對(duì)象,傳入百度的URL。最后還要關(guān)閉驅(qū)動(dòng))
(1)css選擇器的定位
css選擇器:
- 基礎(chǔ)選擇器:id選擇器、類(lèi)選擇器、標(biāo)簽選擇器...
- 符合選擇器:子類(lèi)選擇器、父類(lèi)選擇器...
public void dingwei_Test1(){
//1. css選擇器的定位
String xwtext = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
//將結(jié)果在控制端進(jìn)行顯示,方便看操作
System.out.println("xwtext : " + xwtext);
}
(2)xpath?路徑
? ? ? ? 定位元素必須要唯一。
語(yǔ)法:
- 層級(jí):/?次級(jí);//?跳級(jí)
- 屬性:@
- 函數(shù):contains() .....
public void dingwei_Test2() throws InterruptedException {
//2. xpath選擇器
driver.findElement(By.xpath("http://*[@id=\"kw\"]")).sendKeys("selenium");
driver.findElement(By.xpath("http://*[@id=\"su\"]")).click();
Thread.sleep(2000);
driver.findElement(By.xpath("http://*[@id=\"2\"]/div/div/h3/a")).click();
Thread.sleep(2000);
}
2.?元素的操作
(1)點(diǎn)擊:click() ;提交:submit()
? ? ? ? click?和?submit (回車(chē))都可以操作按鈕,但是可以click?不一定可以?submit。只要是頁(yè)面元素都可以?click。
public void control_Test1() throws InterruptedException {
//1. click點(diǎn)擊行為
//點(diǎn)擊百度一下
driver.findElement(By.xpath("http://*[@id=\"su\"]")).click();
Thread.sleep(2000);
//點(diǎn)擊百度熱搜里的一個(gè)鏈接
driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(4) > a > span.title-content-title")).click();
Thread.sleep(2000);
}
public void control_Test2() throws InterruptedException {
//2. submit提交行為
driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
Thread.sleep(2000);
driver.findElement(By.cssSelector("#su")).submit();
Thread.sleep(2000);
}
(2)模擬按鍵輸入:sendKeys()
driver.findElement(By.cssSelector("#kw")).sendKeys("#@$@^@$");
(3)清除文本內(nèi)容 clear()
driver.findElement(By.cssSelector("#kw")).clear();
(4)獲取文本 getText()
? ? ? ? 要分清是文本內(nèi)容,還是屬性值。
獲取文本內(nèi)容:getText()
獲取屬性值:getAttribute()
獲取文本內(nèi)容:
public void control_Test5() { //5.獲取文本內(nèi)容 String str = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText(); System.out.println("預(yù)期輸出:端牢中國(guó)飯碗 綜合實(shí)施保夏收; 實(shí)際輸出:" + str); }
?獲取屬性值:
public void control_Test6() { //6. 獲取屬性值 String str = driver.findElement(By.cssSelector("#su")).getAttribute("value"); System.out.println("預(yù)期獲取的屬性值:百度一下 實(shí)際輸出:" + str); }
?3.?等待
? ? ? ? 代碼的執(zhí)行速度比較快,當(dāng)我們跳轉(zhuǎn)到新的頁(yè)面的時(shí)候,前端的代碼還需要一定的時(shí)間錦繡檸渲染。因此我們不能在前端頁(yè)面渲染的時(shí)候就執(zhí)行下一條語(yǔ)句。因此要使用等待。
(1)強(qiáng)制等待
? ? ? ? 讓程序暫停一會(huì),等待指定的時(shí)間之后再讓程序正常運(yùn)行。(這個(gè)時(shí)間要人為的自己規(guī)定,不能太短也不能太長(zhǎng))
Threat.sleep(2000)
public void WaitTest1() {
//1. 強(qiáng)制等待:使用Thread.sleep
driver.findElement(By.xpath("http://*[@id=\"su\"]")).click();
//強(qiáng)制等待2秒
Thread.sleep(2000);
//點(diǎn)擊百度熱搜里的一個(gè)鏈接
driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(4) > a > span.title-content-title")).click();
//再?gòu)?qiáng)制等待2秒
Thread.sleep(2000);
}
優(yōu)點(diǎn):語(yǔ)法簡(jiǎn)單,適合調(diào)試的時(shí)候使用。
缺點(diǎn):每次都等待固定的時(shí)間,造成時(shí)間的大量消耗。減小了自動(dòng)化測(cè)試的效率。
(2)隱式等待
? ? ? ? 在規(guī)定的時(shí)間范圍內(nèi),一輪詢(xún)的方式執(zhí)行。當(dāng)要執(zhí)行的元素可以定位,就結(jié)束等待,如果沒(méi)有在規(guī)定的時(shí)間內(nèi)定位到,就輪詢(xún)的方式一直判斷。
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
優(yōu)點(diǎn):節(jié)省了大量的等待時(shí)間。
缺點(diǎn):要等到所有元素全部顯示才會(huì)執(zhí)行,仍有不必要的時(shí)間浪費(fèi)。
(3)顯式等待
? ? ? ? 針對(duì)某一個(gè)元素的顯示來(lái)進(jìn)行等待。
WebDriverWait foo = new WebDriverWait(driver,Duration.ofSeconds(3));
foo.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("")));
第一個(gè)參數(shù):webdriver對(duì)象
第二個(gè)參數(shù):Duration?類(lèi)方法,用于設(shè)置強(qiáng)制等待時(shí)間。?
until?方法:等待到括號(hào)里的條件滿(mǎn)足為止。
優(yōu)點(diǎn):針對(duì)某一個(gè)元素進(jìn)行等待,大大縮短了等待時(shí)間。
缺點(diǎn):寫(xiě)法更為復(fù)雜。
4.?信息的打印
打印標(biāo)題:gettitle()
String str = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
打印屬性:getAttribute()
String str = driver.findElement(By.cssSelector("#su")).getAttribute("value");
5.?窗口
(1)窗口的切換
? ? ? ? selenium?不知道要切換哪一個(gè)頁(yè)面,所以就直接操作打開(kāi)的第一個(gè)頁(yè)面。當(dāng)我們想操作新打開(kāi)的新頁(yè)面的時(shí)候,就要手動(dòng)切換句柄。否則不能找到新頁(yè)面的元素。(選擇器選擇不到,會(huì)報(bào)錯(cuò))
獲取當(dāng)前的頁(yè)面的句柄:driver.getWindowHandle()? ? 返回值:String
String str = driver.getWindowHandle();
獲取所有頁(yè)面的句柄:driver.getWindowHandles()? ?返回值:Set
Set<String> set = driver.getWindowHandles();
切換到指定的句柄:driver.switch.window(句柄)
Set<String> set = driver.getWindowHandles();
for(String str : set) {
if (!str.equals(driver.getWindowHandle())) {
driver.switchTo().window(str);
}
}
(2)窗口的大小
? ? ? ? 描述窗口?driver.manage.window()
窗口的最大化:driver.manage.window.maxmize()
窗口的最小化:driver.manage.winsow.minmize()
@Test
public void testWindowSize(){
WebDriver.Window window = driver.manage().window();
window.maximize();
window.minimize();
}
指定窗口大?。篸river.manage.window.setSize(new Dimension(寬度,高度))
(3)頁(yè)面的上下滾動(dòng)
driver.executeScripe(" ");?里面?zhèn)鞯氖荍S代碼。
6.?導(dǎo)航
driver.navigate()
(1)前進(jìn)
driver.navigate().forward();
//前進(jìn)
driver.navigate().forward();
(2)后退
driver.navigate().back();
//后退
driver.navigate().back();
7.?警告框(彈窗)
? ? ? ? 使用接口Alert。
切換到警告框:Alert alert = driver.switchTo().alert();
點(diǎn)擊確認(rèn)按鈕:alert.accept();
點(diǎn)擊取消按鈕:alert.dismiss();
輸入信息:sendKeys(" ");
8.?鼠標(biāo)和鍵盤(pán)的操作
? ? ? ? 使用接口Actions。需要實(shí)例化一個(gè)Actions。
Actions?actions =?new Actions(driver);
(1)鼠標(biāo)
移動(dòng)到指定元素并保持:actions.clickAndHold(Webelement ele).perform();
@Test
public void testClick(){
WebElement element = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title"));
Actions actions = new Actions(driver);
actions.clickAndHold(element).perform();
}
移動(dòng)到指定元素并點(diǎn)擊:actions.click().perform();
@Test
public void testClick2(){
WebElement element = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title"));
Actions actions = new Actions(driver);
actions.click(element).perform();
}
(2)鍵盤(pán)
sendKeys(" ");
9.?選擇框
? ? ? ? 使用類(lèi) Select。先實(shí)例化一個(gè)對(duì)象。
Select select = new Select(Webelement ele);
選擇方法有三種:
通過(guò)索引來(lái)選擇: selece.selectByIndex();?參數(shù):索引值,從0開(kāi)始。
通過(guò)value屬性來(lái)選擇:select.selectByValue("value");
通過(guò)可見(jiàn)的文本來(lái)選擇:select.selectByvisibleText(" ");
10.?文件上傳
? ? ? ? selenium?不能操作系統(tǒng)的窗口。
巧方法:使用sendKeys,傳入文件的路徑 +?文件名。
driver.finElement(By.).sendkeys(" 文件的路徑 +?文件名 ");
11.?屏幕截圖
進(jìn)行截圖:File srcfile = driver.getScreenshotAs(OutputType.File);? 以文件形式保存
截圖保存到指定路徑下:
File filename = new File("路徑 +?指定的截圖名");
FileUtils.copyFile(srcfile, filename);文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-464172.html
? ? ? ? 一般將屏幕截圖的方法寫(xiě)在Common類(lèi)中,在要用的方法的里面直接調(diào)用。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-464172.html
到了這里,關(guān)于自動(dòng)化測(cè)試 selenium的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!