天天看點

Java自動化測試系列[v1.0.0][Gradle開發環境]

準備與Gradle安裝

Gradle支援目前大多數主流作業系統,并且需要JDK1.8及以上版本

C:\>java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
           

下載下傳

官方下載下傳位址為Gradle下載下傳,根據自己的作業系統下載下傳即可,安裝檔案分為兩種,一種是二進制ZIP包,另一種是完整版本它除了二進制包外還有文檔和源碼,實際上如果隻是使用Gradle這個自動化建構工具的話,下載下傳第一種即可,如果需要看它的官方文檔可以線上看線上文檔,并且因為它同樣是個開源工具,也提供了源碼源碼位址

環境配置

  • 方式一:在系統環境變量的path選項中,直接添加gradle根目錄下的bin檔案夾路徑,例如

    C:\Gradle\bin

  • 方式二:添加根路徑變量名

    GRADLE_HOME

    ,變量值為

    C:\Gradle

    也就是bin檔案夾路徑的上層路徑,然後再path中添加

    %GRADLE_HOME%\bin;

    相對路徑

環境驗證

配置好後,啟動指令行,注意這種系統配置不可使用已經打開的指令行視窗,如果系統環境配置實在打開指令行視窗之後進行的,那麼該指令行視窗是無法加載該配置的,在這個視窗進行驗證會失敗;重新啟動一個指令行視窗,然後輸入

gradle -v

,得到如下視窗所示内容,則表示環境安裝配置成功

Java自動化測試系列[v1.0.0][Gradle開發環境]

建立工程

啟動IDEA,并點選Create New Project

Java自動化測試系列[v1.0.0][Gradle開發環境]

選擇Gradle,并選擇自己的JDK版本以及庫

Java自動化測試系列[v1.0.0][Gradle開發環境]

然後下一步,輸入工程的名稱以及存儲路徑

Java自動化測試系列[v1.0.0][Gradle開發環境]

然後進入工程的建構過程

Java自動化測試系列[v1.0.0][Gradle開發環境]

如果右上角有如下圖中提醒彈出,需點選後邊的選項

Java自動化測試系列[v1.0.0][Gradle開發環境]

配置IDEA

Java自動化測試系列[v1.0.0][Gradle開發環境]

項目建構成功後,目錄結構如下所示

Java自動化測試系列[v1.0.0][Gradle開發環境]

配置遠端倉庫

在Gradle安裝目錄下的 init.d 檔案夾下,建立一個 init.gradle 檔案,裡面填寫以下配置。

Java自動化測試系列[v1.0.0][Gradle開發環境]
allprojects {
    repositories {
        maven { url 'file:///C:/Java/maven_repositoryD:/apache-maven-3.6.2/repository'}
        mavenLocal()
        maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
        maven { name "Bstek" ; url "http://nexus.bsdn.org/content/groups/public/" }
        mavenCentral()
		maven {url "https://maven.aliyun.com/repository/public"}
		maven {url "https://maven.aliyun.com/repository/jcenter"}
		maven {url "https://maven.aliyun.com/repository/spring"}
		maven {url "https://maven.aliyun.com/repository/spring-plugin"}
		maven {url "https://maven.aliyun.com/repository/gradle-plugin"}
		maven {url "https://maven.aliyun.com/repository/google"}
		maven {url "https://maven.aliyun.com/repository/grails-core"}
		maven {url "https://maven.aliyun.com/repository/apache-snapshots"}
    }

    buildscript { 
        repositories { 
            maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
            maven { name "Bstek" ; url 'http://nexus.bsdn.org/content/groups/public/' }
            maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
        }
    }
}


           

repositories 中寫的是擷取 jar 包的順序。先是本地的 Maven 倉庫路徑;接着的 mavenLocal() 是擷取 Maven 本地倉庫的路徑,應該是和第一條一樣,但是不沖突;第三條和第四條是從國内和國外的網絡上倉庫擷取;最後的 mavenCentral() 是從Apache提供的中央倉庫擷取 jar 包

配置依賴

這點也是gradle相較maven的優勢之一了。相較于maven一大串的XML配置,gradle的依賴項僅需一行。

dependencies {
    testImplementation 'junit:junit:4.13'
    implementation 'com.google.code.gson:gson:2.8.6'
}
           

gradle依賴的粒度控制相較于Maven也更加精細,maven隻有compile、provided、test、runtime四種scope,而gradle有以下幾種scope:

