這是爲http://git.oschina.net/penngo/JApiTest工具寫的selenium測試腳本,目前只寫了主要功能的自動化測試。由於JApiTest前端使用了ligerUI開發,selenium操作頁面元素會相對麻煩,而對於部分有延遲處理的,需要使用WebDriverWait來等待節點元素的出現。
package com.penngo.test;
import java.io.File;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
public class TestUnit {
WebDriver driver;
@Before
public void setUp() throws Exception {
driver = new ChromeDriver();
}
/**
* 測試添加項目、添加用例、用例測試、刪除用例、刪除項目
* @throws Exception
*/
@Test
public void nodeTest() throws Exception {
driver.get("http://localhost:8000");
this.addProject();
clickLastProject();
clickLastCase();
this.addCase();
this.runCase();
this.deleteProjectCase();
}
@After
public void tearDown() throws Exception {
driver.quit();
}
public void screenshot(String fileName){
try{
File screenFile = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenFile, new File("screen/" + fileName));
}
catch(Exception e){
e.printStackTrace();
}
}
/**
*
* @param b
*/
private void clickLastProject(){
this.screenshot(System.currentTimeMillis() + "_clickLastProject.jpg");
WebElement allProject = driver.findElement(By.cssSelector("#tree1 li[outlinelevel='1'].l-last"));
List<WebElement> openNodes = allProject.findElements(By.cssSelector(".l-body .l-box"));
Assert.assertEquals(openNodes.size(), 2);
openNodes.get(0).click();
this.screenshot(System.currentTimeMillis() + "_clickLastProject.jpg");
}
private void clickLastCase(){
this.screenshot(System.currentTimeMillis() + "_clickLastCase.jpg");
WebDriverWait wait = new WebDriverWait(driver,10);
WebElement openNode = wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
WebElement lastProject = driver.findElement(By.cssSelector("#tree1 li[outlinelevel='2'].l-last"));
List<WebElement> openNodes = lastProject.findElements(By.cssSelector(".l-body .l-box"));
return openNodes.get(1);
}});
openNode.click();
this.screenshot(System.currentTimeMillis() + "_clickLastCase.jpg");
}
/**
* 根據文本內容點擊菜單
* @param btnText
*/
private void clickMenuByText(String btnText){
this.screenshot(System.currentTimeMillis() + "_clickMenuByText.jpg");
List<WebElement> menuItems = driver.findElements(By.cssSelector(".l-menu .l-menu-item"));
for(WebElement menu:menuItems){
if(menu.getText().equals(btnText)){
menu.click();
}
}
this.screenshot(System.currentTimeMillis() + "_clickMenuByText.jpg");
}
//添加項目
private void addProject() throws Exception{
// 彈出右鍵添加項目
WebElement body1_box1 = driver.findElement(By.cssSelector(".l-body .l-box"));
Actions action = new Actions(driver);
action.contextClick(body1_box1).perform();
screenshot(System.currentTimeMillis() + "_addProject.jpg");
WebElement projectMenu = driver.findElement(By.cssSelector("div[ligeruimenutemid='1']")); //.l-menu-item-text
projectMenu.click();
screenshot(System.currentTimeMillis() + "_addProject.jpg");
// 添加項目
List<WebElement> dialogs = driver.findElements(By.cssSelector("div.l-dialog.l-dialog-win"));
for(WebElement dialog:dialogs ){
List<WebElement> directory_names = dialog.findElements(By.cssSelector("#directory_name"));
if(directory_names.size() > 0){
WebElement directory_name = directory_names.get(0);
directory_name.sendKeys("測試項目一");
screenshot(System.currentTimeMillis() + "_addProject.jpg");
List<WebElement> btns = dialog.findElements(By.cssSelector(".l-dialog-btn-inner"));
Assert.assertNotNull(btns);
btns.get(1).click();
WebDriverWait wait = new WebDriverWait(driver,10);
WebElement successDialog = wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.cssSelector("[class='l-dialog']"));
}});
this.screenshot(System.currentTimeMillis() + "_addProject.jpg");
action.sendKeys(Keys.ENTER).perform();
}
}
}
// 添加用例
private void addCase() throws Exception{
WebElement lastProject = driver.findElement(By.cssSelector("#tree1 li[outlinelevel='2'].l-last"));
Actions action = new Actions(driver);
action.contextClick(lastProject).perform();
this.screenshot(System.currentTimeMillis() + "_addCase.jpg");
clickMenuByText("添加用例");
this.screenshot(System.currentTimeMillis() + "_addCase.jpg");
WebDriverWait wait = new WebDriverWait(driver,10);
WebElement case_dir_name = wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.cssSelector("#case_dir_name"));
}});
case_dir_name.sendKeys("接口測試2");
this.clickDialogBtn("確定");
this.screenshot(System.currentTimeMillis() + "_addCase.jpg");
this.clickTipDialogBtn();
this.screenshot(System.currentTimeMillis() + "_addCase.jpg");
}
private void clickDialogBtn(String text){
this.screenshot(System.currentTimeMillis() + "_clickDialogBtn.jpg");
List<WebElement> dialogs = driver.findElements(By.cssSelector(".l-dialog.l-dialog-win"));
for(WebElement dialog:dialogs){
if(dialog.isDisplayed() == true){
List<WebElement> btns = dialog.findElements(By.cssSelector(".l-dialog-btn-inner"));
for(WebElement b:btns){
if(b.getText().equals(text)){
b.click();
}
}
}
}
this.screenshot(System.currentTimeMillis() + "_clickDialogBtn.jpg");
}
private void clickTipDialogBtn(){
this.screenshot(System.currentTimeMillis() + "_clickTipDialogBtn.jpg");
WebDriverWait wait = new WebDriverWait(driver,10);
WebElement successDialog = wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.cssSelector("[class='l-dialog']"));
}});
Actions action = new Actions(driver);
action.sendKeys(Keys.ENTER).perform();
this.screenshot(System.currentTimeMillis() + "_clickTipDialogBtn.jpg");
}
/**
* 刪除用例
*/
private void deleteProjectCase(){
driver.switchTo().parentFrame();
this.screenshot(System.currentTimeMillis() + "_deleteProjectCase.jpg");
//刪除case
WebElement lastCase = driver.findElement(By.cssSelector("#tree1 li[outlinelevel='3'].l-last"));
Actions action = new Actions(driver);
action.contextClick(lastCase).perform();
this.screenshot(System.currentTimeMillis() + "_deleteProjectCase.jpg");
this.clickMenuByText("刪除用例");
clickConfirmDialog("是");
this.screenshot(System.currentTimeMillis() + "_deleteProjectCase.jpg");
//刪除project
WebElement lastProject = driver.findElement(By.cssSelector("#tree1 li[outlinelevel='2'].l-last span"));
action.contextClick(lastProject).perform();
this.clickMenuByText("刪除項目");
clickConfirmDialog("是");
this.screenshot(System.currentTimeMillis() + "_deleteProjectCase.jpg");
}
private void runCase(){
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
WebElement lastCase = driver.findElement(By.cssSelector("#tree1 .l-children li[outlinelevel='3'].l-last"));
lastCase.click();
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
final WebDriver frame = driver.switchTo().frame(0);
WebElement urlElement = frame.findElement(By.cssSelector("#url"));
urlElement.clear();
urlElement.sendKeys("http://localhost:8000/api/testLogin");
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
Select methodSelect = new Select(frame.findElement(By.id("method")));
methodSelect.selectByIndex(0);
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
Select typeSelect = new Select(frame.findElement(By.id("type")));
typeSelect.selectByIndex(0);
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
Select codeSelect = new Select(frame.findElement(By.id("code")));
codeSelect.selectByIndex(0);
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
Select timeOutSelect = new Select(frame.findElement(By.id("timeOut")));
timeOutSelect.selectByIndex(0);
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
WebElement requestElement = frame.findElement(By.id("request"));
requestElement.clear();
requestElement.sendKeys("{\"name\":\"penngo\",\"psw\":\"test123456\"}");
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
WebElement btnExcElement = frame.findElement(By.id("btnExc"));
btnExcElement.click();
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
WebElement e = frame.findElement(By.cssSelector("#stateResult"));
String css = e.getAttribute("class");
if(css.equals("stateResult_error") || css.equals("stateResult_success")){
return e;
}
else{
return null;
}
}}
);
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
WebElement navtab2 = frame.findElement(By.id("navtab2"));
WebElement resTabItem1 =navtab2.findElement(By.linkText("響應內容解析"));
resTabItem1.click();
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
WebDriverWait wait2 = new WebDriverWait(driver,10);
WebElement tr0 = wait2.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
List<WebElement> response_maingrid_trs = frame.findElements(By.cssSelector("#response_maingrid table.l-grid-body-table tbody tr"));
if(response_maingrid_trs.get(0).isDisplayed()){
return response_maingrid_trs.get(0);
}
else{
return null;
}
}}
);
tr0.click();
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
WebElement addAssert = frame.findElement(By.cssSelector("#response_maingrid .l-toolbar-item"));
addAssert.click();
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
WebElement resTabItem2 =navtab2.findElement(By.linkText("響應內容判斷"));
resTabItem2.click();
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
btnExcElement.click();
WebDriverWait wait3 = new WebDriverWait(frame,10);
wait3.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
WebElement e = frame.findElement(By.cssSelector("#stateResult"));
String css = e.getAttribute("class");
if(css.equals("stateResult_error") || css.equals("stateResult_success")){
return e;
}
else{
return null;
}
}}
);
this.screenshot(System.currentTimeMillis() + "_runCase.jpg");
}
private void clickConfirmDialog(String text){
this.screenshot(System.currentTimeMillis() + "_clickConfirmDialog.jpg");
WebDriverWait wait = new WebDriverWait(driver,10);
WebElement dialog = wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return driver.findElement(By.cssSelector("div[class='l-dialog']"));
}}
);
List<WebElement> btns = dialog.findElements(By.cssSelector(".l-dialog-btn-inner"));
for(WebElement b:btns){
if(b.getText().equals(text)){
b.click();
}
}
this.screenshot(System.currentTimeMillis() + "_clickConfirmDialog.jpg");
}
}