国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

軟件測試自動化Java篇【Selenium+Junit 5】

這篇具有很好參考價值的文章主要介紹了軟件測試自動化Java篇【Selenium+Junit 5】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Selenium

為什么選擇selenium作為我們的web自動化測試工具?

  1. 開源免費
  2. 支持多瀏覽器
  3. 支持多系統(tǒng)
  4. 支持多語言【Java,Python,C#,Rubby,JavaScript,Kolin】
  5. selenium包提供了很多可供測試使用的API

環(huán)境部署

Chrome瀏覽器
軟件測試測試java程序,測試,自動化,java,selenium,junit
Chrome驅(qū)動【驅(qū)動器版本要和瀏覽器版本對應越詳細越好】
軟件測試測試java程序,測試,自動化,java,selenium,junit
然后把驅(qū)動包放在安裝jdk的bin目錄下
軟件測試測試java程序,測試,自動化,java,selenium,junit

selenium工具包
軟件測試測試java程序,測試,自動化,java,selenium,junit

自動化測試例子

分為接口自動化測試和UI自動化測試

UI自動化測試包含界面測試

我們都知道用戶的設備很多,有手機,平板和電腦。這些設備運行的項目在發(fā)布之初都需要經(jīng)過測試,這些測試又分為web自動化測試 和 移動端自動化測試。這里以 web自動化測試 為主。
自動化測試的工具有很多,比如 QTP、Selenium,Jmeter、Loadrunner。本期就以 Selenium 為主進行介紹最簡單的自動化測試

測試點擊百度

import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

private class AutoTest {
    // 模擬百度搜索關(guān)鍵詞
    public static void baiduSearchKey() {
        String url = "https://www.baidu.com";
        String keyWords = "新聞";
        ChromeDriver chromeDriver=new ChromeDriver();
        try {
            Thread.sleep(5000);
            // 輸入框輸入文字
            chromeDriver.findElement(new By.ByXPath("http://*[@id=\"kw\"]")).sendKeys(keyWords);
            Thread.sleep(5000);
            // 點擊搜索按鈕
            chromeDriver.findElement(new By.ByXPath("http://*[@id=\"su\"]")).click();
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        chromeDriver.quit();
    }
    
    public static void main(String[] args) {
    		baiduSearchKey();
    }
}

獲取元素方法有很多,但經(jīng)常用的是 ByXPath和ByCssSelector
軟件測試測試java程序,測試,自動化,java,selenium,junit
ByXpath
/:相當于子級一層一層的完整xpath路徑
//:相當于越級,直接越過之前的html標簽,根據(jù)id來查詢標簽

后文中只有之前的幾個操作時獲取部分xpath,以后的獲取都是完整的獲取xpath路徑【看//數(shù)量即可知道是否根據(jù)帶通配符或者id查詢來區(qū)別】

常見的元素操作

