2016-12-31 61 views
0

我有一種方法可以在Selenium上快速創建用戶帳戶。目前它一個接一個地進行處理,但我想如果我可以立即處理10,那會更好。併發java on for循環

我目前有一個for循環,它用來告訴內部的代碼,我的二維數組的哪一行讀取用戶信息。我正在努力理解如何使任何流或線程使用正確的值並獲取正確的用戶信息。

目前我有類似下面的東西簡單化:

我需要加載一個新的頁面和司機每次這個循環和需要發送的陣列到網上字段的值。所以基本上我希望這樣做,並且在開始下一個循環之前不要等待第一個循環結束,但可能會限制到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(); 
} 

測試將使用來自「common」ForkJoinPool的線程並行運行。如果您想調整使用的線程數,請創建您自己的ForkJoinPool。 (有關更多信息,請參閱this question)。

+0

對不起,也許我還不清楚,也許我是和你的答案地址,這口井。所以我在Excel中像使用表格那樣使用數組,所以用戶數據跨越數列中的一行。我需要爲每個測試啓動一個新的Web驅動程序,並且每行都有不同列的測試數組。如果我將這個列表作爲列表,那麼我可能很難確定列表中哪個字符串是針對特定用戶的? –

+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(); 
    } 
}