자동 테스트를 위한 Selenium 및 Junit에 대한 자세한 설명

Google Chrome을 버전 111로 업그레이드한 후 Java 버전의 Selenium이 Chrome과 호환되지 않음

그래서 브라우저와 드라이버를 교체하고 엣지 브라우저와 엣지 드라이버를 사용합니다. 이 글은 크롬 브라우저 버전 111 이전에 작성되었기 때문에

ChromeDriver 드라이버 = new ChromeDriver(); 드라이버 개체를 생성하는 작업을 본 후 이 코드를 다음으로 교체하십시오.

EdgeOptions options = new EdgeOptions();
options.addArguments("-remote-allow-origins=*");
EdgeDriver driver = new EdgeDriver(options)
  • EdgeOptionsEdge 브라우저의 옵션을 설정하는 데 사용되는 클래스입니다.
  • options.addArguments("-remote-allow-origins=*")도메인 간 요청을 허용하도록 Edge 브라우저를 설정하는 옵션입니다. 즉, WebDriver와 브라우저가 서로 다른 도메인 간에 통신할 수 있도록 허용하는 것입니다.
  • EdgeOptions 개체를 사용하여 설정하지 않고는 이 작업을 수행할 방법이 없습니다. ChromeDriver는 설정할 유사 옵션이 없으므로 ChromeDriver driver = new ChromeDriver()를 직접 사용하여 드라이버 개체를 만들 수 있지만 버전이 호환되지 않으므로 Chrome이 필요하지 않습니다.

1. 자동화란?

역할: 자동화된 테스트를 통해 사람의 입력을 효과적으로 줄이면서 테스트의 품질과 효율성을 개선합니다.

개념: 자동 테스트는 소프트웨어 테스트의 자동화, 정상 및 비정상 조건을 포함하여 미리 설정된 상태에서 응용 프로그램 또는 시스템을 실행하고 최종적으로 실행 결과를 평가하는 것을 말합니다. 사람이 주도하는 테스트 동작을 기계 실행 프로세스로 변환

예를 들어 회귀 테스트 버전이 점점 더 많아지고 버전 회귀에 대한 압력이 증가하고 있으며 수동 테스트를 통해서만 모든 버전을 반환하는 것은 확실히 비현실적이므로 자동 테스트를 사용해야 합니다.

2. 자동 테스트의 분류

  1. 인터페이스 자동화 테스트
  2. UI 자동화 테스트(인터페이스 테스트)
  3. 모바일 자동화 테스트
  4. 웹 사이드 자동화 테스트

3. 셀레늄(웹 자동화 테스트 도구)

(1) 웹 자동화 테스트 도구로 셀레늄을 선택하십시오.

  1. 오픈 소스 무료
  2. Chrome, Firefox, IE 브라우저와 같은 여러 브라우저 지원...
  3. Linux, Windows, MacOs와 같은 여러 시스템 지원
  4. Java, Python, JavaScript와 같은 여러 언어 지원...
  5. Selenium 패키지는 테스트를 위한 많은 API를 제공합니다.

(2) 환경 전개

Selenium을 사용하여 웹 자동화 테스트를 구현하려는 경우 필요한 환경은 무엇입니까?

Chrome 브라우저, Google 드라이브(ChromeDriver), 셀레늄 툴킷

(3) 드라이버란?

수동 테스트의 경우 사람들이 수동으로 브라우저를 열면 드라이버가 사람이 됩니다.

자동화를 위해 코드는 브라우저를 직접 열 수 없으며 브라우저를 열려면 드라이버가 필요합니다.

셀레늄으로 작성된 자동화 스크립트는 어떻게 브라우저를 여는가(셀레늄 드라이버 브라우저와 셋의 관계)

[외부 링크 사진 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있습니다. 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-a7xMlbPA-1681625932504) typora-user-images\ 1673750214137.png)]

드라이버는 셀레늄 스크립트에서 보낸 http 요청을 수락하고 이를 구문 분석해야 합니다.

4. 간단한 자동화 예제

Maven 프로젝트 생성 및 셀레늄 패키지 가져오기

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.0.0</version>
    </dependency>
</dependencies>

