目錄
一. 什么是自動化測試
二. selenium
1. selenium的工作原理?
2. selenium+Java的環(huán)境搭建(Chrome瀏覽器)
?三. selenium中常用的API
1. 定位元素 findElement
1.1 css選擇語法?
1.2 xpath
2. 操作測試對象
2.1? sendKeys-在對象上模擬按鍵輸入
2.2 click-點(diǎn)擊對象
2.3 clear-清除對象輸入的文本內(nèi)容
2.4 submit-提交?
2.5 getText()-獲取元素的文本信息
2.6 getAttribute("對應(yīng)屬性")-獲取元素的屬性信息?
2.7 場景分析
2.8 sleep-強(qiáng)制等待
2.9 智能等待中的隱式等待
2.10 智能等待中的顯式等待?
2.11 顯式等待和隱式等待的區(qū)別?
2.12 獲取頁面的 URL 和 title?
3. 瀏覽器的操作
3.1 瀏覽器前進(jìn)后退和刷新
3.2 瀏覽器滾動條的操作?
3.3 窗口的最大化,滿屏,和設(shè)置像素大小
3.4 代碼演示:?
4. 鍵盤的操作
5. 鼠標(biāo)操作
6. 對多選框和單選框進(jìn)行區(qū)分選擇?
7. 多層框架定位
8. 下拉框處理
9. 針對 alter 彈窗的一個操作
10. 上傳文件
11. 關(guān)閉瀏覽器
12. 切換窗口操作?
13. 截圖操作
一. 什么是自動化測試
自動化測試通俗一些來講,就是相當(dāng)于將人工測試手段進(jìn)行轉(zhuǎn)換,讓代碼去自動執(zhí)行。
自動化測試主要分為:單元測試,接口測試,UI測試;
本篇文章先對于UI自動化測試中的 web 測試的 selenium 測試框架進(jìn)行講解;?
UI自動化測試是可以大大提高測試效率的,例如版本的更新,是需要進(jìn)行大量的回歸測試的,隨著版本的更新,功能會越來越多,而每一次版本更新都進(jìn)行手動測試,顯然不太現(xiàn)實(shí),效率也很低下,此時就可以使用自動化來進(jìn)行回歸測試,可以來代替大部分的手動測試,減少重復(fù)測試的時間。?
二. selenium
selenium是用來做web自動化測試框架;適用于多種語言,多種瀏覽器和多種平臺,有著豐富的API;?
1. selenium的工作原理?
編寫自動化腳本代碼,發(fā)送請求給 webdrive瀏覽器驅(qū)動,由 webdrive瀏覽器驅(qū)動進(jìn)行解析后,發(fā)送給瀏覽器進(jìn)行執(zhí)行,再將結(jié)果依次返回。
2. selenium+Java的環(huán)境搭建(Chrome瀏覽器)
1. 先確定Chrome當(dāng)前的版本,然后下載對應(yīng)版本的Chrome瀏覽器驅(qū)動:https://chromedriver.chromium.org/downloads
?2. 解壓下載好的驅(qū)動壓縮包,將下載好的Chromedriver.exe放大Java系統(tǒng)環(huán)境變量下 ,也就是jdk所在環(huán)境下。
?
?3. 驗證環(huán)境是否搭建成功,需要在Java項目中引入selenium依賴,進(jìn)入??Maven Repository: Search/Browse/Explore (mvnrepository.com)?查找 selenium 對應(yīng)的依賴,然后添加到 pom 文件中。
4. 執(zhí)行代碼,如果打開了瀏覽器,則說明環(huán)境搭建成功,此時就是借助驅(qū)動程序來打開瀏覽器,并執(zhí)行。
public class Test {
public static void main(String[] args) {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com");
}
}
如果pom.xml中引入的是selenium3版本或以上的話,可以直接寫
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");?
?三. selenium中常用的API
1. 定位元素 findElement
( findElement() 只返回一個WebElement,而 findElements() 返回類型為 List<WebElement> )?
?主要有兩種方式,一種是 css選擇語法 ,另一種是 xpath ;
?返回類型都為? WebElement
?1.? WebElement element = webDriver.findElement(By.cssSelector("css選擇器"));
?2.? WebElement element = webDriver.findElement(By.xpath("xpath路徑"));
1.1 css選擇語法?
1. id選擇器:#id
2. 類選擇器:.class
3. 標(biāo)簽選擇:標(biāo)簽名
4. 后代選擇器:父級選擇器 子級選擇器?
1.2 xpath
1. 絕對路徑:例如:/html/head/title 但這種方法一般不用 ;
2. 相對路徑 :
相對路徑? + 索引 ://form/span[1]/input
相對路徑 + 屬性值 ://input [@class=""]
相對路徑 + 通配符://*[@*=""]
相對路徑 + 文本匹配://a[text()=""]
絕對路徑下: (如果是該路徑下同一個標(biāo)簽有多個,可以用[n]進(jìn)行選擇,默認(rèn)從1開始;后同)
?相對路徑1:
?相對路徑2:
?相對路徑3:
?相對路徑4:
?在定位元素的時候,也通??梢灾苯訌暮笈_管理中去復(fù)制:
從整體來看,css選擇器定位元素效率是要比xpath更高的,所以一般也更推薦css選擇器法;因為css選擇器是瀏覽器原生支持的,而Xpath需要引入額外的解析器來解析xpath表達(dá)式。
2. 操作測試對象
?2.1? sendKeys-在對象上模擬按鍵輸入
webElement.sendKeys(" ");?
?2.2 click-點(diǎn)擊對象
?webElement.click();
2.3 clear-清除對象輸入的文本內(nèi)容
?webElement.clear();
2.4 submit-提交?
?webElement.submit();
如果點(diǎn)擊的元素在form標(biāo)簽中,此時submit實(shí)現(xiàn)的效果是和click一樣的,如果點(diǎn)擊的元素放? 在非form標(biāo)簽中,此時使用submit會報錯,所以一般還是使用 click 更好一些。
2.5 getText()-獲取元素的文本信息
webElement.getText();?
2.6 getAttribute("對應(yīng)屬性")-獲取元素的屬性信息?
webElement.getAttribute();
getText 只能獲取到標(biāo)簽之間的對應(yīng)值 eg: <a> 111 </a>,而不能獲取屬性值 eg: <a value = "111"> </a>,所以就有了 getAttribute("對應(yīng)的屬性")獲取屬性值;
2.7 場景分析
在進(jìn)行登錄自動化測試的時候,驗證碼無法獲取到,要怎么去測試?
答:可以在自動化測試賬號加一個白名單,設(shè)定一個賬號,當(dāng)使用這個賬號登錄的時候,此時就不需要要驗證碼處理;?
2.8 sleep-強(qiáng)制等待
sleep(ms);?
2.9 智能等待中的隱式等待
隱式等待 等待的是所有的元素生成,如果超過設(shè)定的時間,還沒生成就會報錯,一旦生成獲取到頁面上的元素,就會繼續(xù)往下執(zhí)行。
webDrive.manage().timeouts().implicitlyWait( 單位長度?,? TimeUnit類型(包含秒,分鐘,小時...) );?
例如如下語句表示隱式等待 3小時
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.HOURS);
2.10 智能等待中的顯式等待?
顯式等待 等待的是對應(yīng)的條件,條件滿足了則繼續(xù)往下執(zhí)行,等待時間到了還沒滿足條件那么就會報錯。
WebDriverWait wait = new WebDriverWait(WebDriver driver, long timeOutInSeconds);
wait.until(Function<? super T, V> isTrue);
eg:如下代碼表示的是:在顯式等待三秒中 ,如果滿足頁面中的 title 是"百度一下,你就知道",那么就繼續(xù)往下執(zhí)行,如果顯式等待三秒后,條件依舊不滿足,則報錯。
WebDriverWait wait = new WebDriverWait(webDriver,3); wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
2.11 顯式等待和隱式等待的區(qū)別?
因此我們也可以得知,智能等待中顯式等待和隱式等待的區(qū)別:
隱式等待等待的是所有的元素;
顯式等待等待的是一定的條件,這個條件也是由程序員自定義的;
2.12 獲取頁面的 URL 和 title?
webDrive.getCurrentUrl() 和 webDrive.getTitle() ;
3. 瀏覽器的操作
?3.1 瀏覽器前進(jìn)后退和刷新
webDriver.navigate().back();? ? ? ? ? // 瀏覽器后退
webDriver.navigate().refresh();? ? ? ? ? // 瀏覽器刷新
webDriveer.navigate().forward();? ? ? ? ? ? // 瀏覽器前進(jìn)
3.2 瀏覽器滾動條的操作?
瀏覽器滾動條的操作需要借助轉(zhuǎn)換 JS 來執(zhí)行;
((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=高度");?
3.3 窗口的最大化,滿屏,和設(shè)置像素大小
webDriver.manage().window().maximize();? ? ? ? // 窗口最大化
webDriver.manage().window().fullscreen();? ? ? ? // 窗口滿屏
weebDriver.manage().window().setSize(new Dimension(width,height));? ? ? ? // 設(shè)置像素大小
3.4 代碼演示:?
private static void test07() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
// 瀏覽器后退
webDriver.navigate().back(); // navigate 表示導(dǎo)航
sleep(3000);
// 刷新
webDriver.navigate().refresh();
sleep(3000);
// 瀏覽器前進(jìn)
webDriver.navigate().forward();
sleep(3000);
// 瀏覽器的滾動條,需要借助轉(zhuǎn)換 JS 來執(zhí)行
((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
// 窗口最大化
webDriver.manage().window().maximize();
sleep(2000);
// 窗口滿屏
webDriver.manage().window().fullscreen();
sleep(3000);
// 設(shè)置像素點(diǎn)
webDriver.manage().window().setSize(new Dimension(1000,1000));
}
4. 鍵盤的操作
在sendKeys的基礎(chǔ)上操作:
例如要輸入ctrl+A:sendKeys(Keys.CONTROL,"A");
代碼演示:
private static void test08() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
// 鍵盤操作 Keys.
// ctrl + A
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
sleep(1000);
// ctrl + X
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
sleep(1000);
// ctrl + V
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
sleep(1000);
}
5. 鼠標(biāo)操作
通過 Actions 對象來操作:Actions actions = new Actions(webDriver);
鼠標(biāo)右擊:contextClick();
鼠標(biāo)雙擊:doubleClick();?
鼠標(biāo)移動:moveToElement(webElement);
執(zhí)行行為:perform();
場景設(shè)計:在百度這個頁面中,搜索 "520" ,點(diǎn)擊百度進(jìn)行搜索,然后對頁面中的 圖片超鏈接?進(jìn)行右擊;? 注意最后要進(jìn)行? perform() 進(jìn)行執(zhí)行?。?!
private static void test09() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
// 找到圖片這個按鈕
WebElement webElement = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-pic"));
// 鼠標(biāo)右擊
Actions actions = new Actions(webDriver);
// 先移動到對應(yīng)的元素,然后右擊,最后執(zhí)行,注意要加上perform執(zhí)行
sleep(3000);
actions.moveToElement(webElement).contextClick().perform();
}
6. 對多選框和單選框進(jìn)行區(qū)分選擇?
在如下頁面中,實(shí)現(xiàn)對多選框( type = checkbox )進(jìn)行選擇,單選框( type = radio )不選擇。?
代碼實(shí)現(xiàn):?
private static void page01() {
WebDriver webDriver = new ChromeDriver();
webDriver.get(""); // 對應(yīng)頁面
// 由于有些頁面找的元素有些多,害怕有些元素渲染不出來,可以進(jìn)行一個隱式等待(智能)
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
for (int i = 0; i < webElements.size(); i++) {
// 如果元素type值等于checkbox進(jìn)行點(diǎn)擊
// getAttribute 來獲取頁面上元素的屬性值,里面的 type 是當(dāng)前元素屬性,返回值就為對應(yīng)的屬性值
if (webElements.get(i).getAttribute("type").equals("checkbox")){
webElements.get(i).click();
}else {
// 否則什么也不操作
;
}
}
}
?7. 多層框架定位
對于在 <iframe> 標(biāo)簽下的標(biāo)簽,不可直接通過 findElement 來進(jìn)行查找并click。?
而應(yīng)該先通過對應(yīng)的 id 或者 name 或者iframe自帶的其他屬性來定位到對應(yīng)的框架下,此處可以使用 webDriver.switchTo().frame("id屬性值");來定位
例如如下頁面中,想要對 頁面中的 click元素 進(jìn)行一個點(diǎn)擊,通過后臺可以看到 click元素 屬于<iframe id="f1">,所以此時就應(yīng)該先定位到對應(yīng)的框架下,再去 click 。
?代碼實(shí)現(xiàn):
private static void page02() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("");
webDriver.switchTo().frame("f1"); // 參數(shù)可以為 要選擇的標(biāo)簽 位于的那個<iframe>標(biāo)簽下的 id 屬性值(string)
webDriver.findElement(By.cssSelector("body > div > div > a")).click();
}
?8. 下拉框處理
對如下頁面中的下拉框進(jìn)行選擇,此時需要進(jìn)行兩次定位,先定位到下拉框,對下拉框進(jìn)行操作,再定位到下拉框中要選擇的選項。
首先需要定位到下拉框,然后使用 Select select = new Select(webElement) 對其進(jìn)行選定,再進(jìn)行選項的選定。
代碼實(shí)現(xiàn):?
private static void page03() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("");
WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
Select select = new Select(webElement);
select.selectByIndex(1); // 下標(biāo)從0開始算
sleep(3000);
select.selectByValue("10.69"); // value屬性對應(yīng)的值
}
?9. 針對 alter 彈窗的一個操作
如下頁面中,要實(shí)現(xiàn)點(diǎn)擊 "這是一個彈窗" 后會出現(xiàn)一個彈窗。
實(shí)現(xiàn)彈窗取消:webDriver.switchTo().alter().dismiss();
再點(diǎn)擊彈窗,進(jìn)行輸入。
最后進(jìn)行彈窗確認(rèn):webDriver.switchTo().alter().accept();?
?代碼實(shí)現(xiàn):
private static void page04() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("");
webDriver.findElement(By.cssSelector("button")).click();
sleep(3000);
// alter彈窗取消
webDriver.switchTo().alert().dismiss();
sleep(3000);
// 點(diǎn)擊按鈕
webDriver.findElement(By.cssSelector("button")).click();
// 在 alter 彈窗輸入 xxx
webDriver.switchTo().alert().sendKeys("11");
// alter彈窗確認(rèn)
sleep(3000);
webDriver.switchTo().alert().accept();
}
?10. 上傳文件
?上傳文件的操作較簡單,例如下圖中實(shí)現(xiàn)文件的選擇,只需要對 " 選擇文件 "進(jìn)行定位,然后 sendKeys("要選擇文件的路徑");
?代碼實(shí)現(xiàn):
private static void page05() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("");
webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\桌面\\image");
}
11. 關(guān)閉瀏覽器
?關(guān)閉瀏覽器,主要有兩種方式:
1. webDriver.close(); 這種方式只會關(guān)閉一個頁面,關(guān)閉原始的那個頁面,而不會關(guān)閉新的頁面,也不會清空緩存;
2. webDriver.quit();這種方式會把整個瀏覽器都關(guān)閉,會清空緩存(cookie);
12. 切換窗口操作?
當(dāng)獲取到新的頁面后,對于新的頁面,無法直接 findElement() 進(jìn)行定位元素了,因為此時的? findElement() 還是針對第一次 GET 獲取到的頁面 (首頁) 而言的。
所以此時需要對窗口進(jìn)行定位:通過 webDriver.getWindowHandles() 獲取到當(dāng)前所有的窗口句柄,此時的返回類型為 Set<String> ,里面存放著當(dāng)前每一個頁面的窗口句柄。對這個返回類型進(jìn)行遍歷,所得到的 set 的最后一個元素就是最后一個生成頁面的窗口句柄。因此就可以使用 webDriver.switchTo().window(String 對應(yīng)頁面的窗口句柄); 將自動化找元素的操作頁面轉(zhuǎn)換為新的頁面了,再進(jìn)行 findElement() 等操作即可;
代碼實(shí)現(xiàn):?
private static void test11() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
sleep(3000);
// 直接這樣操作是不可行的?。?!
// webDriver.findElement(By.cssSelector("#ww")).sendKeys("新聞聯(lián)播");
// webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
// 通過 getWindowHandles 獲取所有的窗口句柄
// 通過 getWindowHandle 獲取的 get 打開的頁面窗口句柄
System.out.println(webDriver.getWindowHandle());
Set<String> handles = webDriver.getWindowHandles();
String target_handle = "";
for (String handle:handles ) {
target_handle = handle;
}
// 這樣遍歷到最后 ,對應(yīng)的 handle 就為對應(yīng)的頁面,也就是最后一個生成的頁面
webDriver.switchTo().window(target_handle); // 此處的操作就相當(dāng)于把 自動化找元素的操作的頁面轉(zhuǎn)換為新的頁面了(target_handle)
sleep(3000);
// 此時就可以對新生成的頁面進(jìn)行定位操作了
webDriver.findElement(By.cssSelector("#ww")).sendKeys("新聞聯(lián)播");
webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
}
?13. 截圖操作
截圖操作,需要引入依賴。
可以使用 ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);以文件的形式返回,然后將文件放置對應(yīng)的路徑即可。文章來源:http://www.zghlxwxcb.cn/news/detail-640572.html
<!-- 截圖-->
<!-- ht tps://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
?代碼實(shí)現(xiàn):文章來源地址http://www.zghlxwxcb.cn/news/detail-640572.html
private static void test12() throws InterruptedException, IOException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("軟件測試");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
// 將文件放到某個位置
FileUtils.copyFile(file,new File("D://test_jietu.png")); // 將file文件放到第二個參數(shù)對應(yīng)的位置
}
到了這里,關(guān)于【測試開發(fā)】自動化測試 selenium 篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!