selenium-java web自動化測試工具

本篇文章由來,這兩天整理了下本身常常使用並且很熟練的項目,今天忽然想起漏了一個,補上了,但想到還沒對應的博客,那就寫一個簡單的css

我常常使用且相對熟練的部分技術以下(不知道算不算各位大神眼中的辣雞):html

傳統的web項目測試,大多數都依靠測試部門小夥伴人工操做,費時費力還容易側漏`(*∩_∩*)′  錯了 是漏測,java

而selenium則爲項目的測試提供了很大的便利,但並非全部項目都適合,git

哪些適合呢:公司本身的產品,且須要常常回歸測試,好比相似OA這類業務系統產品github

不適合的呢:好比外包業務,快速交付後就無論的,只須要測試一兩次web

 

案例一:一個簡單示例(無彈出框這類單一頁面),先看看執行效果(點擊圖片查看高清版本):chrome

效果還滿意麼?滿意請繼續往下看,不滿意請關閉窗口 謝謝api

1.新建maven項目,引入selenium-java瀏覽器

<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.8.1</version>
        </dependency>

2.寫代碼(由於自動化測試速度極快,每一個步驟後我都稍微停頓了下,註釋也很清晰明瞭)併發

 1 package com.xiao.selenium;
 2 
 3 import java.util.List;
 4 import java.util.Random;
 5 import java.util.concurrent.TimeUnit;
 6 
 7 import org.openqa.selenium.By;
 8 import org.openqa.selenium.JavascriptExecutor;
 9 import org.openqa.selenium.WebDriver;
10 import org.openqa.selenium.WebElement;
11 import org.openqa.selenium.firefox.FirefoxDriver;
12 
13 public class AutoTest {
14     public static void main(String[] args) throws InterruptedException {
15         Thread.sleep(3000);
16         //System.setProperty("webdriver.chrome.driver", "c://chromedriver.exe");
17         //WebDriver webDriver = new ChromeDriver();
18         System.setProperty("webdriver.gecko.driver", "c://geckodriver.exe");
19         WebDriver webDriver = new FirefoxDriver();
20         webDriver.manage().window().maximize();
21         webDriver.manage().deleteAllCookies();
22         // 與瀏覽器同步很是重要,必須等待瀏覽器加載完畢
23         webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
24         
25         //打開目標地址
26         webDriver.get("http://192.168.0.32:88");
27         //輸入帳號 密碼並登錄系統
28         Thread.sleep(1000);
29         webDriver.findElement(By.xpath("/html/body/div/div/form/div[1]/div/div/input")).sendKeys("admin");
30         webDriver.findElement(By.xpath("/html/body/div/div/form/div[2]/div/div/input")).sendKeys("123456");
31         webDriver.findElement(By.cssSelector("html body div#app div.loginPage form.el-form.fromBox button.el-button.loginBtn.el-button--primary")).click();
32         
33         //選擇系統
34         Thread.sleep(1000);
35         webDriver.findElement(By.xpath("/html/body/div/div/div/div[1]/p")).click();
36         
37         //展開基礎信息管理菜單
38         Thread.sleep(1000);
39         webDriver.findElement(By.xpath("/html/body/div/div/div/div[1]/div[3]/ul/div[1]/li/div/span")).click();
40         //點擊科室管理菜單
41         Thread.sleep(1000);
42         webDriver.findElement(By.cssSelector(".is-opened > ul:nth-child(2) > li:nth-child(1)")).click();
43         
44         //跳轉到第2頁
45         Thread.sleep(1000);
46         webDriver.findElement(By.xpath("/html/body/div/div/div/div[2]/div[2]/div/div[2]/div[2]/div/div[2]/ul/li[2]")).click();
47         
48         //點擊新增按鈕
49         webDriver.findElement(By.xpath("/html/body/div/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[1]/div[1]/button")).click();
50         
51         //根據規則隨機生成文本框內容
52         int random = new Random().nextInt(200000000);
53         Thread.sleep(1000);
54         webDriver.findElement(By.xpath("/html/body/div[1]/div/div/div[2]/div[2]/div/div[3]/div/div[2]/form/div[1]/div[1]/div/div/input")).sendKeys(String.valueOf(random));
55         Thread.sleep(1000);
56         webDriver.findElement(By.xpath("/html/body/div[1]/div/div/div[2]/div[2]/div/div[3]/div/div[2]/form/div[1]/div[2]/div/div[1]/input")).sendKeys("自動化測試-"+random);
57         
58         //展開下拉框
59         webDriver.findElement(By.xpath("/html/body/div[1]/div/div/div[2]/div[2]/div/div[3]/div/div[2]/form/div[2]/div[1]/div/div/div[1]/span/span/i")).click();
60         Thread.sleep(1000);
61         //獲取下拉框size
62         List<WebElement> select1 = webDriver.findElements(By.cssSelector("div.el-select-dropdown:nth-child(4) > div:nth-child(1) > div:nth-child(1) > ul li"));
63         //隨機選擇一個項目
64         int selectItem1 = new Random().nextInt(select1.size())+1;
65         webDriver.findElement(By.xpath("/html/body/div[3]/div[1]/div[1]/ul/li["+selectItem1+"]")).click();
66         
67         //稍做停頓,而後保存
68         Thread.sleep(1000);
69         webDriver.findElement(By.xpath("/html/body/div[1]/div/div/div[2]/div[2]/div/div[3]/div/div[3]/div/button[1]")).click();
70         
71         //跳轉到個人博客
72         Thread.sleep(3000);
73         webDriver.get("https://www.cnblogs.com/xiaochangwei");
74         
75         webDriver.findElements(By.className("postTitle")).forEach(x -> {
76             System.out.println(x.getText());
77         });
78         
79         Thread.sleep(1000);
80         //打開標題爲 經過Dockerfile構建鏡像併發布web項目 的文章
81         webDriver.findElement(By.partialLinkText("經過Dockerfile構建鏡像併發布web項目")).click();
82         
83         Thread.sleep(1000);
84         //移動到底部
85         //((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0, document.body.scrollHeight)");
86         //移動到指定的座標(相對當前的座標移動)  
87         ((JavascriptExecutor) webDriver).executeScript("window.scrollBy(0, 700)");  
88         Thread.sleep(1000);
89         //移動到窗口絕對位置座標,以下移動到縱座標1600像素位置  
90         ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0, 1600)");  
91         Thread.sleep(1000);
92         //移動到指定元素,且元素底部和窗口底部對齊 參考 https://www.cnblogs.com/testway/p/6693140.html
93         ((JavascriptExecutor) webDriver).executeScript("arguments[0].scrollIntoView(false);", webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div/div[1]/div/div/div[2]/div[4]/div[3]/div[1]/a[5]/img")));
94         //暫停五秒鐘後關閉
95         Thread.sleep(2000);
96         webDriver.quit();
97     }
98 }

  其中: 

    16行谷歌瀏覽器的驅動下載地址:https://chromedriver.storage.googleapis.com/index.html

    18行火狐瀏覽器的驅動下載地址:https://github.com/mozilla/geckodriver/releases

  而後運行,你就能夠隨心所欲了

 

 案列二:有彈出框及使用了Frame的頁面,以百度盤登陸爲例

    

  代碼以下: 

package com.xiao.selenium;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

/**
 * @Title: com.xiao.selenium.BaiduPanLogin.java
 * @Description:
 * @author changw.xiao@qq.com
 * @date 2018年2月5日 上午9:16:44
 * @version V1.0
 */
public class BaiduLogin {

	public static void main(String[] args) throws InterruptedException {
		Thread.sleep(3000);
		System.setProperty("webdriver.gecko.driver", "c://geckodriver.exe");
		WebDriver driver = new FirefoxDriver();
//		driver.manage().window().maximize();
		driver.manage().window().setPosition(new Point(100, 50));
		driver.manage().deleteAllCookies();
		// 與瀏覽器同步很是重要,必須等待瀏覽器加載完畢
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

		driver.get("https://pan.baidu.com/");

		Thread.sleep(1000);

		WebElement qqLoginLink = driver
				.findElement(By.xpath("/html/body/div[1]/div[3]/div[6]/div/div[4]/div[2]/div/ul/li[2]/a"));
		qqLoginLink.click();
		Thread.sleep(1000);

		// 獲取當前頁面句柄
		String handle = driver.getWindowHandle();
		// 獲取全部頁面的句柄,並循環判斷不是當前的句柄 而後切換到子窗體
		for (String handles : driver.getWindowHandles()) {
			if (handles.equals(handle))
				continue;
			driver.switchTo().window(handles);
		}

		// 因爲登陸輸入框在frame中,還須要先切換進入frame,不然,也找不到輸入框的
		driver.switchTo().frame(driver.findElement(By.xpath("//*[@id='ptlogin_iframe']")));

		// 調試過程當中,若是提示找不到元素,不知道是否切換成功了,能夠把當前handler的source打印出來看看
		// System.out.println(driver.getPageSource());

		driver.findElement(By.xpath("//*[@id='switcher_plogin']")).click();
		driver.findElement(By.xpath("//*[@id='u']")).sendKeys("317409898");
		driver.findElement(By.xpath("//*[@id='p']")).sendKeys("xxxxxxxxx");
		driver.findElement(By.xpath("//*[@id='login_button']")).click();
		
		//因爲個人帳號沒綁定手機,點登陸後會有個提示,若是直接關閉,可能被判斷爲還沒完成登陸,沒有會話,因此稍等片刻
		Thread.sleep(2000);
		
		//關閉彈出的子窗體
		driver.close();
		
		//driver.navigate() 下有不少方法,好比後退,刷新等
		Thread.sleep(2000);
	}

}

    注意:1.我這裏只開了兩個窗口,若是是多個,並且須要在窗口間切換操做的,注意在一個窗口中完成操做後,確認是否切回到須要操做的窗口

       2.頁面內部有frame的,除了切換到具體頁面外,還要切換到對應的frame中才行

       3.關閉窗口時,也要確認操做的對象

相關文章
相關標籤/搜索