간단한 자동화 예제는 주로 5단계로 구성됩니다.

  1. 드라이버 인스턴스 생성, 세션 생성(ChromeDriver 개체 인스턴스화)
  2. 방문사이트(object.get("웹사이트"))
  3. 요소 찾기(object.findElement(By.cssSelector("#url 요소 id")).sendKeys("내용 입력"))
  4. 작업 요소(object.findElement(By.cssSelector("#URL 요소 id")).click())
  5. 세션 종료(object.quit())
package com.autotest0113;

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

import java.util.List;

public class FirstAutotest {
    
    
    // 在百度网址搜索关键词 “胡歌”
    public void huge() throws InterruptedException {
    
    
        // 1.打开浏览器
        ChromeDriver chromeDriver = new ChromeDriver();
        Thread.sleep(3000);
        // 2.在浏览器里输入百度网址,访问百度首页
        chromeDriver.get("https://www.baidu.com");
        Thread.sleep(3000);
        // 3.找到百度首页输入框元素,并输入关键词 “胡歌”
        chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("胡歌");
        Thread.sleep(3000);
        // 4.找到百度首页 “百度一下” 按钮,并点击一下
        chromeDriver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        // 5.结束会话(关闭浏览器)
        chromeDriver.quit();
    }
}
package com.autotest0113;

import sun.text.normalizer.CharTrie;

public class RunAutoTest {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        FirstAutotest firstAutotest = new FirstAutotest();
        firstAutotest.huge();
    }
}

5. 셀레늄의 일반적인 방법

5.1 페이지 요소 찾기 findElement()

매개변수: 클래스별(요소를 찾는 방법 제공)

반환 값: webElemen

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-3CMF6yKn-1681625784105) typora-user-images\ 1673751728162.png)]

페이지에서 요소를 찾을 수 있으면 프로그램이 정상적으로 종료됩니다.

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-fxMItxKL-1681625784106) typora-user-images\ 1673751423117.png)]

페이지에서 요소를 찾을 수 없으면 프로그램에서 오류를 실행합니다.

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다(img-AJYyQUEW-1681625784106) (C:\Users\28463\AppData\Roaming\Typora\ typora-user-images\ 1673751541380.png)]

findElements() 메소드

매개변수: 클래스별(요소를 찾는 방법 제공)

반환 값: 목록

public void methodTest() {
    
    
    ChromeDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");
    driver.findElement(By.cssSelector("#kw"));
    List<WebElement> elements= driver.findElements(By.className("hotsearch-item"));
    for (WebElement element : elements) {
    
    
        System.out.println(element.getText());
    }

    driver.findElement(By.cssSelector("#su"));
    driver.quit();
}

5.2 클래스별 요소 위치 지정

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-pO6Lng9k-1681625784108) typora-user-images\ 1673752409013.png)]

5.3 xpath 경로 언어

문법:

계층 구조: /sublevel// 스킵 레벨

속성:@

기능: 포함()...

자동화에서 요소의 위치 지정은 고유해야 하지만 페이지의 선택기 또는 경로 요소를 수동으로 복사하는 것이 반드시 고유한 것은 아니며 고유하도록 수동으로 수정해야 합니다.

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-q6meK5YM-1681625784109) \typora-user-images\ 1673753096032.png)]

[외부 링크 사진 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-B4LcN68A-1681625784110) typora-사용자-이미지\ 1673753516762.png)]

6. 공통 요소 연산

6.1 입력 텍스트 sendKeys

sendKeys, 편집 가능한 콘텐츠가 있는 텍스트 필드 및 요소에만 해당

 // 找到百度搜索框
 WebElement ele = driver.findElement(By.cssSelector("#kw"));
// 在输入框输入文本
ele.sendKeys("qq音乐");

// 找到百度搜索框并输入文本
// driver.findElement(By.cssSelector("#kw")).sendKeys("qq音乐");

6.2 클릭 클릭

// 3.找到百度搜索框并输入文本
driver.findElement(By.cssSelector("#kw")).sendKeys("qq音乐");

6.3 제출 제출(엔터 키로 제출)