  1. 輸入文本 sendKeys(str)
    對元素操作的前提是元素能夠被找到,如果查詢的元素不是可編輯的文本標簽,那么前端不受影響,后端也不報錯。按照程序的設定正常退出
  2. 點擊操作 click()&提交操作 submit()
private static void TestBlogLogin() {
    // 輸入郵箱
    String url = "http://localhost:8080/index.html";
    String email = "1969612859@qq.com";
    String password = "admin";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    try {
        Thread.sleep(3000);
        // 輸入郵箱
        chromeDriver.findElement(new By.ByXPath("http://*[@id=\"login\"]/div[1]/input")).sendKeys(email);
        Thread.sleep(3000);
        // 輸入密碼
        chromeDriver.findElement(new By.ByXPath("http://*[@id=\"login\"]/div[2]/input")).sendKeys(password);
        Thread.sleep(3000);
        // 點擊登錄【也可以回車登錄】
        chromeDriver.findElement(new By.ByXPath("/html/body/div/div/div/form[1]/button")).click();
        //chromeDriver.findElement(new By.ByXPath("/html/body/div/div/div/form[1]/button")).submit();
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}

提交操作 submit 僅適用于form表單之類的submit操作,一般用的少
Selenium更推薦使用 click ,功能比 submit 更豐富

  1. 清除操作 clear()
private static void TestBlogLogin() {
    // 輸入正確的郵箱和密碼
    String url = "http://localhost:8080/index.html";
    String email = "1969612859@qq.com";
    String password = "admin";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    try {
        Thread.sleep(3000);
        chromeDriver.findElement(new By.ByXPath("http://*[@id=\"login\"]/div[1]/input")).sendKeys("手滑輸入錯了");
        Thread.sleep(3000);
        // 清除文本
        chromeDriver.findElement(new By.ByXPath("http://*[@id=\"login\"]/div[1]/input")).clear();
        Thread.sleep(3000);
        chromeDriver.findElement(new By.ByXPath("http://*[@id=\"login\"]/div[1]/input")).sendKeys(email);
        Thread.sleep(3000);
        chromeDriver.findElement(new By.ByXPath("http://*[@id=\"login\"]/div[2]/input")).sendKeys(password);
        Thread.sleep(3000);
        chromeDriver.findElement(new By.ByXPath("/html/body/div/div/div/form[1]/button")).click();
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}
  1. 獲取文本值 getText()
private static void TestBlogLogin() {
    // 輸入正確的郵箱和密碼
    String url = "http://localhost:8080/index.html";
    String email = "1969612859@qq.com";
    String password = "admin";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    try {
        // 獲取第一道題目的標題
        String text = chromeDriver.findElement(new By.ByXPath("/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[2]")).getText();
        System.out.println("getText()獲取到的文本:" + text);
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}

軟件測試測試java程序,測試,自動化,java,selenium,junit

軟件測試測試java程序,測試,自動化,java,selenium,junit

發(fā)現(xiàn)即使 URL 跳轉(zhuǎn)到了別的網(wǎng)頁,由于線程休眠3s的緣故,并不會很快就去獲取頁面元素而是給了頁面一個加載的時間,因此可以完全獲取到跳轉(zhuǎn)到其它頁面的標簽

  1. 獲取屬性 getAttribute(attr)
    軟件測試測試java程序,測試,自動化,java,selenium,junit
private static void TestBlogLogin() {
    // 輸入正確的郵箱和密碼
    String url = "http://localhost:8080/index.html";
    String email = "1969612859@qq.com";
    String password = "admin";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    try {
        // 獲取屬性
        String role = chromeDriver.findElement(new By.ByXPath("/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div")).getAttribute("role");
        Thread.sleep(3000);
        String aria_valuenow = chromeDriver.findElement(new By.ByXPath("/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div")).getAttribute("aria-valuenow");
        Thread.sleep(3000);
        String aria_valuemin = chromeDriver.findElement(new By.ByXPath("/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div")).getAttribute("aria-valuemin");
        Thread.sleep(3000);
        String aClass = chromeDriver.findElement(new By.ByXPath("/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div")).getAttribute("class");
        Thread.sleep(3000);
        String style = chromeDriver.findElement(new By.ByXPath("/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div")).getAttribute("style");
        Thread.sleep(3000);
        System.out.printf("role=%s\naria_valuenow=%s\naria_valuemin=%s\naClass=%s\nstyle=%s\n", role, aria_valuenow, aria_valuemin, aClass, style);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}

軟件測試測試java程序,測試,自動化,java,selenium,junit
6. 獲取標題getTitle()和urlgetCurrenturl()

// 模擬百度搜索關(guān)鍵詞
private static void baiduSearchKey() {
    String url = "https://www.baidu.com";
    String keyWords = "新聞";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    HashMap<String, List<String>> info = new HashMap<>();
    try {
        Thread.sleep(5000);
        ArrayList<String> before = new ArrayList<String>() {{
            add(chromeDriver.getTitle());
            add(chromeDriver.getCurrentUrl());
        }};
        // 輸入框輸入文字
        chromeDriver.findElement(new By.ByXPath("http://*[@id=\"kw\"]")).sendKeys(keyWords);
        Thread.sleep(5000);
        // 點擊搜索按鈕
        chromeDriver.findElement(new By.ByXPath("http://*[@id=\"su\"]")).click();
        Thread.sleep(5000);
        System.out.println("搜索之后");
        ArrayList<String> after = new ArrayList<String>() {{
            add(chromeDriver.getTitle());
            add(chromeDriver.getCurrentUrl());
        }};
        info.put("before", before);
        info.put("after", after);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
    System.out.println(info);
}

軟件測試測試java程序,測試,自動化,java,selenium,junit

窗口

  1. 窗口大小
    窗口大小的設置:最大/小化,全屏窗口,手動設置窗口大小
private static void windControl() {
    String url = "https://www.baidu.com";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    try {
        Thread.sleep(1500);
        // 窗口最大化
        chromeDriver.manage().window().maximize();
        Thread.sleep(1500);
        // 窗口最小化
        chromeDriver.manage().window().minimize();
        Thread.sleep(1500);
        // 全屏
        chromeDriver.manage().window().fullscreen();
        Thread.sleep(1500);
        // 手動設置窗口大小
        chromeDriver.manage().window().setSize(new Dimension(1024, 768));
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}
  1. 切換窗口
    一般的窗口切換可能會導致找不到元素的BUG
private static void windControl() {
    String url = "https://www.baidu.com";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    try {
        Thread.sleep(1500);
        // 點擊準備跳轉(zhuǎn)
        chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[3]/a[6]")).click();
        String value = chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[3]/div/div/div/div/div/div[2]/form/span[2]/input")).getAttribute("value");
        System.out.println(value);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}

軟件測試測試java程序,測試,自動化,java,selenium,junit
由于無法獲取跳轉(zhuǎn)頁面的元素,所以就會報錯。因此需要一個頁面切換功能

private static void windControl() {
    String url = "https://www.baidu.com";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    try {
        Thread.sleep(1500);
        // 獲取當前頁面句柄
        String currentHandle = chromeDriver.getWindowHandles().toString();
        System.out.println("當前首頁句柄:"+currentHandle);
        Thread.sleep(1500);
        // 點擊準備跳轉(zhuǎn)
        chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[3]/a[6]")).click();
        // 獲取跳轉(zhuǎn)之后所有標簽頁的句柄
        Set<String> handles = chromeDriver.getWindowHandles();
        for (String handle : handles) {
            if (currentHandle != handle){
                chromeDriver.switchTo().window(handle);
            }
        }
        String value = chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[3]/div/div/div/div/div/div[2]/form/span[2]/input")).getAttribute("value");
        System.out.println(value);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}

運行的退出碼已經(jīng)恢復正常
軟件測試測試java程序,測試,自動化,java,selenium,junit
3. 屏幕截圖
需要導入一個常用的commons-io庫

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
private static void windControl() {
    String url = "https://www.baidu.com";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    try {
        Thread.sleep(1500);
        // 點擊準備跳轉(zhuǎn)
        chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[3]/a[6]")).click();
        File screenshotAs = chromeDriver.getScreenshotAs(OutputType.FILE);
        // 把屏幕截圖好的文件放在指定的路徑下
        String fileName = "my.png";
        try {
            FileUtils.copyFile(screenshotAs, new File(fileName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        String value = chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[3]/div/div/div/div/div/div[2]/form/span[2]/input")).getAttribute("value");
        System.out.println(value);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}

這里會發(fā)生報錯,由于屏幕截圖原因。所以會保存當時的獲取狀態(tài)。

會把當前的現(xiàn)場截圖保存下來【由于沒有切換頁面,所以也就會報錯,截圖代碼發(fā)生在報錯之前的代碼,所以也就保留了事故現(xiàn)場

等待

程序執(zhí)行的速度比頁面渲染速度快很多,因此之前的等待都是使用線程的強制等待,這并不合理。等待一共分為四種。
強制等待、隱式等待、顯示等待、流暢等待

  1. 強制等待
    程序阻塞運行,Thread.sleep()。會用到,但是自動化里不能用的特別多,否則拖慢速度
  2. 隱式等待
    隱式等待會一直輪詢判斷元素是否存在,如果不存在就等待設置好的時間里不斷地進行輪詢知道元素能夠被找到
private static void waitController(){
    String url = "https://www.baidu.com";
    ChromeDriver chromeDriver=new ChromeDriver();
    // 添加隱式等待:會作用于chromeDriver整個生命周期
    chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
    chromeDriver.get(url);
    chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input")).sendKeys("迪麗熱巴");
    chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input")).click();
    chromeDriver.findElement(new By.ByXPath("/html/body/div[2]/div[3]/div[1]/div[3]/div[1]/div[1]/div/div/div/div/div[2]/div/a/div/p/span/span"));
    chromeDriver.quit();
}
  1. 顯示等待
    隱式等待針對的是 driver的整個生命周期,所以對全部元素有效,但有時候并非全部都需要等待,我們可以只針對其中一個元素進行等待操作,其余元素交給程序快速運行進而提高自動化測試的效率
private static void webDriverWait() {
    String url = "https://www.baidu.com";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(url);
    chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input")).sendKeys("迪麗熱巴");
    chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input")).click();
    // 只針對某個元素顯示等待
    new WebDriverWait(chromeDriver, Duration.ofSeconds(3)).until(lambda -> chromeDriver.findElement(new By.ByXPath("/html/body/div[2]/div[3]/div[1]/div[3]/div[1]/div[1]/div/div/div/div/div[2]/div/a/div/p/span/span")));
    chromeDriver.get(url);
}

這里使用了 lambda表達式 的語法,我們查看一下 until的源碼
軟件測試測試java程序,測試,自動化,java,selenium,junit
參數(shù)是一個泛型,所以可以傳入任何泛型函數(shù)。然后就是執(zhí)行的循環(huán),獲取頁面元素操作。

  • 隱式等待 和 顯式等待 并不能同時使用,可能會出現(xiàn)意想不到的結(jié)果
  • 隱式等待 和 顯示等待 均不出現(xiàn)效果的時候可以使用 強制等待

瀏覽器的操作

瀏覽器的回退,前進和刷新操作

private static void navigateControl() {
    String url = "https://www.baidu.com";
    ChromeDriver chromeDriver = new ChromeDriver();
    // 簡寫
//        chromeDriver.get(url);
    // 非簡寫
    chromeDriver.navigate().to(url);
    chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
    // 想要回退到訪問百度網(wǎng)址之前的狀態(tài)
    chromeDriver.navigate().back();
    // 前進,有進入到了百度首頁
    chromeDriver.navigate().forward();
    // 刷新百度首頁
    chromeDriver.navigate().refresh();
    chromeDriver.quit();
}

彈窗

彈窗一共有3大類型,如下所示分別為:alert、confirm和prompt
軟件測試測試java程序,測試,自動化,java,selenium,junit
但是卻發(fā)現(xiàn),瀏覽器進入檢查時候無法獲取到彈窗的元素
處理彈窗的步驟

  1. 將driver對象作用到彈窗上(切換到彈窗)
  2. 選擇確認/取消(提示彈窗輸入文本)
    作用到彈窗上:driver.switchTo.alert()
    確認:driver.accept()
    取消:`driver.dismiss()
    輸入:driver.sendKeys()

前端代碼

<div id="alertVue">
    <button v-on:click="f()">{{value}}</button>
</div>
<div id="confirmVue">
    <button v-on:click="f()">{{value}}</button>
</div>
<div id="promptVue">
    <button v-on:click="f()">{{value}}</button>
</div>

<script type="text/javascript" src="vue.js"></script>
<script>
    const alertVue = new Vue({
        el: '#alertVue',
        data: {
            value: "Alert彈窗",
        },
        methods: {
            f() {
                window.alert("alert彈窗");
            }
        }
    });

    const confirmVue = new Vue({
        el: '#confirmVue',
        data: {
            value: "Confirm確認框",
        },
        methods: {
            f() {
                if (window.confirm("是否確認?")) {
                    confirmVue.value = "true";
                } else {
                    confirmVue.value = "false";
                }
            }
        }
    });
    const promptVue = new Vue({
        el: '#promptVue',
        data: {
            value: "輸入框",
        },
        methods: {
            f() {
                promptVue.value = window.prompt("輸入框");
            }
        }
    });
</script>

測試代碼

private static void alertController(){
    String url = "file:///D:/Documents/Program/Java/SeleniumTest/Autotest/src/test/java/alertHTML.html";
    ChromeDriver chromeDriver=new ChromeDriver();
    chromeDriver.navigate().to(url);
    try {
        Thread.sleep(1500);
        // 點擊 alert
        chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/button")).click();
        Thread.sleep(1500);
        // 切換到彈窗
        Alert alert = chromeDriver.switchTo().alert();
        // 確認操作:accept/取消操作:dismiss
        alert.dismiss();
        Thread.sleep(1500);

        // 點擊 confirm
        chromeDriver.findElement(new By.ByXPath("/html/body/div[2]/button")).click();
        Thread.sleep(1500);
        // 切換到彈窗
        alert = chromeDriver.switchTo().alert();
        // 確認操作
        alert.accept();
        Thread.sleep(1500);

        // 點擊 prompt
        chromeDriver.findElement(new By.ByXPath("/html/body/div[3]/button")).click();
        Thread.sleep(1500);
        // 切換到彈窗
        alert = chromeDriver.switchTo().alert();
        Thread.sleep(1500);
        // 在頁面上看不到輸入的文本效果,但是其實已經(jīng)輸入了
        alert.sendKeys("阿斯頓馬丁");
        // 接受文本
        alert.accept();
        Thread.sleep(1500);
        // 確認操作
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}
  • prompt 彈窗進行 sendKeys(str) 的時候不會在頁面出現(xiàn)效果,但是程序已經(jīng)輸入有文本信息
  • alert 警告彈窗雖然只有確認選項,但是也可以用 dismiss和accept 都可以進行取消操作
  • url 一定要復制瀏覽器中選擇而不是從資源路徑中選擇【瀏覽器的url前邊會多一個file:///

選擇器

選擇框的處理困難在于無法將下拉框的元素進行定位,每當點擊檢查的時候,下拉框就會消失
這個時候我們可以根據(jù)三個條件進行選擇

  1. 文本
  2. 屬性
  3. 下標

html代碼

<div id="selectVue">
    <select>
        <option v-for="(month, index) in monthes" v-bind:value="index+1">{{month}}</option>
    </select>
</div>

<script>
const selectVue = new Vue({
    el: '#selectVue',
    data: {
        monthes: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December",],
    },
});
</script>

Java代碼

private static void alertController() {
    String url = "file:///D:/Documents/Program/Java/SeleniumTest/Autotest/src/test/java/alertHTML.html";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.navigate().to(url);
    try {
        // option選擇器
        WebElement element = chromeDriver.findElement(new By.ByXPath("/html/body/div[4]/select"));
        Thread.sleep(1500);
        // 先創(chuàng)建選擇框?qū)ο?/span>
        Select select = new Select(element);
        Thread.sleep(1500);
        // 根據(jù)文本來選擇【并不會像正常操作一樣點擊一下選擇框而是直接選中下拉框】
        select.selectByVisibleText("September");
        Thread.sleep(1500);
        // 根據(jù)屬性值選擇
        select.selectByValue("1");
        Thread.sleep(1500);
        // 根據(jù)下標選擇【0開始】,選取九月
        select.selectByIndex(8);
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}

XPath的選擇器是從1開始;而下標選擇從0開始

執(zhí)行腳本

執(zhí)行 js 代碼,有時候會遇到輸入文本不完全或者不生效的情況下,可以使用執(zhí)行原生js腳本進行解決

private static void scriptControl(){
    String url = "https://image.baidu.com/";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.navigate().to(url);
    try {
        // 執(zhí)行 js 代碼讓頁面置底
        chromeDriver.executeScript("document.documentElement.scrollTop = 500");
        Thread.sleep(1500);
        // 執(zhí)行 js 代碼讓頁面置頂
        chromeDriver.executeScript("document.documentElement.scrollTop = 0");
        Thread.sleep(1500);
        
        // 百度輸入框輸入指定文本
        chromeDriver.navigate().to("https://www.baidu.com/");
        chromeDriver.executeScript("var ss=document.querySelector('#kw'); ss.value='英雄鋼筆'");
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

    chromeDriver.quit();
}

文件上傳

文件上傳的難點在于當點擊上傳文件時的彈窗是系統(tǒng)自己的彈窗,并不是瀏覽器的彈窗。對于Selenium而言并不能控制系統(tǒng)。
軟件測試測試java程序,測試,自動化,java,selenium,junit

private static void fileUploadControl(){
    String url = "file:///D:/Documents/Program/Java/SeleniumTest/Autotest/src/test/java/alertHTML.html";
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.navigate().to(url);
    try {
        Thread.sleep(1500);
        chromeDriver.findElement(new By.ByXPath("/html/body/div[5]/input")).sendKeys("D:\\Documents\\Program\\Java\\SeleniumTest\\Autotest\\src\\test\\java\\alertHTML.html");
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    chromeDriver.quit();
}

這里運行完畢之后并不是把文件上傳到服務器而是要把上傳的文件路徑+文件以名稱的方式放到這里

瀏覽器參數(shù)

實際工作中,測試人員將自動化部署在機器上自動的執(zhí)行,測試人員不會每次都一直盯著自動化執(zhí)行的過程,而是直接查看自動化執(zhí)行的結(jié)果。
無頭模式:類似于Linux的&模式運行命令掛載在后臺進程,不在前臺顯示。瀏覽器而言的話就是沒有畫面的運行一些自動化測試腳本,這樣可以節(jié)約一定的機器內(nèi)存資源。

private static void paramControl() {
    // 百度搜索 ”測試開發(fā)工程師“
    // 先創(chuàng)建選項對象然后設置瀏覽器參數(shù)
    String url = "https://www.baidu.com/";
    ChromeOptions chromeOptions = new ChromeOptions();
    chromeOptions.addArguments("-headless");
    // 添加瀏覽器參數(shù)設置
    ChromeDriver chromeDriver = new ChromeDriver(chromeOptions);
    chromeDriver.navigate().to(url);
    chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
    chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input")).sendKeys("測試開發(fā)工程師");
    chromeDriver.findElement(new By.ByXPath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input")).click();
    chromeDriver.quit();
}

Junit 5

自動化是Selenium腳本來實現(xiàn)的,Junit是java的單元測試工具.只不過我們在實現(xiàn)自動化的時候需要借用Junit庫里面提供的一些方法
Junit 5支持最低支持jdk8
目前Java領域內(nèi)最為流行的單元測試框架 ------ JUnit
Junit 5 = Junit Platform + Junit Jupiter + Junit Vintage
Junit Platform: Junit Platform是在JVM上啟動測試框架的基礎,不僅支持Junit自制的測試引擎,其他測試引擎也都可以接入
Junit Jupiter: Junit Jupiter提供了JUnit5的新的編程模型,是JUnit5新特性的核心。內(nèi)部 包含了一個測試引擎,用于在Junit Platform上運行
Junit Vintage: 由于JUnit已經(jīng)發(fā)展多年,為了照顧老的項目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的測試引擎
軟件測試測試java程序,測試,自動化,java,selenium,junit

導入依賴

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-suite</artifactId>
    <version>1.9.2</version>
    <scope>test</scope>
</dependency>

Junit 4 和 Junit5 注解對比

Junit 5 Junit 4 說明
@Test @Test 被注解的是一個測試方法,和Junit 4相同
@BeforeAll @BeforeClass 被注解的(靜態(tài))方法將在當前類中的所有@Test方法執(zhí)行一次
@BeforeEach @Before 被注解的方法將在當前類中的么欸個@Test方法前執(zhí)行
@AffterAll @AfterClass 被注解的(靜態(tài))方法將在當前類中的所有@Test方法執(zhí)行一次
@AffterEach @After 被注解的方法將在當前類中的么欸個@Test方法后執(zhí)行
@DIsable @Ignore 被注解的方法不會執(zhí)行(將被跳過),但會報告為已執(zhí)行

Junit 4 中@Testorg.junit.Test;
Junit 5 中@Testorg.junit.jupiter.api.Test;

@BeforeAll 注解必須用在 static 修飾的代碼塊上,否則會報錯

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class JunitTest {
    // 當前方法要在所有測試用例之前執(zhí)行一次
    @BeforeAll
    static void beforeAll() {
        System.out.println("@BeforeAll");
    }

    // 當前方法要在每個測試用例執(zhí)行之前執(zhí)行一次
    @BeforeEach
    void beforeEach() {
        System.out.println("@BeforeEach");
    }

    @Test
    void t1() {
        System.out.println("@Test1");
    }

    @Test
    void t2() {
        System.out.println("@Test2");
    }

    @Test
    void t3() {
        System.out.println("@Test3");
    }
}

軟件測試測試java程序,測試,自動化,java,selenium,junit
After效果和Before效果相反

import org.junit.jupiter.api.*;

public class JunitTest {
    // 當前方法要在所有測試用例之前執(zhí)行一次
    @BeforeAll
    static void beforeAll() {
        System.out.println("@BeforeAll");
    }

    // 當前方法要在每個測試用例執(zhí)行之前執(zhí)行一次
    @BeforeEach
    void beforeEach() {
        System.out.println("@BeforeEach");
    }

    @Test
    void t1() {
        System.out.println("@Test1");
    }

    @Test
    void t2() {
        System.out.println("@Test2");
    }

    @Test
    void t3() {
        System.out.println("@Test3");
    }

    @AfterEach
    void afterEach() {
        System.out.println("@AfterEach");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("@AfterAll");
    }
}

軟件測試測試java程序,測試,自動化,java,selenium,junit

斷言

斷言方法 說明
assertEquals(expected, actual) 如果 expected 不等于 actual ,則斷言失敗
assertFalse(booleanExpression) 如果 booleanExpression 不是 false ,則斷言失敗
assertNull(actual) 如果 actual 不是 null ,則斷言失敗
assertNotNull(actual) 如果 actual 是 null ,則斷言失敗
assertTrue(booleanExpression) 如果 booleanExpression 不是 true ,則斷言失敗
@Test
void testAttributeValue() {
    String url = "https://www.baidu.com/";
    ChromeOptions chromeOptions = new ChromeOptions();
    chromeOptions.addArguments("-headless");
    ChromeDriver chromeDriver = new ChromeDriver(chromeOptions);
    chromeDriver.navigate().to(url);
    chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
    String value = chromeDriver.findElement(By.cssSelector("#su")).getAttribute("value");
    // 假如這里獲取到的屬性值不是 百度一下 而是百度兩下
    System.out.println("value:" + value);
    Assertions.assertEquals("百度兩下", value);
    chromeDriver.quit();
}

斷言失敗
軟件測試測試java程序,測試,自動化,java,selenium,junit
斷言成功

@Test
void testAttributeValue() {
    String url = "https://www.baidu.com/";
    ChromeOptions chromeOptions = new ChromeOptions();
    chromeOptions.addArguments("-headless");
    ChromeDriver chromeDriver = new ChromeDriver(chromeOptions);
    chromeDriver.navigate().to(url);
    chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
    String value = chromeDriver.findElement(By.cssSelector("#su")).getAttribute("value");
    // 假如這里獲取到的屬性值不是 百度一下 而是百度兩下
    System.out.println("value:" + value);
    Assertions.assertNotEquals("百度兩下", value);
    chromeDriver.quit();
}

軟件測試測試java程序,測試,自動化,java,selenium,junit

不會提示錯誤地方

測試順序

import org.junit.jupiter.api.*;

public class JunitTest {
    // 當前方法要在所有測試用例之前執(zhí)行一次
    @BeforeAll
    static void beforeAll() {
        System.out.println("@BeforeAll");
    }

    // 當前方法要在每個測試用例執(zhí)行之前執(zhí)行一次
    @BeforeEach
    void beforeEach() {
        System.out.println("@BeforeEach");
    }

    @Test
    void ae() {
        System.out.println("@Test1");
    }

    @Test
    void bc() {
        System.out.println("@Test2");
    }

    @Test
    void ab() {
        System.out.println("@Test3");
    }

    @AfterEach
    void afterEach() {
        System.out.println("@AfterEach");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("@AfterAll");
    }
}

@BeforeAll
@BeforeEach
@Test3
@AfterEach
@BeforeEach
@Test1
@AfterEach
@BeforeEach
@Test2
@AfterEach
@AfterAll

發(fā)現(xiàn)執(zhí)行順序按照方法名排序一樣,這里的順序并不是按照程序中代碼的順序執(zhí)行。有時候我們需要按照順序執(zhí)行代碼,比如測試系統(tǒng)的時候必須要用戶先登陸才可以后續(xù)的一些操作的時候就需要按照順序執(zhí)行測試代碼
添加一個 @TestMethodOrder 注解,然后添加參數(shù) MethodOrderer.OrderAnnotation.class,最后再給每個執(zhí)行的代碼編輯順序即可

import org.junit.jupiter.api.*;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
    // 當前方法要在所有測試用例之前執(zhí)行一次
    @BeforeAll
    static void beforeAll() {
        System.out.println("@BeforeAll");
    }

    // 當前方法要在每個測試用例執(zhí)行之前執(zhí)行一次
    @BeforeEach
    void beforeEach() {
        System.out.println("@BeforeEach");
    }

    @Test
    @Order(1)
    void ae() {
        System.out.println("@Test1");
    }

    @Test
    @Order(2)
    void bc() {
        System.out.println("@Test2");
    }

    @Test
    @Order(3)
    void ab() {
        System.out.println("@Test3");
    }

    @AfterEach
    void afterEach() {
        System.out.println("@AfterEach");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("@AfterAll");
    }
}
@BeforeAll
@BeforeEach
@Test1
@AfterEach
@BeforeEach
@Test2
@AfterEach
@BeforeEach
@Test3
@AfterEach
@AfterAll

參數(shù)化

  1. 盡可能地通過一個用例,多組參數(shù)來模擬用戶的行為
  2. 使用了參數(shù)化注解之后就不能再使用 @Test 注解

單參數(shù)

@ParameterizedTest// 使用參數(shù)化注解之前需要先聲明該方法為參數(shù)化方法
@ValueSource(strings = {"1969612859@qq.com", "1969612858@qq.com"})// 通過注解提供數(shù)據(jù)源
void SingleParamsTest(String email){
    System.out.println(email);
}

軟件測試測試java程序,測試,自動化,java,selenium,junit
可以看到 @ValueSource(數(shù)據(jù)類型={參數(shù)1, 參數(shù)2, 參數(shù)3...}) 提供的數(shù)據(jù)源類型有很多
軟件測試測試java程序,測試,自動化,java,selenium,junit

多參數(shù)

@ParameterizedTest
@CsvSource({"1969612859@qq.com, admin", "1969612858@qq.com, root"})
void muchParamsTest(String email, String password){
    System.out.printf("email:%s<==>password:%s\n", email, password);
}

email:1969612859@qq.com<==>password:admin
email:1969612858@qq.com<==>password:root

當參數(shù)很多的時候,我們可以把參數(shù)放入文件中然后通過文件讀取獲取參數(shù)

@ParameterizedTest
@CsvFileSource(files = "D:\\Documents\\Program\\Java\\SeleniumTest\\Autotest\\src\\test\\resources\\userData.csv")
void csvFileParamsTest(String email, String password){
    System.out.printf("email:%s<==>password:%s\n", email, password);
}

軟件測試測試java程序,測試,自動化,java,selenium,junit
發(fā)現(xiàn) @CsvFileSource 的源碼可以放入很多參數(shù)來設置文件,這里只放了 files 一個參數(shù)的值,文件默認編碼已經(jīng)是 UTF-8 所以就可以不用管編碼問題
軟件測試測試java程序,測試,自動化,java,selenium,junit

動態(tài)參數(shù)

這里導入一個隨機工具類 common-util–使用方法

// 動態(tài)參數(shù)
static Stream<Arguments> methodParams(){
    // 構(gòu)造動態(tài)參數(shù)
    String[] arr = new String[10];
    for (int i = 0; i < arr.length; i++) {
        arr[i] = RandomUtil.randomNumbers(10)+"@qq.com";
    }
    return Stream.of(
            Arguments.arguments(arr[0], RandomUtil.randomString(8)),
            Arguments.arguments(arr[1], RandomUtil.randomString(8)),
            Arguments.arguments(arr[2], RandomUtil.randomString(8)),
            Arguments.arguments(arr[3], RandomUtil.randomString(8)),
            Arguments.arguments(arr[4], RandomUtil.randomString(8)),
            Arguments.arguments(arr[5], RandomUtil.randomString(8)),
            Arguments.arguments(arr[6], RandomUtil.randomString(8)),
            Arguments.arguments(arr[7], RandomUtil.randomString(8)),
            Arguments.arguments(arr[8], RandomUtil.randomString(8)),
            Arguments.arguments(arr[9], RandomUtil.randomString(8))
    );
}
@ParameterizedTest
@MethodSource(value = "methodParams")
void dynamicMethodParams(String email, String password){
    System.out.printf("email:%s<==>password:%s\n", email, password);
}
email:0150592006@qq.com<==>password:5knqh9nd
email:6506175266@qq.com<==>password:jndm1vx6
email:4815105218@qq.com<==>password:9e6yaky2
email:5072613647@qq.com<==>password:56vjv9ff
email:1471676761@qq.com<==>password:0uq2mx9r
email:0637284991@qq.com<==>password:k5xcauzb
email:8646939279@qq.com<==>password:q9zltwfd
email:7903224405@qq.com<==>password:wrgn7fxr
email:2771169159@qq.com<==>password:f3l255bc
email:8080867273@qq.com<==>password:mnpveuxj

軟件測試測試java程序,測試,自動化,java,selenium,junit

這里為了方便,就直接使用 Arguments 來替代

小技巧
如果數(shù)據(jù)源與測試方法同名,則無需執(zhí)行數(shù)據(jù)源是來自哪里的

// 動態(tài)參數(shù)
static Stream<Arguments> dynamicMethodParams(){
    // 構(gòu)造動態(tài)參數(shù)
    String[] arr = new String[10];
    for (int i = 0; i < arr.length; i++) {
        arr[i] = RandomUtil.randomNumbers(10)+"@qq.com";
    }
    return Stream.of(
            Arguments.arguments(arr[0], RandomUtil.randomString(8)),
            Arguments.arguments(arr[1], RandomUtil.randomString(8)),
            Arguments.arguments(arr[2], RandomUtil.randomString(8)),
            Arguments.arguments(arr[3], RandomUtil.randomString(8)),
            Arguments.arguments(arr[4], RandomUtil.randomString(8)),
            Arguments.arguments(arr[5], RandomUtil.randomString(8)),
            Arguments.arguments(arr[6], RandomUtil.randomString(8)),
            Arguments.arguments(arr[7], RandomUtil.randomString(8)),
            Arguments.arguments(arr[8], RandomUtil.randomString(8)),
            Arguments.arguments(arr[9], RandomUtil.randomString(8))
    );
}
@ParameterizedTest
@MethodSource// 自動尋找與方法名同名的數(shù)據(jù)源
void dynamicMethodParams(String email, String password){
    System.out.printf("email:%s<==>password:%s\n", email, password);
}
email:7264428849@qq.com<==>password:wewp75wh
email:4884099760@qq.com<==>password:q57n49kf
email:2779525807@qq.com<==>password:dkyfns0t
email:7260421546@qq.com<==>password:kfxow9gw
email:9750978471@qq.com<==>password:a5dwh5g4
email:7595861999@qq.com<==>password:g9gszroo
email:5860224630@qq.com<==>password:er521mby
email:7009711558@qq.com<==>password:qhftn0rh
email:9374899761@qq.com<==>password:zsjkkyns
email:6637232897@qq.com<==>password:fu8g79om

測試套件

指定類來運行測試用例

package TestSuite;

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

// 測試套件:通過 @Suite 注解
@Suite
@SelectClasses(value = {aaa.class, bbb.class})
public class runSuite {
}

測試套件測試 aaa.java, bbb.java, ccc.java 的測試結(jié)果,類下想要運行的用例必須要被 @Test 注解修飾
軟件測試測試java程序,測試,自動化,java,selenium,junit
@Suite 注解標識該類是測試套件類而不是測試類
@SelectClasses 部分源碼告知我們需要填上 class 類名
軟件測試測試java程序,測試,自動化,java,selenium,junit

指定包名來運行包下測試用例

package TestSuite;

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;

// 測試套件:通過 @Suite 注解
@Suite
//@SelectClasses(value = {aaa.class, bbb.class})
@SelectPackages("TestSuite")
public class runSuite {
}

發(fā)現(xiàn)連 ccc.java 的測試也打印輸出了
軟件測試測試java程序,測試,自動化,java,selenium,junit

最好是把要測試的文件以 xxxTest 結(jié)尾比較好,但是因為文件夾是 TestSuite的緣故,所以現(xiàn)在即使不是 xxxTest 結(jié)尾的包文件也能被掃描到并執(zhí)行 @Test 注解的方法,否則就會執(zhí)行報錯。

報錯問題如下所示
軟件測試測試java程序,測試,自動化,java,selenium,junit
解決方案如下所示
軟件測試測試java程序,測試,自動化,java,selenium,junit文章來源地址http://www.zghlxwxcb.cn/news/detail-800840.html

到了這里,關(guān)于軟件測試自動化Java篇【Selenium+Junit 5】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • 軟件測試 自動化測試selenium篇(一)

    軟件測試 自動化測試selenium篇(一)

    目錄 一、什么是自動化測試 ?單元測試 ?接口自動化 ?UI自動化 二、如何實施自動化測試 ?自動化測試需要了解的技能 三、selenium介紹 webdriver的工作原理: ?四、Selenium+Java環(huán)境搭建 ? ? ? ? ? ? ? ? ? ?驗證環(huán)境是否搭建成功 創(chuàng)建java項目,添加pom文件中添加依賴 常見問題

    2024年02月07日
    瀏覽(37)
  • 軟件測試 自動化測試selenium API

    軟件測試 自動化測試selenium API

    1.1.1 CSS 選擇器定位元素 CSS 選擇器 就是一個語法 瀏覽器 (ctrl + f)可以進行選擇 類選擇器:.class值(.s_ipt) id 選擇器:#id值(#kw) 父類選擇器 子類選擇器:父類選擇器表達式 子類選擇器表達式 標簽選擇器:標簽名(form) 1.1.2 XPath 定位元素 XPath 是一種在XML 文檔中定位元

    2024年04月28日
    瀏覽(34)
  • 【軟件測試】python+selenium自動化測試

    【軟件測試】python+selenium自動化測試

    一、什么是自動化測試 自動化測試指軟件測試的自動化,在預設狀態(tài)下運行應用程序或者系統(tǒng),預設條件包括正常和異常,最 后評估運行結(jié)果。將人為驅(qū)動的測試行為轉(zhuǎn)化為機器執(zhí)行的過程。 單元測試 java的單元測試框架是Junit,在這里不再贅述。 接口自動化 接口測試就是

    2023年04月09日
    瀏覽(34)
  • 軟件測試(五)自動化 selenium

    軟件測試(五)自動化 selenium

    自動化測試指軟件測試的自動化,在預設狀態(tài)下運行應用程序或者系統(tǒng),預設條件包括正常和異常,最后評估運行結(jié)果。將人為驅(qū)動的測試行為轉(zhuǎn)化為機器(代碼)執(zhí)行的過程。(簡單而言其實就是降低重復性的工作(大部分是Python)) 自動化測試的具體實現(xiàn),應該是包含下

    2024年02月08日
    瀏覽(31)
  • python+selenium自動化軟件測試 :多線程

    python+selenium自動化軟件測試 :多線程

    運行多個線程同時運行幾個不同的程序類似,但具有以下優(yōu)點: 進程內(nèi)共享多線程與主線程相同的數(shù)據(jù)空間,如果他們是獨立的進程,可以共享信息或互相溝通更容易. 線程有時稱為輕量級進程,他們并不需要多大的內(nèi)存開銷,他們關(guān)心的不是過程便宜. 一個線程都有一個開始

    2024年02月16日
    瀏覽(37)
  • 軟件測試/測試開發(fā)丨Selenium Web自動化測試基本操作

    本文為霍格沃茲測試開發(fā)學社學員學習筆記分享 原文鏈接:https://ceshiren.com/t/topic/26901 模擬功能測試中對瀏覽器的操作 get方法打開瀏覽器 refresh方法刷新頁面 用back方法回退到上一個界面 maximize_window方法使窗口最大化 minimize_window方法使窗口最小化 標簽: a 屬性:href 類屬性

    2024年02月10日
    瀏覽(30)
  • 軟件測試/測試開發(fā)丨Selenium Web自動化測試 高級控件交互方法

    本文為霍格沃茲測試開發(fā)學社學員學習筆記分享 原文鏈接:https://ceshiren.com/t/topic/27045 使用場景 對應事件 復制粘貼 鍵盤事件 拖動元素到某個位置 鼠標事件 鼠標懸停 鼠標事件 滾動到某個元素 滾動事件 使用觸控筆點擊 觸控筆事件(了解即可) https://www.selenium.dev/documentati

    2024年02月09日
    瀏覽(62)
  • 自動化測試工具Selenium的基本使用方法,軟件測試基礎

    自動化測試工具Selenium的基本使用方法,軟件測試基礎

    browser.find_element(By.ID,‘kw’).send_keys(“美女”) browser.find_element_by_id(‘kw’).send_keys(‘性感’) 2.通過標簽name屬性進行定位 browser.find_element_by_name(“wd”).send_keys(“Linux”) browser.find_element(By.NAME,‘wd’).send_keys(“美女”) 3.通過標簽名進行定位 browser.find_element_by_tag_name(“input”).

    2024年04月22日
    瀏覽(97)
  • 軟件測試/測試開發(fā)丨Selenium Web自動化多瀏覽器處理

    軟件測試/測試開發(fā)丨Selenium Web自動化多瀏覽器處理

    本文為霍格沃茲測試開發(fā)學社學員學習筆記分享 原文鏈接:https://ceshiren.com/t/topic/27185 用戶使用的瀏覽器(firefox,chrome,IE 等) web 應用應該能在任何瀏覽器上正常的工作,這樣能吸引更多的用戶來使用 是跨不同瀏覽器組合驗證網(wǎng)站或 web 應用程序功能的過程 是兼容性測試的一個

    2024年02月09日
    瀏覽(27)
  • 自動化測試:Selenium高級操作!,看完阿里P9大牛的“軟件測試成長筆記”我悟了

    自動化測試:Selenium高級操作!,看完阿里P9大牛的“軟件測試成長筆記”我悟了

    分享他們的經(jīng)驗,還會分享很多直播講座和技術(shù)沙龍 可以免費學習!劃重點!開源的!??! qq群號:110685036 Switch_to切換frame 如果元素在html的frame或iframe中,則無法直接定位到元素。需要先切換到該frame中,再進行定位及其他操作。 相關(guān)方法: driver.switch_to.frame(frame_reference)

    2024年04月25日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包