2016-10-07 4 views
1

셀레늄 WebDriver와 geckodriver를 자바로 사용하여 웹 자동화 도구를 작성했습니다. 현재 작업을 실행할 때마다 새 FirefoxDriver 객체가 인스턴스화됩니다.Java에서 "Selenium driver pool"을 구현하는 올바른 방법은 무엇입니까?

이제 멀티 스레딩을 구현하고 싶습니다. 첫 번째 접근법은 고정 크기 풀과 같은 것을 구축하는 것입니다. 실행시 X FirefoxDriver 객체를 인스턴스화하고 "inUse"플래그가있는 객체로 래핑하고 싱글 톤을 사용하여 이러한 인스턴스를 관리합니다.

하지만 이것은 적절한 해결책입니까? 이것은 내 첫 번째 Selenium 프로젝트이며 전체 개념은 새로운 것입니다. 며칠 동안 인터넷 검색 및 문서를 읽은 후 그 질문에 대한 답을 찾을 수 없었습니다. 나는 정말로 당신의 도움에 감사 할 것입니다!

+1

TestNG와 같은 것을 사용하고 풀을 관리하도록 고려 했습니까? 설정을 사용하면 허용되는 스레드 수 등을 제한 할 수 있습니다. – JeffC

+0

아직 고려하지 않았습니다. 힌트를 보내 주셔서 감사합니다! 나는 미래의 웹 자동화 작업을 위해 이것을 조사 할 것이다. – saxum

답변

1

이렇게 풀을 만드는 것이 합리적입니다. 나 자신의 풀을 작성하는 대신 고전 Commons Pool 또는 최신 spf4j 풀과 같은 기존 일반 풀을 사용하는 것이 좋습니다.

풀을 사용하려면 사용 후 풀에서 드라이버 코드를 안정적으로 반환해야합니다. 그렇지 않으면 드라이버가 누출되므로 전체 브라우저 인스턴스가 누출됩니다.

따라서, 나는 각 스레드에 드라이버를 할당하는 다른 접근법을 고려할 것입니다. 당신은 ThreadLocal 사용하여이 작업을 수행 할 수 있습니다

private ThreadLocal<WebDriver> drivers = new ThreadLocal<WebDriver>() { 
    @Override 
    protected WebDriver initialValue() { 
     return new FirefoxDriver(); // or whatever 
    } 

    @Override 
    public void remove() { 
     WebDriver driver = get(); 
     if (driver != null) driver.close(); 
     super.remove(); 
    } 

    @Override 
    public void set(WebDriver value) { 
     throw new UnsupportedOperationException(); 
    } 
}; 

하지만 스레드가있어 ThreadLocal에서 자신의 가치를 제거하지 않고 죽을 경우에만 드라이버를 누설하는 것은 여전히 ​​가능하다. 재사용 할 수있는 고정 된 풀 풀이 있다면 잘 될 것입니다.

이 접근법의 단점은 드라이버를 사용해온 모든 스레드에 대해 드라이버를 사용하는 것이 아니라 모든 스레드가 동시에 드라이버를 사용하고있는 경우에도 마찬가지입니다. 드라이버 사용에 전념하는 스레드 풀이 있고 그 밖의 작업을 수행하지 않으면 심각한 문제가되지 않습니다. 그러나 많은 종류의 작업을 수행하는 스레드 풀이 있다면 그렇게 될 것입니다.

+0

하지만이 방법으로 만들어진 브라우저 창은 재활용되지 않을 것입니다. 창을 만든 후에 다시 사용하면 시간이 많이 절약됩니다. – saxum

+0

Executors.newFixedThreadPool (n) 대신 ThreadLocal 접근법을 사용하고 제출 된 스레드 내에 WebDriver를 생성하는 것이 유리합니까? – saxum

+0

@saxum 각 스레드가 여러 테스트를 실행하고 드라이버 및 브라우저가 다시 사용되는 한. 이를 실현하기 위해 이것을 집행자와 결합해야합니다. –

관련 문제