제출은 양식 요소에만 적용되며 셀레늄은 공식적으로 제출을 권장하지 않으며 클릭이 더 권장됩니다.

// 找到百度搜索框并输入文本
driver.findElement(By.cssSelector("#kw")).sendKeys("qq音乐");
// 找到百度一下通过回车键进行提交
driver.findElement(By.cssSelector("#su")).submit();

6.4 요청 클리어

clear: 입력을 반복할 수 있는지 여부를 자주 테스트하는 데 적합합니다.

// 清除输入框的内容
driver.findElement(By.cssSelector("#kw")).clear();

6.5 getText 텍스트 가져오기

// 获取文本
String text = driver.findElement(By.cssSelector("#s-top-left > div > a")).getText();
System.out.println("获取到的文本:" + text);

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-5VrcD6yu-1681625784110) \typora-user-images\ 1675913113054.png)]

6.6 속성 getAttribute에 해당하는 값 가져오기

// 获取属性的值
String buttonText = driver.findElement(By.cssSelector("#su")).getAttribute("type");
System.out.println("获取到的属性名:" + buttonText);
String buttonText1 = driver.findElement(By.cssSelector("#su")).getAttribute("id");
System.out.println("获取到的属性名:" + buttonText1);
String buttonText2 = driver.findElement(By.cssSelector("#su")).getAttribute("value");
System.out.println("获取到的属性名:" + buttonText2);

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-7234Ct0O-1681625784111) typora-user-images\ 1675913097007.png)]

6.7 페이지의 제목과 URL 얻기

System.out.println(driver.getTitle());
System.out.println(driver.getCurrentUrl());
driver.findElement(By.cssSelector("#kw")).sendKeys("你好");
driver.findElement(By.cssSelector("#su")).click();
System.out.println(driver.getTitle());
System.out.println(driver.getCurrentUrl());

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-aYOQ59T5-1681625784112) \typora-user-images\ 1677659438770.png)]

7. 창문

7.1 창 크기 설정(manage().window())

최대화, 최소화, 전체 화면 창, 창 크기 수동 설정

public void windowConTrol() throws InterruptedException {
    
    
    Thread.sleep(3000);
    // 窗口最大化
    driver.manage().window().maximize();
    Thread.sleep(3000);
    // 窗口最小化
    driver.manage().window().minimize();
    Thread.sleep(3000);
    // 全屏
    driver.manage().window().fullscreen();
    Thread.sleep(3000);
    // 手动设置窗口大小
    driver.manage().window().setSize(new Dimension(1024,768));
    Thread.sleep(2000);
    
    driver.quit();
}

7.2 창 전환

Baidu 홈페이지를 열고 사진 하이퍼링크를 클릭하여 Baidu 사진 홈페이지에 들어가면 Baidu 사진 페이지에서 "Baidu 클릭" 버튼을 얻을 수 있습니다.

	public void windowConTrol() throws InterruptedException, IOException {
    
     
		// 窗口切换
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();
        Thread.sleep(3000);
        driver.findElement(By.cssSelector("#homeSearchForm > span.s_btn_wr > input"));
        driver.quit();
	}

결과는 오류입니다. 페이지 요소를 찾을 수 없습니다.

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-mAX8YaqV-1681625784112) \typora-user-images\ 1675931056472.png)]

이는 브라우저가 탭을 열 때마다 핸들 이라고 하는 각 탭을 자동으로 식별하기 때문입니다.

getWindowHandles()를 통해 모든 탭 페이지의 핸들 Set을 가져온 다음 getWindowHandle()을 통해 현재 페이지의 핸들을 가져온 다음 모든 탭 페이지의 핸들을 탐색할 수 있습니다. traversal Set의 핸들, 창 전환을 위한 switchTo( ).window() 메서드 전달

    public void windowConTrol() throws InterruptedException, IOException {
    
    
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();
        Thread.sleep(3000);
        // 获取当前页面的句柄
        String curHandle = driver.getWindowHandle();
        System.out.println("当前页面的句柄:" + curHandle);
        // 获取所有标签的句柄
        Set<String> handles =  driver.getWindowHandles();
        for (String handle : handles) {
    
    
            if(handle != curHandle) {
    
    
                driver.switchTo().window(handle);
            }
        }
        driver.findElement(By.cssSelector("#homeSearchForm > span.s_btn_wr > input"));
        Thread.sleep(3000);
        driver.quit();
    }

