1. 程式人生 > >web自動化測試從入門到持續集成(selenium webdriver)

web自動化測試從入門到持續集成(selenium webdriver)

spa 我們 右鍵 退出 頁面 exce pom.xml文件 -c err

  在很多剛學習自動化的可能會認為我只需要會運用selenium,我只需要在一個編輯器中實用selenium +java編寫了一些腳本那麽就會自動化了,是真的嗎?答案肯定是假的。自動化肯定是需要做到真的完全自動化,那如何實現呢?接著往下看。
首先我們需要準備的環境:
1、jdk環境配置好
2、maven環境配置
3、jenkins環境配置(jenkins.war的包)
4、在eclipse中創建一個maven工程(不是java工程,為什麽?因為java工程還需要自己去下載selenium等等包然後引入,但是maven工程只需要在pom文件中將各種包的配置添加進去就行)
5、在maven工程中的pom.xml文件中將selenium、testng包引入,其他的都不要。
環境準備好之後就準備創建包,寫代碼吧。
我這裏拿pageobject做為例子,首先看一下我工程的一個目錄結構:

技術分享

在這個結構中會拿部分來講:
base:主要是放driver的基類,他主要是對webdriver進行了第二次封裝
business、handle、page這三個類主要是pageobject模型中實用的頁面分離,page裏面放的全是頁面元素,handle放的是該頁面元素的操作、business放的是該頁面的操作元素之間的一些業務。
testcase:顧名思義就是放我們case的地方
util:一些工具類的存放地方
下面的testNG.xml就是我們testng的一個配置文件,如果我們需要用testng運行那麽就直接右鍵運行。
pom.xml:是我們maven的文件,我們所有的依賴文件都添加在裏面,當我們使用jenkins來集成時,jenkins裏面配置的就是這個pom文件
首先來看我們的DriverBase的代碼:

public class DriverBase {
public WebDriver driver;
public DriverBase(String browser){
SelectDriver selectDriver =new SelectDriver();
this.driver = selectDriver.driverName(browser);
}
/**
* 獲取driver
* */
public WebDriver getDriver() {
return driver;
}

public void stop(){
System.out.println("stop webdriver");
driver.close();
}

/**
* 封裝Element方法
* */
public WebElement findElement(By by){
WebElement element = driver.findElement(by);
return element;
}

/**
* get封裝
* */

public void get(String url){
driver.get(url);
}

/*
* 返回
* **/
public void back(){
driver.navigate().back();
}

/**
* 點擊
* */
public void click(WebElement element){
element.click();
}
/**
* 獲取當前url
* */
public String getUrl(){
return driver.getCurrentUrl();
}
/**
* 獲取title
* */
public String getTitle(){
return driver.getTitle();
}
/**
* 關閉瀏覽器
* */
public void close(){
driver.close();
}

  

在這個裏面我們對webdriver常用的一些方法進行了一個第二次封裝。
當我們把基礎的封裝了後,我們再次看我們整個框架的結構:
技術分享

在page裏面我們需要再次封裝一個BasePage的類,這個是主要封裝我們頁面一些公用的方法,一些常用的方法我們只需要在這個類裏面寫一次就好,其他的page頁面繼承這個類。
來看我們base類裏面的部分方法:

public class BasePage {
    public DriverBase driver;
    public BasePage(DriverBase driver){
        this.driver = driver;
    }

    
    /**
     * 定位Element
     * @param By by
     * */
    public WebElement element(By by){
        WebElement element = driver.findElement(by);
        return element;
    }
        /**
     * 封裝點擊
     * */
    public void click(WebElement element){
        if(element !=null){
            element.click();
        }else{
            System.out.println("元素沒有定位到,點擊失敗。");
        }
    }
    
    /**
     * 封裝輸入
     * */
    public void sendkeys(WebElement element,String value){
        if(element !=null){
            element.sendKeys(value);
        }else{
            System.out.println(element+"元素沒有定位到,輸入失敗"+value);
        }
    }
}

我們封裝了一些常用的方法,然後我們的page頁面都可以拿過去運用,這樣減少了我們後期寫這些方法的成本,下面來看我們loginpage。
在我們loginpage裏面存放的全是登陸頁面獲取元素的方法,首先看我們我們的登陸頁面:
技術分享
這個是我們的登陸頁面,登陸頁面中我們常用的就用戶名、密碼、記住登陸、登陸按鈕幾個元素,那麽我們只需要把這幾個元素都封裝在我們的loginpage頁面就好,看下面代碼:

public class loginPage extends BasePage{
    public loginPage(DriverBase driver){
        super(driver);
    }
    /**
     * 獲取用戶名輸入框
     * */
    public WebElement getUserElement(){
        return element(getByLocator.getLocator("username"));
    }
    
    /**
     * 獲取密碼輸入框Element
     * */
    public WebElement getPasswordElement(){
        return element(getByLocator.getLocator("userpass"));
    }
    /**
     * 獲取登陸按鈕element
     * */
    public WebElement getLoginButtonElement(){
        return element(getByLocator.getLocator("loginbutton"));
    }
}

在這裏我們看不到任何的元素,我們所有的定位元素都進行了二次封裝,在我們的BasePage裏面有相應的封裝,但是他也會去調用其他的一些定位類。當我們有了所有的元素之後我們是不是就需要再次對這些元素操作呢?接下來看我們的操作類:

public class loginPageHandle {
    public DriverBase driver;
    public loginPage lp;
    public loginPageHandle(DriverBase driver){
        this.driver = driver;
        lp = new loginPage(driver);
    }
    
