框架搭建

基於maven+jdk8+junit5+seleium 構建

 <dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.6.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-java-commons</artifactId>
<version>2.13.5</version>
<scope>compile</scope>
</dependency>
</dependencies>

驅動下載

下載地址 :http://chromedriver.storage.googleapis.com/index.html

基於當前 瀏覽器的版本

測試demo

@Test
public void test1() throws IOException {
ChromeDriver driver = new ChromeDriver();
System. setProperty("webdriver.chrome.driver", "path");
//設定全屏
driver.manage().window().maximize();
driver.get("https://home.testing-studio.com/");
//d.findElement(By.cssSelector(". d-button-abl").cick();
driver.findElement(By.xpath("//span[contains(text(),'登入')]")).click();
snapshot((TakesScreenshot)driver, "截圖"+FakerUtils.getTimeStamp()+".jpg");
}

截圖方法:TakesScreenshot介面是依賴於具體的瀏覽器API操作的

// 截圖方法
public static void snapshot(TakesScreenshot drivername, String filename) {
String currentPath = System.getProperty("user.dir"); //get current work folder
System.out.println(currentPath);
File scrFile = drivername.getScreenshotAs(OutputType.FILE);
try {
System.out.println("save snapshot path is:"+currentPath+"/"+filename);
FileUtils.copyFile(scrFile, new File(currentPath+"\\"+filename));
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Can't save screenshot");
e.printStackTrace();
} finally {
System.out.println("screen shot finished");
}
}

執行

用列錄製

使用seleniumIDE 錄製

  1. 新建一個錄製project

輸入網站開始錄製,並在錄製的網頁上執行搜尋

錄製結果

當Test越來越多時,可以將多個Test歸類到Suites中,Suites就像小櫃子

建立專案時,IDE會建立一個預設Suite,並將第一個Test新增到其中,你可以點選Test,在下拉選單中選中Test suites進入Suites管理介面

首先進入Suites管理介面,點選`+`,提供名稱,然後單擊add:

將滑鼠懸停在`suite1`上,點選三個點彈出Suites管理選單:

可以對`suite1`進行管理,包括新增test,重新命名,刪除,設定,匯出

匯出的用例

用例的編寫

public class testCase {
public static WebDriver driver;
@BeforeAll
static void initData(){
//載入驅動
driver=new ChromeDriver();
// 設定全域性隱式等待 5S
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
} @Test
void Login(){
//讀取測試連結
driver.get("https://home.testing-studio.com/");
//獲取登入按鈕
driver.findElement(By.xpath("//span[contains(text(),'登入')]")).click();
driver.manage().window().maximize();
//清理記住的原賬號與密碼
driver.findElement(By.id("login-account-name")).clear();
driver.findElement(By.id("login-account-name")).sendKeys("*"); driver.findElement(By.id("login-account-password")).clear();
driver.findElement(By.id("login-account-password")).sendKeys("*");
driver.findElement(By.id("login-button")).click();
// 截圖
FakerUtils.snapshot((TakesScreenshot)driver,"截圖"+FakerUtils.getTimeStamp()+".jpg");
} @AfterAll
static void tearDown(){
driver.quit();
} }
定位方法

執行分析:

Driver的初始化,每個測試用例執行都可以通過這個一個方法獲得一個driver.get()開啟一個網址

find_element(By.定位符,")

一個頁面還沒有完全載入完全,點選這個元素,發現這個元素是有問題的,元素找不到或者不可點選,等等,可以強行加sleep(不推薦)

每個元素定位的時候,都會去find_element查詢一個元素,在這個時候,通常我們需要引入一個新的機制,這個機制叫做隱式等待,解決元素找不到的問題,在規定的時間內,自動的去等待元素的出現,元素找到了,但是狀態不對,不可點選也會報錯

等待方式

隱式等待:

設定一個等待時間輪詢(預設0.5s)查詢 元素是否出現 (服務端)

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

顯式等待:

在客戶端本地每隔0.5s巡查下條件是否匹配 需要 例項化 webdriverwait

在程式碼中定義等待條件,當條件發生時才繼續執行程式碼`WebDriverWait`配合until()方法,根據判斷條件進行等待

程式每隔一段時間(預設為0.5秒)進行條件判斷,如果條件成立,則執行下一步,否則繼續等待,直到超過設定的最長時間

webDriverWait= new WebDriverWait(driver,100L);

強制等待

執行緒等待,執行緒休眠一段時間,Thread.sleep(2000)