diff --git a/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml b/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml
new file mode 100644
index 0000000..960615a
--- /dev/null
+++ b/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml
@@ -0,0 +1,35 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - views
+name: test_entity_browser_file
+label: 'Test entity browser file'
+display: iframe
+display_configuration:
+  width: '650'
+  height: '500'
+  link_text: 'Select entities'
+  auto_open: false
+selection_display: no_display
+selection_display_configuration: {  }
+widget_selector: single
+widget_selector_configuration: {  }
+widgets:
+  2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87:
+    settings:
+      upload_location: 'public://'
+      submit_text: 'Select files'
+    uuid: 2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87
+    weight: -9
+    label: upload
+    id: upload
+  774798f1-5ec5-4b63-84bd-124cd51ec07d:
+    settings:
+      view: files_entity_browser
+      view_display: entity_browser_1
+      submit_text: 'Select entities'
+    uuid: 774798f1-5ec5-4b63-84bd-124cd51ec07d
+    weight: -10
+    label: view
+    id: view
diff --git a/tests/modules/entity_browser_test/config/install/views.view.files_entity_browser.yml b/tests/modules/entity_browser_test/config/install/views.view.files_entity_browser.yml
new file mode 100644
index 0000000..bf51ac3
--- /dev/null
+++ b/tests/modules/entity_browser_test/config/install/views.view.files_entity_browser.yml
@@ -0,0 +1,244 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - entity_browser
+    - file
+    - user
+id: files_entity_browser
+label: 'Files entity browser'
+module: views
+description: ''
+tag: ''
+base_table: file_managed
+base_field: fid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: mini
+        options:
+          items_per_page: 10
+          offset: 0
+          id: 0
+          total_pages: null
+          expose:
+            items_per_page: false
+            items_per_page_label: 'Items per page'
+            items_per_page_options: '5, 10, 25, 50'
+            items_per_page_options_all: false
+            items_per_page_options_all_label: '- All -'
+            offset: false
+            offset_label: Offset
+          tags:
+            previous: ‹‹
+            next: ››
+      style:
+        type: table
+        options:
+          grouping: {  }
+          row_class: ''
+          default_row_class: true
+          override: true
+          sticky: false
+          caption: ''
+          summary: ''
+          description: ''
+          columns:
+            entity_browser_select: entity_browser_select
+            filename: filename
+          info:
+            entity_browser_select:
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            filename:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+          default: '-1'
+          empty_table: false
+      row:
+        type: fields
+        options:
+          inline: {  }
+          separator: ''
+          hide_empty: false
+          default_field_elements: true
+      fields:
+        entity_browser_select:
+          id: entity_browser_select
+          table: file_managed
+          field: entity_browser_select
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: 'Entity browser bulk select form'
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          entity_type: file
+          plugin_id: entity_browser_select
+        filename:
+          id: filename
+          table: file_managed
+          field: filename
+          entity_type: file
+          entity_field: filename
+          label: ''
+          alter:
+            alter_text: false
+            make_link: false
+            absolute: false
+            trim: false
+            word_boundary: false
+            ellipsis: false
+            strip_tags: false
+            html: false
+          hide_empty: false
+          empty_zero: false
+          plugin_id: field
+          type: file_link
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exclude: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_alter_empty: true
+          click_sort_column: value
+          settings: {  }
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+      filters: {  }
+      sorts:
+        created:
+          id: created
+          table: file_managed
+          field: created
+          order: DESC
+          entity_type: file
+          entity_field: created
+          plugin_id: date
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exposed: false
+          expose:
+            label: ''
+          granularity: second
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments: {  }
+      display_extenders: {  }
+    cache_metadata:
+      max-age: 0
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url.query_args
+        - user.permissions
+      tags: {  }
+  entity_browser_1:
+    display_plugin: entity_browser
+    id: entity_browser_1
+    display_title: 'Entity browser'
+    position: 1
+    display_options:
+      display_extenders: {  }
+    cache_metadata:
+      max-age: 0
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url.query_args
+        - user.permissions
+      tags: {  }
diff --git a/tests/modules/entity_browser_test/entity_browser_test.info.yml b/tests/modules/entity_browser_test/entity_browser_test.info.yml
index e2df18e..14d17a5 100644
--- a/tests/modules/entity_browser_test/entity_browser_test.info.yml
+++ b/tests/modules/entity_browser_test/entity_browser_test.info.yml
@@ -6,3 +6,4 @@ package: Testing
 version: VERSION
 dependencies:
   - entity_browser
