[JAVA #18] [Web Automation #18] Selenium Grid #1 [KR]

in SCT.암호화폐.Crypto4 years ago (edited)

redsjavahouse1591357_1280.jpg
image source: pixabay


예전에 TestNG의 병렬 테스트를 한 적 있다. 동일한 코드로 여러 브라우저를 컨트롤할 수 있는 TestNG의 막강한 기능이다. 다만 이 아이는 문제 하나가 존재하는데 바로 로컬 PC만 컨트롤 할 수 있다는 점이다. 즉 코드를 실행하는 PC의 브라우저만 가능하다. 나는 보통 윈도우를 쓰니 윈도우에 설치된 IE, Firefox, chrome 브라우저만 가능하다는 얘기다.

MAC OS의 safari에 적용하려면 코드를 모두 MAC에 옮겨서 실행하는 방법이 있기는 하지만 번거롭고 이 또한 확실한 방법이 되지 못한다. window와 mac을 동시에 컨트롤할 수 없으니 말이다.
이런 문제를 해결하고자 Selenium Grid가 나오게 된 듯 하다.

Selenium Grid는 hub와 node로 여러 기기의 각종 브라우저를 컨트롤 할 수 있다.
이 말인즉슨 windows IE/chrome, linux firefox, MAC safari를 동일한 코드로 동시에 실행할 수 있다.
QA에 있어서 아주 중요한 부분이므로 꼭 익혀야 하는 기술이다.

인터넷을 뒤져 보면 Grid에 관련된 글이 많으니 여기서는 간단하게 집고 넘어가겠다.

  • HUB - 간단하게 말해서 메인 코드를 실행하는 메인 컨트롤러라고 보면 된다. 코드가 실행되면 HUB에 연결된 각 NODE를 원격 제어하는 역할을 한다.
  • NODE - 각 기기 브라우저가 NODE가 된다. 브라우저 정보, Selenium Driver 정보를 포함하고 있고 HUB에 연결하여 사용된다.

그럼 먼저 hub를 설정해 보자.

  1. https://www.selenium.dev/downloads/ 에서 selenium server를 임의의 위치에 다운로드한다. (예: C:\selenium)
  2. cmd(혹은 터미널)에서 hub를 아래 코드로 실행할 수 있다.
    java -jar C:\selenium\selenium-server-standalone-3.141.59.jar -role hub
    (참고로 현재 hub를 실행한 PC는 Win10이다.)
    image.png
    브라우저에 http://localhost:4444/grid/console입력해서 아래 화면이 노출되면 hub 설정 성공.
    image.png
  3. 다음은 node 설정이다. 로컬 win10의 firefox와 MAC OS의 사파리 두개 브라우저를 셋팅해 보자.
    FireFox는 https://github.com/mozilla/geckodriver/releases 에서 geckodriver 최신 버전을 임의의 위치에 다운로드한 후 cmd(혹은 터미널)에서 아래처럼 실행한다.
    java -Dwebdriver.gecko.driver="C:\selenium\geckodriver.exe" -jar C:\selenium\selenium-server-standalone-3.141.59.jar -role webdriver -hub http://localhost:4444/grid/register
    실행 후 step2의 페이지를 새로고침하면 아래와 같이 노출되면 node 설정 성공이다.
    image.png
    safari도 비슷한 방법으로 설정할 수 있는데 1) https://www.selenium.dev/downloads/ 에서 selenium server 안정 버전을 MAC 임의의 위치에 다운로드한다. 2) 터미널에 java -jar /Users/june/Documents/selenium/selenium-server-standalone-3.141.59.jar -role webdriver -hub http://192.168.0.102:4444/grid/register로 실행한다.
    여기서 http://192.168.0.102는 hub PC의 IP가 되겠다. 실행 후 step2의 http://localhost:4444/grid/console 페이지 새로고침하면 노드가 하나 더 추가되는 것을 볼수 있다.
    image.png
    터미널 화면은 아래와 같다.
    image.png
  4. 이제 코드를 추가해 본다. @BeforeClass 메서드만 바꿔주면 될 것 같다. if문으로 firefox와 기타 브라우저를 분기 처리하고 각각 DesiredCapabilities 클래스 인스턴스를 생성한다.
    추가로 testNG 파일에 브라우저 갯수만큼 설정만 하면 끝.
    image.png
