Docker에서 Selenium을 사용하여 원격 조작의 상태를 VNCViewer로 시각적으로 확인

Docker에서 Selenium을 사용하면 브라우저 자체와 해당 드라이버를 설치할 필요가 없어 쉽게 도입 및 폐기 할 수 있습니다.
그러나, 그대로라면 브라우저가 움직이는 모습이 보이지 않기 때문에, VNCViewer로 모습을 확인하는 방법을 아래에 나타낸다

전제


  • macOS Mojave 10.14.6
  • Docker Desktop 2.1.0.3
  • Node.js 10.15.0

  • 절차



    Selenium의 Chrome 노드 준비



    다음 파일에서 Selenium-Hub 및 Chrome 노드의 컨테이너 정의
    Chrome 노드는 Chrome 브라우저 1 프로세스를 지원하며 Selenium-Hub는 여러 노드를 제어합니다.
    이번에는 Chrome1 프로세스 만 사용하지만 여러 프로세스로 병렬 실행이 가능합니다.

    docker-compose.yml
    version: '3'
    
    services:
      hub:
        image: selenium/hub
        ports:
          - 4444:4444
      chrome:
        image: selenium/node-chrome-debug
        environment:
          - HUB_PORT_4444_TCP_ADDR=hub
          - HUB_PORT_4444_TCP_PORT=4444
        ports:
          - 5900:5900
        depends_on:
          - hub
    

    다음 명령으로 컨테이너를 시작하십시오.
    docker-compose up -d
    

    VNCViewer를 시작하고 Chrome 노드에 호스트 localhost, 비밀번호 secret로 연결
    VNCViewer는 여러 가지 존재하지만 여기에서는 RealVNCViewer

    Node.js 테스트 코드 작성



    다음으로 Node.js를 사용하여 Yahoo의 포털 사이트를 자동으로 조작하는 샘플 작성
    먼저 종속성 및 실행 명령을 정의하기 위해 다음 파일을 만듭니다.

    package.json
    {
      "main": "index.js",
      "scripts": {
        "test": "mocha index.js --timeout 10000"
      },
      "dependencies": {
        "mocha": "^6.2.0",
        "selenium-webdriver": "^4.0.0-alpha.4"
      }
    }
    

    실제 테스트 코드를 다음과 같이 작성합니다.

    index.js
    const webdriver = require("selenium-webdriver");
    const { Builder, By, until } = webdriver;
    
    const TIMEOUT_MILLISEC = 10000;
    
    let driver;
    
    describe("Yahooポータルサイト", () => {
      before(() => {
        driver = new Builder()
          .forBrowser("chrome")
          .usingServer("http://localhost:4444/wd/hub")
          .build();
      });
    
      after(() => {
        return driver.quit();
      });
    
      it("検索ボックスに入力する", async () => {
        await driver.get("https://www.yahoo.co.jp/");
    
        INPUT_XPATH =
          '//*[@id="wrapper"]/header/section[1]/div/form/fieldset/span/input';
        await driver.wait(
          until.elementLocated(By.xpath(INPUT_XPATH)),
          TIMEOUT_MILLISEC
        );
        await driver
          .findElement(By.xpath(INPUT_XPATH))
          .sendKeys("DockerでSeleniumを使う");
      });
    });
    

    다음 명령으로 종속성 설치
    npm install
    

    테스트 실행



    다음 명령으로 테스트 실행
    npm run test
    

    아래와 같이 브라우저가 자동으로 조작되는 모습을 볼 수 있다


    후처리



    종료시에는 컨테이너군을 삭제해 둔다.
    docker-compose down
    

    좋은 웹페이지 즐겨찾기