如何根据环境使用不同的网络驱动程序
How to use different webdrivers based on environment
我使用 selenium-jupiter。我从这样的方法参数中得到一个网络驱动程序:
@Test
public void testWithChrome(ChromeDriver chromeDriver) {
chromeDriver.get("someUrlHere");
}
现在我想运行在网格上进行测试,所以我需要根据环境使用webdriver。例如,在我的 PC 上开发测试时,我想使用(本地)ChromeDriver,但是当使用 Jenkins 在网格上进行 运行ning 测试时,我想使用 RemoteDriver。
所以我需要这样的东西:(当 env = 0 时给我本地 Chrome 或当 env = 1 时给我远程 Chrome 但它不起作用)
int env = 0;
@Test
public void testWithChrome(
(env == 0 ? ChromeDriver driver : RemoteDriver driver)) {
driver.get("someUrlHere");
}
我认为这里最好有一个在任何测试(用 @BeforeAll
注释)之前执行的方法来确定脚本在 运行 中的环境。它可能读取从一些配置文件本地 vs 网格。确定后,将 driver
变量指定为 ChromeDriver
或 RemoteDriver
的实例。从那时起,您的测试将传递类型为 WebDriver
的 driver
实例,因为 ChromeDriver
和 RemoteDriver
都继承自它。
WebDriver driver;
@BeforeAll
public void setup()
{
// read from config file, etc. to determine if local or grid
if (local)
{
driver = new ChromeDriver();
}
else
{
driver = new RemoteDriver();
}
}
@Test
public void test()
{
driver.get("someUrlHere");
}
简而言之:当以编程方式配置您的 Selenium 扩展时,您可以通过如下配置其 URL 来强制使用 Selenium 网格(使用 JUnit 5 注释):
abstract class UiTest {
@RegisterExtension
static SeleniumExtension seleniumExtension = new SeleniumExtension();
@BeforeAll
static void setUpOnce() {
boolean isRunningInCiEnvironment = ...
if( isRunningInCiEnvironment ) {
// this will force Selenium Jupiter to use a RemoteWebDriver
seleniumExtension.getConfig().setSeleniumServerUrl("http://...");
}
// without above condition, a FirefoxDriver will be used locally
seleniumExtension.addBrowsers(BrowserBuilder.firefox().build(););
}
}
class MyTest extends UiTest {
// Use WebDriver interface in test method: concrete browser detected
// at execution time (via @BeforeAll, inherited from parent class)
@Test
void my_test_Case(WebDriver webDriver) {
webDriver.get(...)
Assert.(...)
}
}
长度问题is decribed here。
您可以使用此扩展程序附带的 WebDriverManager 来做到这一点。
@BeforeEach
public void setUp()
{
switch(browser)
{
case "chrome" ->
{
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
case "firefox" ->
{
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
}
case "edge" ->
{
WebDriverManager.edgedriver().setup();
driver = new EdgeDriver();
}
}
driver.manage().window().maximize();
}
我使用 selenium-jupiter。我从这样的方法参数中得到一个网络驱动程序:
@Test
public void testWithChrome(ChromeDriver chromeDriver) {
chromeDriver.get("someUrlHere");
}
现在我想运行在网格上进行测试,所以我需要根据环境使用webdriver。例如,在我的 PC 上开发测试时,我想使用(本地)ChromeDriver,但是当使用 Jenkins 在网格上进行 运行ning 测试时,我想使用 RemoteDriver。 所以我需要这样的东西:(当 env = 0 时给我本地 Chrome 或当 env = 1 时给我远程 Chrome 但它不起作用)
int env = 0;
@Test
public void testWithChrome(
(env == 0 ? ChromeDriver driver : RemoteDriver driver)) {
driver.get("someUrlHere");
}
我认为这里最好有一个在任何测试(用 @BeforeAll
注释)之前执行的方法来确定脚本在 运行 中的环境。它可能读取从一些配置文件本地 vs 网格。确定后,将 driver
变量指定为 ChromeDriver
或 RemoteDriver
的实例。从那时起,您的测试将传递类型为 WebDriver
的 driver
实例,因为 ChromeDriver
和 RemoteDriver
都继承自它。
WebDriver driver;
@BeforeAll
public void setup()
{
// read from config file, etc. to determine if local or grid
if (local)
{
driver = new ChromeDriver();
}
else
{
driver = new RemoteDriver();
}
}
@Test
public void test()
{
driver.get("someUrlHere");
}
简而言之:当以编程方式配置您的 Selenium 扩展时,您可以通过如下配置其 URL 来强制使用 Selenium 网格(使用 JUnit 5 注释):
abstract class UiTest {
@RegisterExtension
static SeleniumExtension seleniumExtension = new SeleniumExtension();
@BeforeAll
static void setUpOnce() {
boolean isRunningInCiEnvironment = ...
if( isRunningInCiEnvironment ) {
// this will force Selenium Jupiter to use a RemoteWebDriver
seleniumExtension.getConfig().setSeleniumServerUrl("http://...");
}
// without above condition, a FirefoxDriver will be used locally
seleniumExtension.addBrowsers(BrowserBuilder.firefox().build(););
}
}
class MyTest extends UiTest {
// Use WebDriver interface in test method: concrete browser detected
// at execution time (via @BeforeAll, inherited from parent class)
@Test
void my_test_Case(WebDriver webDriver) {
webDriver.get(...)
Assert.(...)
}
}
长度问题is decribed here。
您可以使用此扩展程序附带的 WebDriverManager 来做到这一点。
@BeforeEach
public void setUp()
{
switch(browser)
{
case "chrome" ->
{
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
case "firefox" ->
{
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
}
case "edge" ->
{
WebDriverManager.edgedriver().setup();
driver = new EdgeDriver();
}
}
driver.manage().window().maximize();
}