메인 코드:
package com.steem.webatuo;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;

public class Steemit_SeleniumGrid {
    WebDriver driver;
    String baseUrl = "https://steemit.com";
    
    @Parameters({"browser"})
    @BeforeClass
    public void SetUp(String browserName) throws Exception {
        if(browserName.contains("firefox")) {
            DesiredCapabilities capa  = new DesiredCapabilities().firefox();
            capa.setBrowserName("firefox");
            driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"),capa);
        }else {
           DesiredCapabilities capa  = new DesiredCapabilities().safari();
           capa.setBrowserName("safari");
           driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"),capa);
        }

            
        driver.get(baseUrl + "/@june0620/feed");
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    }
    @Test(description = "스팀잇에 글 쓰기 한다. ")
    public void CASE_03_Write() throws InterruptedException {
        // Click the write Button
        List<WebElement> writeBtns = driver.findElements(By.xpath("//a[@href='/submit.html']"));
        assertEquals(writeBtns.size(), 1, "글쓰기 버튼이 노출되는지 확인");
        for (WebElement writeBtn : writeBtns) {
            if (writeBtn.isDisplayed()) {
                writeBtn.click();
                Thread.sleep(2000);
                // type Text and Keys
                WebElement editor = driver.findElement(By.xpath("//textarea[@name='body']"));
                String keys = Keys.chord(Keys.LEFT_SHIFT, Keys.ENTER);
                editor.sendKeys("hello!! world", keys, "hello!!! STEEMIT", Keys.ENTER, "안녕, 스팀잇", Keys.ENTER, "你好!似提姆");
                break;
            }
        }
        Thread.sleep(5000);
    }
    @Test(description = "스티미언 검색", dataProvider = "steemians")
    public void CASE_04_Search(String name) {
        driver.get(baseUrl + "/@" + name);
        /*
         * Some actions
         */
    }
    @DataProvider(name = "steemians")
    public Object[][] members() {
        return new Object[][] {
            {"annepink"},
            {"gghite"},
            {"lucky2015"},
            {"honoru"},
            };
    }
    @AfterClass
    public void tearDownClass() {
        driver.quit();
    }
}
testNG.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="SteemitAutoTest" parallel="tests" thread-count="10">
    <test name="FireFox">
        <parameter name="browser" value="firefox" />
        <classes>
            <class name="com.steem.webatuo.Steemit_SeleniumGrid" />
        </classes>
    </test>
    <test name="Safari">
        <parameter name="browser" value="safari" />
        <classes>
            <class name="com.steem.webatuo.Steemit_SeleniumGrid" />
        </classes>
    </test>
</suite> (html comment removed:  Suite )

영상:


.
.
.
.
[Cookie 😅]
Seleniun java lib version: 3.141.59
java version: 13.0.1

참고로, safari를 제어하려면 브라우저 환경 설정 > 고급 > 메뉴 막대에서 개발자용 메뉴 보기 체크하면 좌상단 브라우저 메슈에 '개발자용' 메뉴가 노출된다. 그 메뉴 내 '원격 자동화 허용'을 체크해야 자동화 테스트 가능하다.

Sort:  

我来早了别人抢!我这又来晚了🤦‍♀️😂
还是给你拍手你更赚哈👏5⃣

不知道怎么了,tipu现在自动给我点赞了😂
为什么呢? 😄
多谢拍拍

自动了啊!那不是更好😍
也许tipu知道我念叨他显灵了么😂

这么说来我以后就没资格给你这边呼叫神龙了😂

真可惜不能接收你的礼物🎁

Coin Marketplace

STEEM 0.19
TRX 0.13
JST 0.030
BTC 63526.15
ETH 3387.82
USDT 1.00
SBD 2.56