Class BrowserlessExtension

java.lang.Object
com.vaadin.browserless.BrowserlessExtension
All Implemented Interfaces:
GeneratedLocators, Locators, TesterWrappers, org.junit.jupiter.api.extension.AfterEachCallback, org.junit.jupiter.api.extension.BeforeEachCallback, org.junit.jupiter.api.extension.Extension

public class BrowserlessExtension extends Object implements org.junit.jupiter.api.extension.BeforeEachCallback, org.junit.jupiter.api.extension.AfterEachCallback
JUnit 5 extension for browserless Vaadin testing with per-method lifecycle.

A fresh Vaadin environment is initialized before each test method and torn down after. Use as an instance field with @RegisterExtension:

 
 @ViewPackages(classes = MyView.class)
 class MyTest {
     @RegisterExtension
     BrowserlessExtension ext = new BrowserlessExtension()
             .withServices(MyService.class);

     @Test
     void test() {
         MyView view = ext.navigate(MyView.class);
         ext.test(view.getButton()).click();
     }
 }
 
 

For a shared Vaadin environment across all tests in a class, use BrowserlessClassExtension instead.

Since:
1.1
See Also:
  • Constructor Details

    • BrowserlessExtension

      public BrowserlessExtension()
      Creates a new extension with per-method lifecycle.
  • Method Details

    • withViewPackages

      public BrowserlessExtension withViewPackages(Class<?>... classes)
      Adds packages to scan for @Route-annotated views, derived from the given classes' packages.
      Parameters:
      classes - classes whose packages should be scanned
      Returns:
      this extension instance
    • withViewPackages

      public BrowserlessExtension withViewPackages(String... packages)
      Adds packages to scan for @Route-annotated views.
      Parameters:
      packages - package names to scan
      Returns:
      this extension instance
    • withServices

      public BrowserlessExtension withServices(Class<?>... serviceClasses)
      Adds Vaadin Lookup service implementation classes.
      Parameters:
      serviceClasses - service implementation classes to register
      Returns:
      this extension instance
    • withComponentTesterPackages

      public BrowserlessExtension withComponentTesterPackages(String... packages)
      Adds extra packages to scan for ComponentTester implementations.
      Parameters:
      packages - package names to scan for testers
      Returns:
      this extension instance
    • withComponentTesterPackages

      public BrowserlessExtension withComponentTesterPackages(Class<?>... classes)
      Adds the packages of the given classes to the set of packages to scan for ComponentTester implementations.
      Parameters:
      classes - classes whose packages should be scanned for testers
      Returns:
      this extension instance
    • withApplicationProperty

      public BrowserlessExtension withApplicationProperty(String name, String value)
      Sets a Vaadin application property (init parameter) for the tests using this extension.
      Parameters:
      name - the property name
      value - the property value
      Returns:
      this extension instance
      Since:
      25.3
    • withApplicationProperties

      public BrowserlessExtension withApplicationProperties(Map<String,String> properties)
      Sets Vaadin application properties (init parameters) for the tests using this extension.
      Parameters:
      properties - the properties to set
      Returns:
      this extension instance
      Since:
      25.3
    • withFeatureFlags

      public BrowserlessExtension withFeatureFlags(String... featureIds)
      Enables the given Vaadin feature flags for the tests using this extension.
      Parameters:
      featureIds - the identifiers of the features to enable
      Returns:
      this extension instance
      Since:
      25.3
    • withFeatureFlags

      public BrowserlessExtension withFeatureFlags(Feature... features)
      Enables the given Vaadin feature flags for the tests using this extension.
      Parameters:
      features - the features to enable
      Returns:
      this extension instance
      Since:
      25.3
    • withFeatureFlag

      public BrowserlessExtension withFeatureFlag(String featureId, boolean enabled)
      Enables or disables the given Vaadin feature flag for the tests using this extension.
      Parameters:
      featureId - the identifier of the feature
      enabled - true to enable the feature, false to disable it
      Returns:
      this extension instance
      Since:
      25.3
    • withFeatureFlag

      public BrowserlessExtension withFeatureFlag(Feature feature, boolean enabled)
      Enables or disables the given Vaadin feature flag for the tests using this extension.
      Parameters:
      feature - the feature
      enabled - true to enable the feature, false to disable it
      Returns:
      this extension instance
      Since:
      25.3
    • withConfiguration

      public BrowserlessExtension withConfiguration(BrowserlessConfiguration configuration)
      Applies the given custom Vaadin configuration to the tests using this extension.

      The configuration wins over the one declared by a BrowserlessTestConfig annotation on the test class, but loses against the one declared on the test method.

      Parameters:
      configuration - the configuration to apply
      Returns:
      this extension instance
      Since:
      25.3
    • beforeEach

      public void beforeEach(org.junit.jupiter.api.extension.ExtensionContext ctx)
      Specified by:
      beforeEach in interface org.junit.jupiter.api.extension.BeforeEachCallback
    • afterEach

      public void afterEach(org.junit.jupiter.api.extension.ExtensionContext ctx)
      Specified by:
      afterEach in interface org.junit.jupiter.api.extension.AfterEachCallback
    • addViewPackages

      protected void addViewPackages(Class<?>... classes)
    • addViewPackages

      protected void addViewPackages(String... packages)
    • addServices

      protected void addServices(Class<?>... serviceClasses)
    • addComponentTesterPackages

      protected void addComponentTesterPackages(String... packages)
    • addComponentTesterPackages

      protected void addComponentTesterPackages(Class<?>... classes)
    • addApplicationProperty

      protected void addApplicationProperty(String name, String value)
    • addApplicationProperties

      protected void addApplicationProperties(Map<String,String> properties)
    • addFeatureFlags

      protected void addFeatureFlags(String... featureIds)
    • addFeatureFlags

      protected void addFeatureFlags(Feature... features)
    • addFeatureFlag

      protected void addFeatureFlag(String featureId, boolean enabled)
    • addFeatureFlag

      protected void addFeatureFlag(Feature feature, boolean enabled)
    • addConfiguration

      protected void addConfiguration(BrowserlessConfiguration configuration)
    • doInit

      protected void doInit(Object testInstance, org.junit.jupiter.api.extension.ExtensionContext ctx)
    • isClassScoped

      protected boolean isClassScoped()
      Tells whether this extension creates a single Vaadin environment shared by all the tests in the class, rather than one per test method.
      Returns:
      true if the Vaadin environment is scoped to the test class, false otherwise
    • doCleanup

      protected void doCleanup()
    • find

      public <T extends Component> ComponentQuery<T> find(Class<T> type)
      Gets a query object for finding components of the given type in the UI.

      The query walks the server-side component tree. A component that another component renders per item, such as the component a ComponentRenderer column renders for a grid row, is rendered into the column and not into the tree, and the content of an overlay, such as a context menu, is attached only while the overlay is open. Neither is reachable this way, and the lookup returns an empty result rather than failing, so reach those components through the owning component tester instead: GridTester.getCellComponent(row, column) for grid cells, ContextMenuTester.open() and then clickItem(...) for a context menu, and GridTester.contextMenu(row).open() for a grid context menu.

      Type Parameters:
      T - component type
      Parameters:
      type - component type to search for
      Returns:
      a component query
    • find

      public <T extends Component> ComponentQuery<T> find(Class<T> type, Component fromThis)
      Gets a query object for finding components nested inside a given component.

      Searches the same server-side component tree as find(Class), see there for what that tree does not contain.

      Type Parameters:
      T - component type
      Parameters:
      type - component type to search for
      fromThis - starting component for search
      Returns:
      a component query scoped to the given component
    • findInView

      public <T extends Component> ComponentQuery<T> findInView(Class<T> type)
      Gets a query object for finding components inside the current view.

      Searches the same server-side component tree as find(Class), see there for what that tree does not contain.

      Type Parameters:
      T - component type
      Parameters:
      type - component type to search for
      Returns:
      a component query scoped to the current view
    • getCurrentView

      public HasElement getCurrentView()
      Gets the current view instance shown in the UI.
      Returns:
      the current view
    • roundTrip

      public void roundTrip()
      Simulates a server round-trip, flushing pending component changes.
    • runPendingSignalsTasks

      public boolean runPendingSignalsTasks()
      Processes all pending Signals tasks with a default max wait of 100 milliseconds.

      Confirmation of a write to a shared signal (for example SharedValueSignal or SharedListSignal) is dispatched through the same queue. The new value is visible immediately through peek(), but the SignalOperation returned by the write only completes once the queued confirmation task has been run by this method. Blocking on operation.result().get() without draining the queue first never completes, because the confirmation task can only run on the thread that calls this method:

      
       var operation = tickets.insertLast("a ticket");
       extension.runPendingSignalsTasks();
       assertTrue(operation.result().join().successful());
       
      Returns:
      true if any pending Signals tasks were processed
    • runPendingSignalsTasks

      public boolean runPendingSignalsTasks(long maxWaitTime, TimeUnit unit)
      Processes all pending Signals tasks, waiting up to the specified timeout for tasks to arrive.
      Parameters:
      maxWaitTime - maximum time to wait for the first task
      unit - time unit for the timeout
      Returns:
      true if any pending Signals tasks were processed
    • fireShortcut

      public void fireShortcut(Key key, KeyModifier... modifiers)
      Simulates a keyboard shortcut performed on the browser.
      Parameters:
      key - primary key of the shortcut
      modifiers - key modifiers
    • activateLocatorContext

      public void activateLocatorContext()
      Description copied from interface: Locators
      Hook for context-bound implementations to install Vaadin thread-locals before a locator is built. Default is a no-op.
      Specified by:
      activateLocatorContext in interface GeneratedLocators
      Specified by:
      activateLocatorContext in interface Locators