簡體   English   中英

如何在 Selenium Jupiter 的基礎 class 中以編程方式配置 WebDriver?

[英]How to programmatically configure WebDriver in base class in Selenium Jupiter?

我想將基於 JUnit 4 的現有 Selenium-Tests 遷移到 JUnit 5。為此,我想使用Selenium-Jupiter

測試必須滿足的一項要求是,能夠在運行時切換 WebDriver 實現- 基於執行環境 - 使用一個通用基礎 class 進行所有測試

  • 在開發人員機器 (Windows 10) 上執行時,應使用 FirefoxDriver,啟動本地安裝的 Firefox。
  • 在 CI 環境 (CentOS 7) 中,應使用 RemoteWebDriver,將測試執行委托給 Selenium 網格

我已經嘗試 根據文檔配置“通用 WebDriver”,但我不知道如何為 RemoteWebDriver 實現這一點(“示例 2”應該讓事情更清楚)。

關於內容, 這個 stackoverflow-posting 非常相關,但沒有產生令人滿意的答案。

更新:我自己解決了這個問題。 請參閱“示例 3”...


Boni ,也許您想稍微更新一下 Selenium Jupiter 文檔。 至少我遇到了一些問題,弄清楚了......哦,非常感謝您使用 Selenium Jupiter(和底層 WebDriverManger)所做的出色工作。


示例 1:有效,但不優雅

@ExtendWith(SeleniumExtension.class)
class MyTest {

  @EnabledIfSystemProperty(named = "os.name", matches = "Windows 10")
  @Test
  void test_executed_with_local_firefox(FirefoxDriver ffDriver) {
     executeTestCaseWith(ffDriver);
  }

  @EnabledIfSystemProperty(named = "os.name", matches = "Linux")
  @Test
  void test_executed_with_firefox_from_selenium_grid(@DriverUrl("http://...") RemoteWebDriver remoteDriver) {
     executeTestCaseWith(remoteDriver);
  }

  void executeTestCaseWith(WebDriver webDriver) {
     webDriver.get(...)
     Assert(...)
  }
}

我看到的問題是:

  1. 相當冗長(盡管這可能通過自定義注釋來處理)
  2. 每個測試 class 需要兩個@Test-methods 用於一個邏輯/語義測試用例
  3. 公開了具體的 WebDriver 實現,因此,允許測試作者依賴 WebDriver 實現細節(例如,Firefox 配置文件)

示例 2:我想做,但還不行

基礎 class,進行 WebDriver 配置:

abstract class UiTest {

   @RegisterExtension
   static SeleniumExtension seleniumExtension = new SeleniumExtension();     

   @BeforeAll
   static void setUpOnce() {

     // This check is not the problem discussed here
     boolean isRunningInCiEnvironment = ...
     Browser firefox;

      if( ! isRunningInCiEnvironment ) {
        // This works
        firefox = BrowserBuilder.firefox().build();
      } else {
        // this does not exist yet!
        //firefox = BrowserBuilder.remoteWebDriver().url("http://...").build();

        // This executes, but does not behave as expected
        // The URL is pretty much ignored.
        firefox = BrowserBuilder.firefox().url("http://...").build();
      }

     seleniumExtension.addBrowsers(firefox);
   }       
}

在測試中我只需要做某事。 像這樣。

class MyTest extends UiTest {

  @Test
  void my_one_logic_test_case(WebDriver webDriver) {

     webDriver.get(...)
     Assert(...)        
  }
}

注意,參數的類型怎么只有WebDriver!

示例 3:我當前的解決方案

abstract class UiTest {

   @RegisterExtension
   static SeleniumExtension seleniumExtension = new SeleniumExtension();     

   @BeforeAll
   static void setUpOnce() {

     // This check is not the problem discussed here
     boolean isRunningInCiEnvironment = ...

      if( isRunningInCiEnvironment ) {
        // This is doing the trick!
        seleniumExtension.getConfig().setSeleniumServerUrl("http://...");
      }

     seleniumExtension.addBrowsers( BrowserBuilder.firefox().build() );
   }       
}

現在可以按照“示例 2”中的描述來實施具體測試。

您可以使用@TestTemplate並使用兩個 browser.json 文件來利用browsers.json器配置。

  1. 編寫帶有@TestTemplate注釋的測試:
class MyTest {

  @TestTemplate
  void my_logic_test_case(WebDriver webDriver) {
    // ...       
  }
}
  1. 添加browsers.json到您的類路徑(默認,使用本地 Firefox 安裝):
{
  "browsers": [
    [
      {
        "type": "firefox"
      }
    ]
  ]
}
  1. 添加browsers-ci.json到你的類路徑(不是默認的,使用 Selenium Grid / RemoteWebDriver):
{
  "browsers": [
    [
      {
        "type": "firefox",
        "capabilities": {
          "browserName": "firefox"
        },
        "arguments": [
          "--headless"
        ],
        "remoteUrl": "https://mygrid.com/wd/hub"
      }
    ]
  ]
}

現在,您可以在本地運行測試,它將使用本地 Firefox。 如果您在 CI 環境中運行測試,請配置您的 CI 腳本以設置系統屬性sel.jup.browser.template.json.file指向browsers-ci.json

例如,如果您使用 Maven 運行 Selenium-Jupiter 測試:

mvn test -Dsel.jup.browser.template.json.file=classpath:browsers-ci.json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM