How can we use Selenium-Jupiter's @TestTemplate
(to have it run with different browsers: https://bonigarcia.github.io/selenium-jupiter/#template-tests ) to combine it with @ParameterizedTest
(for data-driven testing, e.g. try different credentials, defined in a source, on a login page)?
I have not been able to figure it out.
Instead of being able to use Selenium-Jupiter's @TestTemplate
to configure the browser scenario programmatically (seleniumExtension.addBrowsers
and with Webdriver
as the parameter type of the method templateTest
) where the method would be executed twice (one using Chrome and the second using Firefox), I can only make it work with two @ParameterizedTest
methods:
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.aggregator.ArgumentsAccessor;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.extension.RegisterExtension;
import static org.junit.jupiter.params.provider.Arguments.arguments;
import io.github.bonigarcia.SeleniumExtension;
public class TestDDTparamNoTestTemplate {
@RegisterExtension
static SeleniumExtension seleniumExtension = new SeleniumExtension();
@BeforeAll
static void setup() {
//to stop geckodriver logging: (this is for firefox, not for firefoxInDocker)
System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE,"/dev/null");
}
//methodsource with factory method that must generate a stream of arguments:
static Stream<Arguments> purposeEmailPasswordNameProvider() {
return Stream.of(
arguments("Login works", "alexsiminiuc3@gmail.com", "Password123!", "Alex"),
arguments("Incorrect email", "alexsiminiuc2@gmail.com", "Password123!", "Alex"),
arguments("Invalid email", "alexsiminiuc", "Password123!", "Alex")
);
}
//CHROME
@ParameterizedTest
@MethodSource("purposeEmailPasswordNameProvider") // I could also use a @CsvSource or a @CsvFileSource
void testArgumentAggregMethodSourceChrome(ArgumentsAccessor arguments,ChromeDriver driver) {
String purpose = arguments.getString(0);
System.out.println("purpose is: " + purpose);
User user = new User(arguments.getString(1),
arguments.getString(2),
arguments.getString(3));
testCASE(driver, user, purpose);
}
//FIREFOX
@ParameterizedTest
@MethodSource("purposeEmailPasswordNameProvider")
void testArgumentAggregMethodSourceFirefox(ArgumentsAccessor arguments,FirefoxDriver driver) {
String purpose = arguments.getString(0);
System.out.println("purpose is: " + purpose);
User user = new User(arguments.getString(1),
arguments.getString(2),
arguments.getString(3));
testCASE(driver, user, purpose);
}
void testCASE(WebDriver driver, User user, String purpose){
HomePage homePage = new HomePage(driver);
homePage.open();
if (purpose.equals("Login works")) {
etc.