여러 개의 창이 열려 있을 때 어떻게 전환합니까?

기본적으로 자동화에는 이러한 시나리오가 없으므로 여기에서 너무 많이 생각할 필요가 없습니다.

8. 스크린샷 getScreenshotAs

여기에서 pom.xml의 스크린샷 파일에 필요한 패키지를 소개해야 합니다.

    <!-- 保存屏幕截图文件需要用到的包-->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

한 가지 주의할 점은 결과 페이지의 요소를 찾기 위해 코드가 실행될 때 페이지가 완전히 로드되지 않은 상태이며 이때 프로그램 실행 속도가 페이지 렌더링 속도보다 빠르므로 대기 추가에 주의해야 합니다. 코드의 메커니즘 페이지를 먼저 렌더링한 다음 스크린샷을 찍습니다.

    public void windowConTrol() throws InterruptedException, IOException {
    
    
        // 屏幕截图
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("网易云音乐");
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        // 屏幕截图(保存现场)
        File srcfile = driver.getScreenshotAs(OutputType.FILE);
        // 把屏幕截图好的文件放到指定的路径下
        String filename = "my.png";
        FileUtils.copyFile(srcfile,new File(filename));
        driver.findElement(By.cssSelector("#content_left"));
        driver.quit();
    }

여기에서 내 코드 파일의 이름은 고정된 형식이며 프로그램에서 생성한 이미지 파일을 여러 번 실행하면 같은 이름으로 덮어쓰게 되므로 파일 이름에 동적 데이터(타임스탬프)가 추가될 수 있습니다.

9. 기다려

프로그램의 실행 속도는 브라우저의 렌더링 속도보다 훨씬 빠릅니다.

네 종류의 대기: 필수 대기, 암시적 대기, 명시적 대기 , 순조로운 대기

참고: 명시적 대기와 암시적 대기는 동시에 사용할 수 없으며, 동시에 사용할 경우 예기치 않은 대기 결과가 발생할 수 있습니다.

9.1 강제 대기

8. 스크린샷을 찍을 때 스크린샷을 찍기 전에 페이지가 완전히 렌더링되도록 하려면 중간에 3초를 기다립니다(Thread.sleep())

이로 인해 프로그램이 .이 방법은 자동 테스트에 사용되지만 많이 사용되지는 않습니다.

각각의 자동화 방법은 자동화된 테스트 케이스로, 예를 들어 하나의 테스트 케이스는 10초, 100개의 테스트 케이스는 1000초, 200개의 테스트 케이스는 2000초가 걸립니다.

9.2 암시적 대기

암시적 대기는 드라이버의 전체 수명 주기에 작용합니다.

암시적 대기는 요소가 존재하는지 여부를 결정하기 위해 계속 폴링하고, 그렇지 않은 경우 요소를 찾을 수 있을 때까지 폴링을 계속하기 위해 설정된 시간 동안 기다립니다.

public class autoTest {
    
    
    ChromeDriver driver = new ChromeDriver();
    public void waitContro() {
    
    
        // 添加隐式等待
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        driver.findElement(By.cssSelector("#su")).click();
        driver.findElement(By.cssSelector("#content_left"));
        driver.quit();
    }
}

9.3 대기 표시

public class autoTest {
    
    

    ChromeDriver driver = new ChromeDriver();
    public void webDriverWait() {
    
    
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        driver.findElement(By.cssSelector("#su")).click();
        // 添加显示等待
        new WebDriverWait(driver,Duration.ofSeconds(5)).until(driver->driver.findElement(By.cssSelector("#content_left")));
        driver.quit();
    }
}

10. 브라우저 탐색 탐색

브라우저 앞으로(forward), 뒤로(back), 새로 고침(refresh)