    /**
     * 輸入用戶名
     * */
    public void sendKeysUser(String username){
        lp.sendkeys(lp.getUserElement(), username);
    }
    
    /**
     * 輸入密碼
     * */
    public void sendKeysPassword(String password){
        lp.sendkeys(lp.getPasswordElement(), password);
    }
    /**
     * 點擊登陸
     * */
    public void clickLoginButton(){
        lp.click(lp.getLoginButtonElement());
    }
}

在我們的操作類裏面所有的方法都是對單一的一個元素進行操作,這裏並不是很全,並沒有把所有元素都羅列進去,我們可以自行思考。在一些po模型中一些人是把這個放在了page裏面,其實這個看個人,沒有對錯,只需要記住一個思想就行,我們的目的是把所有的元素、操作、數據都分離開就好。有操作後我們可以對業務或者一些人認為是case來看了:


public class LoginPro {
public loginPageHandle lph;
public DriverBase driver;
public LoginPro(DriverBase driver){
this.driver = driver;
lph = new loginPageHandle(driver);
}
public void login(String username,String password){
if(lph.assertLoginPage()){
lph.sendKeysUser(username);
lph.sendKeysPassword(password);
lph.clickAutoSignin();
lph.clickLoginButton();
}else{
System.out.println("頁面不存在或者狀態不正確。");
}
}

}

 

在這個類如果放在case裏面也是合適的,只是那樣會有一點兒長,所以我單獨拿出來了,我們可以看到我首先判斷的是我處於的頁面是否在我們的登陸頁面,如果字我才會進行下面的操作。當完成這個之後我們就可以單獨的寫case了:

public class SuiteTestLogin extends CaseBase{
    public DriverBase driver;
    public LoginPro loginpro;
    public HomePagePro homepagepro;
    public ProUtil pro;
    public HandleCookie handcookie;
    
    @BeforeClass
    public void beforeClass(){
        this.driver = InitDriver("chrome");
        pro = new ProUtil("loginTest.properties");
        driver.driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        loginpro = new LoginPro(driver);
        handcookie = new HandleCookie(driver);
        homepagepro = new HomePagePro(driver);
        driver.get(pro.getPro("url"));
    }
    @Test
    public void testLogin(){
        String username = pro.getPro("username");
        String password = pro.getPro("passwd");
        loginpro.login(username, password);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(homepagepro.AssertLogin(pro.getPro("yq"))){
            System.out.println("登陸成功"+username);
            handcookie.writeCookie();
        }
    }
    @AfterClass
    public void afterClass(){
        driver.close();
    }
}

在case裏面我們有一些基礎的方法來至於case的基類,我們再這case裏面只做一件事情那就是打開頁面然後登陸,最後退出。
當處於當前頁面時我們可以運行,但是這個不是我們的目的,我們的目的是要整個自動化起來,所以我們需要在testng.xml裏面去配置


<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<parameter name ="username" value="18513199586"/>
<parameter name ="pass" value="111111"/>
<test name="Test1">
<listeners>
<listener class-name="com.mushishi.selenium.util.RetryListener" />
<listener class-name="com.mushishi.selenium.util.TestNGListenerScreen" />
</listeners>
<classes>
<class name="com.mushishi.selenium.testCase.SuiteTestLogin"/>
<class name="com.mushishi.selenium.testCase.SuiteTestBuy"/>
</classes>
</test>
</suite>



我們這個配置有一個監聽事件,這個監聽是為了當遇見錯誤時實現截圖的。這個配置弄好後你可以右鍵該xml直接運行,最後你會得到一個一樣而又不一樣的結果。
testng.xml配置完畢後我們接著需要在我們的pom.xml中接著進行配置編譯插件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mushishi</groupId>
  <artifactId>selenium</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>selenium</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.11</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
  </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12</version>
                <inherited>true</inherited>
                <configuration>
                <suiteXmlFiles>
                    <suiteXMLfile>testNG.xml</suiteXMLfile>
                </suiteXmlFiles>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

我們需要把這兩個插件加入,加入後我們就可以直接右鍵運行該xml,得到的結果也是一樣,可以運行剛我們的整個case。最後一步集成jenkins
在打開的jenkins頁面只需要選擇新建,然後進入到了創建工程頁面,在這個頁面你需要選擇創建一個maven工程:技術分享
在創建完成後只需要在我們的build欄進行一個簡單的配置,這裏配置我們剛pom.xml文件的絕對路徑:技術分享
到目前為止你可以直接保存,然後去首頁進行構建就可以了:
技術分享
在jenkins這裏我們還可以進行郵件的配置等等操作。哈哈,趕快去動手吧。

備註:本文轉載自慕課網,信息如下:

作者: Mushishi_Xu
鏈接:http://www.imooc.com/article/18756
來源:慕課網

web自動化測試從入門到持續集成(selenium webdriver)