2016-12-31 5 views
0

웹 사이트에서 사용자 계정을 신속하게 생성하기 위해 Selenium과 함께 실행되는 메소드가 있습니다. 현재 하나씩 처리하지만, 한 번에 10을 처리하면 더 좋을 것이라고 생각합니다.for concurrency for for 루프

현재 코드를 알려주는 for 루프, 내 2D 배열의 어느 행에서 사용자 정보를 읽을 지 알려주고 있습니다. 스트림이나 스레드가 올바른 값을 사용하고 올바른 사용자 정보를 가져 오는 방법 개념에 어려움을 겪고 있습니다. 나는 새 페이지와 드라이버마다이 루프를로드해야하고 웹 필드에 배열의 값을 보낼 필요가

:

현재 나는 아래의 단순화 비슷한 있습니다. 그래서 기본적으로이 작업을 중단하고 반복하고 다음 루프를 시작하기 전에 첫 번째 루프가 완료 될 때까지 기다리지 말고 한 번에 10 개까지만 실행하도록 제한하려고합니다.

for(i=0,i<myarray.length, i++) 
{ 
     Webdriver.start(); 
     WebElement.findby.(By.name("field1").sendkeys(myArray[i][2]); 
     Webdriver.end(); 
} 

제가 코드는 실제 코드가 아니며 단지 내 질문을 전달하는 것입니다.

희망은 분명합니다.

답변

1

내 생각에, myArray를 반복하고 해당 배열의 각 요소에 대해 한 번씩 테스트를 실행하지만 한 테스트를 실행하고 다음 테스트를 실행하기 전에 완료 할 때까지 기다리는 대신, 한 번에 전체 무리.

Java 8 ForkJoinPool을 사용하면 매우 간단하게이 작업을 수행 할 수 있습니다.

ForkJoinTask[] tasks = new ForkJoinTask[myarray.length]; 
for(i=0,i<myarray.length, i++) 
{ 
    int j = i; // need an effectively final copy of i 
    tasks[i] = ForkJoinPool.commonPool().submit(() -> { 
     Webdriver.start(); 
     WebElement.findby.(By.name("field1").sendkeys(myArray[j][2]); 
     Webdriver.end(); 
    }); 
} 
for (i = 0; i < my array.length; i++) { 
    tasks[i].join(); 
} 

테스트는 "일반"ForkJoinPool의 스레드를 사용하여 병렬로 실행됩니다. 사용되는 스레드 수를 조정하려면 고유 한 ForkJoinPool을 만드십시오. (자세한 내용은 this question을 참조하십시오.)

+0

미안, 아마 나는 분명하지 않다, 또는 아마도 내가이었고, 당신의 대답 주소이 아니라. 그래서 Excel에서 테이블과 같은 배열을 사용하고 있으므로 사용자 데이터는 여러 열의 배열 한 행에 걸쳐 있습니다. 각 테스트마다 새 웹 드라이버를 시작해야하며 각 행마다 다른 열을 실행하는 테스트 배열이 있습니다. 이 목록을 만들면 목록의 어떤 문자열이 특정 사용자를위한 것인지 파악하기가 어려울 수 있습니다. –

+1

좋아, 목록을 잊어 버려. 나는 대답을 업데이트 할 것이다. –

1

대부분의 시간이 사용자 계정이 생성 될 때까지 기다릴 가능성이 높기 때문에 모든 작업에 대해 별도의 스레드를 명시 적으로 시작합니다.

는 아래의 거친 예제와 코드 조각 참조하십시오

public void createAccounts() throws InterruptedException { 
    List<Thread> threadList = new ArrayList<>(); 
    Object[][] myArray = new Object[1][1]; 
    for(int i=0; i<myArray.length; i++) { 
     final int index = i; 
     //Add thread for user creation 
     threadList.add(new Thread(new Runnable() { 
      @Override 
      public void run() { 
       Webdriver.start(); 
       WebElement.findby.(By.name("field1").sendkeys(myArray[index][2]); 
       Webdriver.end(); 
      } 
     })); 
    } 
    //Start all threads 
    for (Thread thread : threadList) { 
     thread.start(); 
    } 
    //Wait until all threads are finished 
    for (Thread thread : threadList) { 
     thread.join(); 
    } 
}