public class autoTest {
    
    
    ChromeDriver driver = new ChromeDriver();
    // 浏览器导航
    public void navigateConTrol() {
    
    
        driver.get("https://www.baidu.com");
//        driver.navigate().to("https://www.baidu.com");
        // 想要回退到访问百度网址之前的状态
        driver.navigate().back();
        // 前进 进入到百度首页
        driver.navigate().forward();
        // 刷新百度首页
        driver.navigate().refresh();
        driver.quit();
    }
}

11. 팝업창

팝업 유형: 경고 팝업, 확인 팝업, 프롬프트 팝업

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-SnxcZflR-1681625784113) typora-사용자-이미지\ 1677663831186.png)]

팝업 처리 단계:

  1. 드라이버 개체를 팝업 창에 적용(팝업 창으로 전환) driver.switchTo.alert()
  2. accept() / cancel cancel()을 확인하려면 선택하십시오(프롬프트 팝업 창 입력 텍스트 sendkeys는 페이지에서 입력 텍스트의 실행 효과를 볼 수 없음 ).

경고 팝업에는 확인 버튼만 있지만 수락과 해제 모두 처리할 수 있습니다.

경고 팝업 창과 확인 팝업 창 모두 텍스트를 입력할 수 있는 위치가 없지만 alert.sendKeys 코드를 실행하려는 경우 오류를 보고하지 않습니다.

ChromeDriver chromeDriver = new ChromeDriver();
// 提示弹窗
void Alertcontro() throws InterruptedException {
    
    
    chromeDriver.get("file:///D:/%E6%8F%90%E7%A4%BA%E5%BC%B9%E7%AA%97.html");
    Thread.sleep(3000);
    // 打开弹窗
    chromeDriver.findElement(By.cssSelector("body > input[type=button]")).click();
    Thread.sleep(3000);
    // 切换到弹窗进行弹窗处理
    Alert alert = chromeDriver.switchTo().alert();
    Thread.sleep(3000);
    // 1. 输入
    alert.sendKeys("666");
    Thread.sleep(3000);
    // 2. 点击确认
    alert.accept();
    Thread.sleep(3000);
    // 取消
    alert.dismiss();
    chromeDriver.quit();
}

12. 선택 상자 선택

옵션 선택 방법: 텍스트로 선택(selectByVisibleText), 속성 값으로 선택(selectByValue), 일련 번호로 선택(selectByIndex)

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-PLExhyww-1681625784115) \typora-user-images\ 1677666804934.png)]

ChromeDriver chromeDriver = new ChromeDriver(); 
void selectControll() throws InterruptedException {
    
    
        chromeDriver.get("file:///D:/%E9%80%89%E6%8B%A9%E6%A1%86.html");
        WebElement ele = chromeDriver.findElement(By.cssSelector("#ShippingMethod"));
        Thread.sleep(2000);
        // 先创建选择框对象
        Select select = new Select(ele);
        Thread.sleep(2000);
        // 根据文本来选择
//        select.selectByVisibleText("333");
        // 根据属性值选择
//        select.selectByValue("222");
        // 根据序号选择【序号从 0 开始】
        select.selectByIndex(3);
        Thread.sleep(2000);
        chromeDriver.quit();
    }

13. executeScript 스크립트 실행

executeScript(매개변수: JS)

ChromeDriver chromeDriver = new ChromeDriver();
void scriptControll() throws InterruptedException {
    
    
    chromeDriver.get("https://image.baidu.com/");
    Thread.sleep(3000);
    // 执行 JS 命令:让页面置顶/置底
    chromeDriver.executeScript("document.documentElement.scrollTop=500");
    Thread.sleep(3000);
    chromeDriver.executeScript("document.documentElement.scrollTop=0");
    Thread.sleep(3000);
    chromeDriver.quit();
}

// 也可以通过 JS 代码来操作在输入框中搜索
void scriptControll() throws InterruptedException {
    
    
     chromeDriver.get("https://www.baidu.com");
     // 找到百度搜索框,输入 “迪丽热巴”
     chromeDriver.executeScript("var ss = document.querySelector(\"#kw\");ss.value = '迪丽热巴';");
     Thread.sleep(3000);
     chromeDriver.quit();
}

14. 파일 업로드