1.implementation,預設的scope。implementation的作用域會讓依賴在編譯和運作時均包含在内,但是不會暴露在類庫使用者的編譯時。舉例,如果我們的類庫包含了gson,那麼其他人使用我們的類庫時,編譯時不會出現gson的依賴。

2.api,和implementation類似,都是編譯和運作時都可見的依賴。但是api允許我們将自己類庫的依賴暴露給我們類庫的使用者。

3.compileOnly和runtimeOnly,這兩種顧名思義,一種隻在編譯時可見,一種隻在運作時可見。而runtimeOnly和Maven的provided比較接近。

4.testImplementation,這種依賴在測試編譯時和運作時可見,類似于Maven的test作用域。

5.testCompileOnly和testRuntimeOnly,這兩種類似于compileOnly和runtimeOnly,但是作用于測試編譯時和運作時。

通過簡短精悍的依賴配置和多種多樣的作用與選擇,Gradle可以為我們提供比Maven更加優秀的依賴管理功能。

Maven和Gradle

  • Maven的配置檔案是XML格式的,假如你的項目依賴的包比較多,那麼XML檔案就會變得非常非常長;
  • XML檔案不太靈活,假如你需要在建構過程中添加一些自定義邏輯,搞起來非常麻煩;
  • Maven非常的穩定,但是相對的就是對新版java支援不足,哪怕就是為了編譯java11,也需要更新内置的Maven插件
  • 速度,gradle使用建構緩存、守護程序等方式提高編譯速度。結果就是gradle的編譯速度要遠超maven,平均編譯速度比Maven快好幾倍,而且項目越大,這個差距就越明顯
  • 靈活性,gradle要比Maven靈活太多,雖然有時候靈活并不是一件好事情。但是大部分情況下,靈活一點可以極大的友善我們。Maven死闆的XML檔案方式做起事情來非常麻煩。很多Maven項目都通過執行外部腳本的方式來完成一些需要靈活性的工作。而在gradle中配置檔案就是建構腳本,建構腳本就是程式設計語言(groovy程式設計語言),完全可以自給自足,無需外部腳本
  • 簡潔性,完成同樣的功能,gradle腳本的長度要遠遠短于maven配置檔案的長度。雖然很多人都說XML維護起來不麻煩,但是我覺得,維護一個光是依賴就有幾百行的XML檔案,不見得就比gradle腳本簡單

實戰

plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    // https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.0.0-alpha-6'
    // https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-chrome-driver
    compile group: 'org.seleniumhq.selenium', name: 'selenium-chrome-driver', version: '4.0.0-alpha-6'
}

           
import org.openqa.selenium.*;
import java.util.Arrays;
import java.util.List;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;


class JavaScriptToDo {
    public static void javaScriptClick(WebDriver driver, String id) {
        WebElement element = driver.findElement(By.id(id));
        try{
            if(element.isEnabled() && element.isDisplayed()){
                System.out.println("使用JS進行也面元素單擊");
                //執行JS語句arguments[0].click();
                ((JavascriptExecutor) driver).executeScript("arguments[0].click();", element);
            }else {
                System.out.println("頁面上元素無法進行單擊操作");
            }
        }catch (StaleElementReferenceException e){
            System.out.println("頁面元素沒有附加在頁面中" + Arrays.toString(e.getStackTrace()));
        }catch (NoSuchElementException e){
            System.out.println("在頁面中沒有找到要操作的元素" + Arrays.toString(e.getStackTrace()));
        }catch (Exception e){
            System.out.println("無法完成單擊操作" + Arrays.toString(e.getStackTrace()));
        }
    }

    public static void highLightElement(WebDriver driver, WebElement element){
        JavascriptExecutor js = (JavascriptExecutor) driver;
        /**
         * 調用js将傳入參數的頁面元素對象的背景顔色和邊框顔色分别設定為黃色和紅色
         */
        js.executeScript("arguments[0].setAttribute('style', arguments[1]);", element, "background: yellow; border:2px solid red;");
    }

    public static void main(String[] args) throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.baidu.com");
        Thread.sleep(10);
        driver.findElement(By.id("kw")).sendKeys("davieyang");
        String id = "su";
        WebElement element = driver.findElement(By.id(id));
        JavaScriptToDo.javaScriptClick(driver, id);
        JavaScriptToDo.highLightElement(driver, element);
        driver.quit();
    }
}