+  - file
diff --git a/tests/src/FunctionalJavascript/EntityBrowserTest.php b/tests/src/FunctionalJavascript/EntityBrowserTest.php
new file mode 100644
index 0000000..c6d72d2
--- /dev/null
+++ b/tests/src/FunctionalJavascript/EntityBrowserTest.php
@@ -0,0 +1,291 @@
+<?php
+
+namespace Drupal\Tests\entity_browser\FunctionalJavascript;
+
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\StreamWrapper\PublicStream;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\file\Entity\File;
+use Drupal\FunctionalJavascriptTests\JavascriptTestBase;
+
+/**
+ * Tests the entity_browser.
+ *
+ * @group entity_browser
+ */
+class EntityBrowserTest extends JavascriptTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'entity_browser_test',
+    'ctools',
+    'views',
+    'block',
+    'node',
+    'file',
+    'image',
+    'field_ui',
+    'views_ui'
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+    // Create a content type with
+    $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
+
+    FieldStorageConfig::create([
+      'field_name' => 'field_reference',
+      'type' => 'entity_reference',
+      'entity_type' => 'node',
+      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
+      'settings' => [
+        'target_type' => 'file',
+      ],
+    ])->save();
+
+    FieldConfig::create([
+      'field_name' => 'field_reference',
+      'entity_type' => 'node',
+      'bundle' => 'article',
+      'label' => 'Reference',
+      'settings' => [],
+    ])->save();
+
+    $form_display = $this->container->get('entity_type.manager')
+      ->getStorage('entity_form_display')
+      ->load('node.article.default');
+    $form_display->setComponent('field_reference', [
+      'type' => 'entity_browser_entity_reference',
+      'settings' => [
+        'entity_browser' => 'test_entity_browser_file',
+        'field_widget_display' => 'label',
+        'open' => TRUE,
+      ],
+    ])->save();
+  }
+
+  /**
+   * Tests single widget selector.
+   */
+  public function testSingleWidgetSelector() {
+    $account = $this->drupalCreateUser([
+      'access test_entity_browser_file entity browser pages',
+      'create article content',
+      'access content',
+    ]);
+    $this->drupalLogin($account);
+
+    // Sets the single widget selector.
+    $browser = $this->container->get('entity_type.manager')
+      ->getStorage('entity_browser')
+      ->load('test_entity_browser_file');
+
+    $this->assertEquals($browser->getWidgetSelector()->getPluginId(), 'single', 'Widget selector is set to single.');
+
+    // Create a file.
+    file_put_contents('public://llama.jpg', $this->randomMachineName());
+    $image = File::create([
+      'filename' => 'llama.jpg',
+      'uri' => 'public://llama.jpg',
+    ]);
+    $image->save();
+
+    $this->drupalGet('node/add/article');
+
+    $this->assertSession()->linkExists('Select entities');
+    $this->getSession()->getPage()->clickLink('Select entities');
+
+    $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file');
+
+    $this->getSession()->getPage()->checkField('entity_browser_select[file:' . $image->id() . ']');
+    $this->getSession()->getPage()->pressButton('Select entities');
+
+    $this->assertSession()->pageTextContains('llama.jpg');
+  }
+
+  /**
+   * Tests tabs widget selector.
+   */
+  public function testTabsWidgetSelector() {
+    $account = $this->drupalCreateUser([
+      'access test_entity_browser_file entity browser pages',
+      'create article content',
+      'access content',
+    ]);
+    $this->drupalLogin($account);
+
+    // Sets the tabs widget selector.
+    $browser = $this->container->get('entity_type.manager')
+      ->getStorage('entity_browser')
+      ->load('test_entity_browser_file')
+      ->setWidgetSelector('tabs');
+    $browser->save();
+
+    $this->assertEquals($browser->getWidgetSelector()->getPluginId(), 'tabs', 'Widget selector is set to tabs.');
+
+    // Create a file.
+    file_put_contents('public://llama.jpg', $this->randomMachineName());
+    $image = File::create([
+      'filename' => 'llama.jpg',
+      'uri' => 'public://llama.jpg',
+    ]);
+    $image->save();
+
+    // Create a second file.
+    file_put_contents('public://llama2.jpg', $this->randomMachineName());
+    $image2 = File::create([
+      'filename' => 'llama2.jpg',
+      'uri' => 'public://llama2.jpg',
+    ]);
+    $image2->save();
+
+    $this->drupalGet('node/add/article');
+
+    $this->assertSession()->linkExists('Select entities');
+    $this->getSession()->getPage()->clickLink('Select entities');
+
+    $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file');
+
+    $this->assertSession()->linkExists('view');
+    $this->assertSession()->linkExists('upload');
+
+    $this->assertEquals('is-active active', $this->getSession()->getPage()->findLink('view')->getAttribute('class'));
+
+    $this->getSession()->getPage()->checkField('entity_browser_select[file:' . $image->id() . ']');
+    $this->getSession()->getPage()->pressButton('Select entities');
+
+    $this->assertSession()->pageTextContains('llama.jpg');
+    // Return from iframe to the node add page.
+    $this->getSession()->switchToIFrame();
+
+    $this->waitForAjaxToFinish();
+
+    $this->getSession()->getPage()->clickLink('Select entities');
+    $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file');
+    $this->getSession()->getPage()->clickLink('upload');
+
+    $edit = [
+      'files[upload][]' => $this->container->get('file_system')->realpath($image2->getFileUri()),
+    ];
+
+    // This is producing an error. Still investigating
+    // InvalidStateError: DOM Exception 11: An attempt was made to use an object
+    // that is not, or is no longer, usable
+    //$this->drupalPostForm(NULL, $edit, 'Select files');
+  }
+
+  /**
+   * Tests dropdown widget selector.
+   */
+  public function testDropdownWidgetSelector() {
+    $account = $this->drupalCreateUser([
+      'access test_entity_browser_file entity browser pages',
+      'create article content',
+      'access content',
+    ]);
+    $this->drupalLogin($account);
+
+    // Sets the dropdown widget selector.
+    $browser = $this->container->get('entity_type.manager')
+      ->getStorage('entity_browser')
+      ->load('test_entity_browser_file')
+      ->setWidgetSelector('drop_down');
+    $browser->save();
+
+    $this->assertEquals($browser->getWidgetSelector()->getPluginId(), 'drop_down', 'Widget selector is set to dropdown.');
+
+    // Create a file.
+    file_put_contents('public://llama.jpg', $this->randomMachineName());
+    $image = File::create([
+      'filename' => 'llama.jpg',
+      'uri' => 'public://llama.jpg',
+    ]);
+    $image->save();
+
+    $this->drupalGet('node/add/article');
+
+    $this->assertSession()->linkExists('Select entities');
+    $this->getSession()->getPage()->clickLink('Select entities');
+
+    $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file');
+
+    $this->assertSession()->selectExists('widget');
+    // Selects the view widget.
+    $this->getSession()->getPage()->selectFieldOption('widget', '774798f1-5ec5-4b63-84bd-124cd51ec07d');
+
+    $this->getSession()->getPage()->checkField('entity_browser_select[file:' . $image->id() . ']');
+    $this->getSession()->getPage()->pressButton('Select entities');
+
+    $this->assertSession()->pageTextContains('llama.jpg');
+    // Return from iframe to the node add page.
+    $this->getSession()->switchToIFrame();
+    $this->waitForAjaxToFinish();
+
+    $this->getSession()->getPage()->clickLink('Select entities');
+
+    $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file');
+
+    // Causes a fatal.
+    // Selects the upload widget.
+    //$this->getSession()->getPage()->selectFieldOption('widget', '2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87');
+
+//    $this->addViewportOverlay();
+//    file_put_contents(DRUPAL_ROOT . '/image.jpeg', $this->getSession()->getScreenshot());
+//    file_put_contents(DRUPAL_ROOT . '/html.html', $this->getSession()->getPage()->getHtml());
+  }
+
+  public function todotestUploadWidget() {
+
+  }
+
+  /**
+   * Tests wievs selection display.
+   */
+  public function testViewsSelectionDisplayWidget() {
+    $account = $this->drupalCreateUser([
+      'access test_entity_browser_file entity browser pages',
+      'create article content',
+      'access content',
+    ]);
+    $this->drupalLogin($account);
+
+    // Sets the dropdown widget selector.
+    $browser = $this->container->get('entity_type.manager')
+      ->getStorage('entity_browser')
+      ->load('test_entity_browser_file')
+      ->setSelectionDisplay('view');
+    $browser->save();
+
+    $this->assertEquals($browser->getSelectionDisplay()->getPluginId(), 'view', 'Selection display is set to view.');
+
+  }
+
+  public function todotestModalDisplay() {
+
+  }
+
+  public function todotestStandaloneDisplay() {
+
+  }
+
+  public function todotestMultiStepSelectionDisplay() {
+
+  }
+
+  /**
+   * Waits for jQuery to become ready and animations to complete.
+   */
+  protected function waitForAjaxToFinish() {
+      $condition = "(0 === jQuery.active && 0 === jQuery(':animated').length)";
+      $this->assertJsCondition($condition, 10000);
+    }
+
+}