ChromeDriver driver = new ChromeDriver();
// 文件上传
void fileUploadControll() throws InterruptedException {
    
    
    driver.get("file:///D:/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0.html");
    driver.findElement(By.cssSelector("#avatar")).sendKeys("D:\\微信图片_20230212212832.jpg");
    Thread.sleep(3000);
    driver.quit();
}

[외부 링크 사진 전송 실패, 원본 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것을 권장합니다. (img-KiaCGl5m-1681625784115) \typora-user-images\ 1677810737509.png)]

15. 브라우저 매개변수 설정 ChromeOptions

헤드리스 모드: 실제 작업에서 테스터는 자동 실행을 위해 머신에 자동화를 배포합니다.테스터는 테스트 프로세스를 볼 수 없지만 자동 실행 결과를 직접 볼 수 있습니다.

헤드 모드: 프로그램이 자동으로 테스트 중이며 테스트 실행 프로세스 인터페이스를 볼 수 있습니다.

브라우저 객체를 생성하기 전에 브라우저의 매개변수를 설정해야 합니다.

void paramsControll() {
    
    
    // 先创建选项对象,然后再设置浏览器参数
    ChromeOptions options = new ChromeOptions();
    options.addArguments("-headless");
    // 百度搜索迪丽热巴
    ChromeDriver driver = new ChromeDriver(options);
    driver.get("https://www.baidu.com");
    driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
    driver.findElement(By.cssSelector("#su")).click();
    driver.quit();
}

16. 단위 테스트 도구 Junit

자동화는 셀레늄 스크립트로 구현되며, junit은 자바용 단위 테스트 도구이지만 자동화 구현 시 junit 라이브러리(junit5)에서 제공하는 일부 주석을 차용해야 합니다.

<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-suite</artifactId>
    <version>1.8.2</version>
    <scope>test</scope>
</dependency>

@Test(테스트 메소드), @BeforeEach(각 테스트 케이스 이전에 한 번 실행), @BeforeAll(모든 테스트 케이스 이전에 한 번 실행), @AfterEach(각 테스트 케이스 이후 한 번 실행), @AfterAll(모든 테스트 케이스 이후에 한 번 실행) )

그리고 BeforeAll 및 AfterAll 주석이 달린 메서드는 정적 메서드여야 합니다.

(1) 비고

주석 기능은 junit에서 제공됩니다.

@Test는 메소드가 테스트 메소드임을 나타내며, 현재 클래스가 실행되면 이 클래스 아래에 @Test로 주석이 달린 모든 사용 사례가 자동으로 실행됩니다.

public class junitTest {
    
    
    @Test
    void bbb() {
    
     System.out.println("bbbb");}
    @Test
    void ccc() {
    
     System.out.println("cccc");}
}

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-FKPKNljW-1681625784116) typora-user-images\ 1676107787749.png)]

@BeforeEach는 각 사용 사례가 실행되기 전에 현재 메서드를 실행해야 함을 나타냅니다.

public class junitTest {
    
    
    @BeforeEach
    void aaa() {
    
    System.out.println("aaaa");}
    
    @Test
    void bbb() {
    
    System.out.println("bbbb");}

    @Test
    void ccc() {
    
    System.out.println("cccc");}
}

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-75ZNi6mX-1681625784117) \typora-user-images\ 1676107758523.png)]

@BeforeAll 현재 메소드는 현재 클래스 아래의 모든 유스케이스 이전에 실행되어야 하며, 이 어노테이션에 의해 수정된 메소드는 정적 메소드여야 합니다.

public class junitTest {
    
    
    @BeforeAll
    static void aaa() {
    
    System.out.println("aaaa");}
    
    @Test
    void bbb() {
    
    System.out.println("bbbb");}

    @Test
    void ccc() {
    
    System.out.println("cccc");}
}

[외부 링크 사진 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-aPcLVZDd-1681625784117) typora-사용자-이미지\ 1676107976344.png)]

@AfterEach는 각 사용 사례가 실행된 후 한 번 실행됩니다.

public class junitTest {
    
    
    @AfterEach
    void aaa() {
    
    System.out.println("aaaa");}
    
    @Test
    void bbb() {
    
    System.out.println("bbbb");}

