Reputation: 7338
I'm trying to use Selenium to automate file uploading.
I'v already wrote a tiny program with the selenium-webdriver that works.
The problem is, there are thousands of files need to be uploaded, I'd like to run multiple browser instances simultaneously to speed up the automation. So I tried something like this
var i = 0;
while (i < 10) {
i++;
var driver = new webdriver.Builder()
.forBrowser('firefox')
.build();
// login and upload files......
}
I expected this would create 10 browser instances at once, and do the automation simultaneously.
But actually... the above code will creates browser instance 'one by one' which means, it won't create another instance until the previous one finishes.
I'v also tried execute the program in multiple shell instances, that will fire up multiple browser instances for me, but I just don't want to do this...
Upvotes: 12
Views: 67358
Reputation: 11
parallel="methods": TestNG will run all your test methods in separate threads. Dependent methods will also run in separate threads but they will respect the order that you specified.
parallel="tests": TestNG will run all the methods in the same tag in the same thread, but each tag will be in a separate thread. This allows you to group all your classes that are not thread safe in the same and guarantee they will all run in the same thread while taking advantage of TestNG using as many threads as possible to run your tests.
parallel="classes": TestNG will run all the methods in the same class in the same thread, but each class will be run in a separate thread.
parallel="instances": TestNG will run all the methods in the same instance in the same thread, but two methods on two different instances will be running in different threads.
Upvotes: 0
Reputation: 1329
You should create a new instance of the WebDriver and it's capabilities for each new browser you want to open.
The following will open Google in five separate instances of Chrome.
import * as webdriver from "selenium-webdriver";
import * as Chrome from 'selenium-webdriver/chrome';
function loadSelenium(){
let options = new Chrome.Options();
let capabilities = options.toCapabilities();
console.log('loading another');
return new webdriver.Builder()
.forBrowser('chrome')
.withCapabilities(capabilities)
.build();
}
for(let i = 0; i < 5; i++) {
let driver = loadSelenium();
driver.get('http://www.google.com');
}
Upvotes: 3
Reputation: 1609
Well you need to create multiple threads instead of looping, then you can start each upload in parallel threads. You are on the right track. You dont need selenium grid to achieve this.
lookup about multithreading. You can start with this answer
It's not right you need grid for executing multiple browser sessions. You can invoke multiple browser sessions by just creating multiple driver objects, and managing them. Each session will be separate if you want them to be.
Grid is for scaling as there is a limitation on the no of browser instances you can run keeping your machine performance intact and tests stable. Like more than 5 chrome instances in a single machine. If you want to do more than that then you have to use selenium Grid.
Upvotes: 6