    @Test
    void ccc() {
    
    System.out.println("cccc");}
}

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-7tOrgOg1-1681625784118) typora-사용자-이미지\ 1676108056007.png)]

@결국

public class junitTest {
    
    
    @AfterAll
    static void aaa() {
    
    System.out.println("aaaa");}
    
    @Test
    void bbb() {
    
    System.out.println("bbbb");}

    @Test
    void ccc() {
    
    System.out.println("cccc");}
}

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-7AmenVlV-1681625784120) \typora-user-images\ 1676108097252.png)]

16.1 Junit의 실행 순서

두 코드의 실행 순서에 주의

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-34ugmF0R-1681625784121) \typora-user-images\ 1677814648215.png)]

테스트 케이스의 실행은 테스트 케이스를 작성한 순서대로 실행되지 않으므로 몇 가지 문제가 있음을 알 수 있습니다.

예를 들어 블로그의 로그인 시스템에 대한 테스트 사례를 작성합니다. 사용 사례는 다음과 같습니다.

  1. 로그인 페이지가 제대로 표시되는지 확인
  2. 정상 로그인 확인(블로그 홈페이지/목록 페이지로 이동)
  3. 비정상적인 로그인

실행 순서의 문제로 인해 예를 들어 2단계를 먼저 실행한 다음 이 때 로그인이 성공하고 페이지가 점프한 다음 1단계를 실행한 후 오류가 보고됩니다.

1. 주문 주석으로 정렬

  • 먼저 주석을 사용하여 현재 클래스 아래의 모든 사용 사례는 주문 주석을 사용하여 정렬해야 하며 주석은 클래스에서 사용해야 함을 설명합니다.
  • 그런 다음 Order를 사용하여 특정 실행 순서를 지정합니다.

[외부 링크 사진 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있습니다. 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-dnAd5Ler-1681625784121) typora-user-images\ 1678190744599.png)]

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
    
    
    @Test
    @Order(1)
    void ediloginTest() {
    
    
        System.out.println("loginTest");
    }

    @Test
    @Order(2)
    void AindexTest() {
    
    
        System.out.println("indexTest");
    }
    
    @Test
    @Order(3)
    void editTest() {
    
    
        System.out.println("editTest");
    }
}

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-NqwWttF1-1681625784122) \typora-user-images\ 1678190295598.png)]

16.2 매개변수화

가능한 한 하나의 사용 사례와 여러 매개변수 세트를 통해 사용자 행동을 시뮬레이션합니다.

단일 매개변수:

@ParameterzedTest + @ValueSource(데이터 유형 메서드/더하기 s = {parameter1,parameter2,parameter3,...})

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-Vk7D0aFe-1681625784123) typora-user-images\ 1678191635490.png)]

여러 매개변수:

@parameterizedTest + @CsvSource({"", "", '", ...}) 각 큰따옴표는 테스트 사례 집합입니다.

@ParameterizedTest
@CsvSource({
    
    "张三,22","李四,25","王五,35"})
void muchParamsTest(String name,int age) {
    
    
    System.out.println("name: " + name + ",age: " + age);
}

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-mc6tOC6D-1681625784123) typora-user-images\ 1678192053809.png)]

다중 매개변수(타사 csv 파일에서 데이터 소스 읽기)

@ParameterizedTest + @CsvFileSource(파일 = "파일 경로 + 이름")

여기서 csv 파일의 경우 접미사를 직접 변경하여 생성하지 말고 시스템과 함께 제공되는 Excel 도구를 사용하여 csv 파일을 열고 편집하십시오.

@ParameterizedTest
@CsvFileSource(files = "D:\\mycsv.csv")
void csvfileParamsTest(String name, int age) {
    
    
    System.out.println("name: " + name + ",age: " + age);
}

[외부 링크 사진 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-NHpxTQgn-1681625784123) typora-사용자-이미지\ 1678193821094.png)]

driver.navigate().back();

이는 브라우저의 뒤로 버튼을 시뮬레이트하여 현재 페이지가 이전 페이지로 돌아가도록 합니다. 이 방법은 테스트에 사용할 수 있습니다. 예를 들어 테스트 프로세스 중에 특정 작업을 다시 실행하거나 특정 정보를 확인하려면 이전 페이지로 돌아가야 합니다.

동적 매개변수 방법

// 通过动态方法来提供数据源
@ParameterizedTest
@MethodSource("methodParams")
void dynamicMethodParamsTest(String name,int age) {
    
    
    System.out.println("name: " + name + ",age: " + age);
}
static Stream<Arguments> methodParams() throws InterruptedException {
    
    
    // 构造动态参数
    String[] arr = new String[5];
    for (int i = 0; i < arr.length; i++) {
    
    
        Thread.sleep(500);
        arr[i] = System.currentTimeMillis() + "";
    }
    return Stream.of(
            Arguments.arguments(arr[0],20),
            Arguments.arguments(arr[1],20),
            Arguments.arguments(arr[2],20),
            Arguments.arguments(arr[3],20),
            Arguments.arguments(arr[4],20)
    );
}

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-A4Iv1Jnb-1681625784124) \typora-user-images\ 1678195006408.png)]

[외부 링크 사진 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-QshfXEiA-1681625784125) typora-user-images\ 1678195189267.png)]

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-IWoyEzkI-1681625784125) \typora-user-images\ 1678195447837.png)]

16.3 테스트 스위트

3개의 클래스를 생성하고 각 클래스에 @Test 테스트 주석을 추가합니다.테스트하고 실행하려면 한 번에 하나의 클래스만 실행할 수 있으며 동시에 3개의 클래스를 실행할 수 없습니다.

따라서 테스트 도구 모음을 사용하여 동시에 여러 테스트 클래스를 실행할 수 있습니다.

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-ot48ktbx-1681625784126) typora-user-images\ 1678195913441.png)]

클래스를 만들고 @Suite 주석을 통해 테스트 스위트 클래스(테스트 클래스가 아님)로 식별합니다.

  1. 유스 케이스를 실행할 클래스 지정 (매개변수화된 유스 케이스를 제외하고 실행할 유스 케이스는 @Test로 주석 처리되어야 함)
/**
 * @Description: 测试套件
 * @Date 2023/3/7 21:29
 */
@Suite
@SelectClasses({
    
    aaa.class,bbb.class,ccc.class})
public class runSuite {
    
    
}

프로그램을 실행하여 확인

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-03cQdssN-1681625784126) typora-user-images\ 1678196064853.png)]

  1. 실행할 패키지 이름을 지정합니다. (첫 번째 방법, 클래스가 너무 많으면 적합하지 않습니다. 패키지를 지정할 수 있습니다.)

[외부 링크 사진 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-g1lLvtDL-1681625784127) typora-사용자-이미지\ 1678196566092.png)]

@Suite
@SelectPackages("com.autoTest0303")
public class runSuite {
    
    
}

17. 단언 Assertions

어설션은 assertEquals와 일치하고 어설션은 assertNotEquals와 일치하지 않습니다.

@Test
void huixiang() {
    
    
    ChromeDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");
    String text = driver.findElement(By.cssSelector("#su")).getAttribute("value");//百度一下
    // 假如这里获取的属性不是百度一下,而是百度两下
    System.out.println(text);
    Assertions.assertEquals("百度两下",text);
    driver.quit();
}

[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다. (img-gYTafCz7-1681625784140) \typora-user-images\ 1676108848359.png)]

어설션 결과는 true assertTrue이고 어설션 결과는 false assertFalse입니다.

@Test
void ddd() {
    
    
    Assertions.assertTrue(1==1);//正确
}
@Test
void eee() {
    
    
    Assertions.assertFalse(1==1);//报错
}
@Test
void fff() {
    
    
    Assertions.assertFalse(1==0);//正确
}

어설션 구조가 비어 있는 assertNull이고 어설션 결과가 비어 있지 않습니다. assertNotNull

@Test
void ggg() {
    
    
    String aaa = null;
    Assertions.assertNull(aaa);//通过
}
@Test
void hhh() {
    
    
    Assertions.assertNotNull("你好");//通过
}

Supongo que te gusta

Origin blog.csdn.net/m0_58761900/article/details/130182123
Recomendado
Clasificación