diff --git a/scouting/scouting_test.ts b/scouting/scouting_test.ts
index c63251b..43423c1 100644
--- a/scouting/scouting_test.ts
+++ b/scouting/scouting_test.ts
@@ -1,11 +1,14 @@
 import {browser, by, element, protractor} from 'protractor';
 
+const EC = protractor.ExpectedConditions;
+
 // Loads the page (or reloads it) and deals with the "Are you sure you want to
 // leave this page" popup.
 async function loadPage() {
   await disableAlerts();
   await browser.navigate().refresh();
   expect((await browser.getTitle())).toEqual('FRC971 Scouting Application');
+  await disableAlerts();
 }
 
 // Disables alert popups. They are extremely tedious to deal with in
@@ -13,7 +16,7 @@
 // an invisible checkbox that's off-screen.
 async function disableAlerts() {
   await browser.executeAsyncScript(function (callback) {
-    const block_alerts = document.getElementById('block_alerts') as HTMLInputElement;
+    let block_alerts = document.getElementById('block_alerts') as HTMLInputElement;
     block_alerts.checked = true;
     callback();
   });
@@ -24,6 +27,12 @@
   return element(by.css('.header')).getText();
 }
 
+// Returns the currently displayed progress message on the screen. This only
+// exists on screens where the web page interacts with the web server.
+function getProgressMessage() {
+  return element(by.css('.progress_message')).getText();
+}
+
 // Returns the currently displayed error message on the screen. This only
 // exists on screens where the web page interacts with the web server.
 function getErrorMessage() {
@@ -43,23 +52,62 @@
       .toEqual(`${fieldName}: ${expectedValue}`);
 }
 
+// Sets a text field to the specified value.
+function setTextboxByIdTo(id: string, value: string) {
+  // Just sending "value" to the input fields is insufficient. We need to
+  // overwrite the text that is there. If we didn't hit CTRL-A to select all
+  // the text, we'd be appending to whatever is there already.
+  return element(by.id(id)).sendKeys(
+        protractor.Key.CONTROL, 'a', protractor.Key.NULL,
+        value);
+}
+
 describe('The scouting web page', () => {
   beforeAll(async () => {
     await browser.get(browser.baseUrl);
     expect((await browser.getTitle())).toEqual('FRC971 Scouting Application');
     await disableAlerts();
+
+    // Import the match list before running any tests. Ideally this should be
+    // run in beforeEach(), but it's not worth doing that at this time. Our
+    // tests are basic enough not to require this.
+    await element(by.cssContainingText('.nav-link', 'Import Match List')).click();
+    expect(await getHeadingText()).toEqual('Import Match List');
+    await setTextboxByIdTo('year', '2016');
+    await setTextboxByIdTo('event_code', 'nytr');
+    await element(by.buttonText('Import')).click();
+
+    await browser.wait(EC.textToBePresentInElement(
+        element(by.css('.progress_message')), 'Successfully imported match list.'));
   });
 
+  it('should: error on unknown match.', async () => {
+    await loadPage();
+
+    // Pick a match that doesn't exist in the 2016nytr match list.
+    await setTextboxByIdTo('match_number', '3');
+    await setTextboxByIdTo('team_number', '971');
+
+    // Click Next until we get to the submit screen.
+    for (let i = 0; i < 5; i++) {
+      await element(by.buttonText('Next')).click();
+    }
+    expect(await getHeadingText()).toEqual('Review and Submit');
+
+    // Attempt to submit and validate the error.
+    await element(by.buttonText('Submit')).click();
+    expect(await getErrorMessage()).toContain(
+        'Failed to find team 971 in match 3 in the schedule.');
+  });
+
+
   it('should: review and submit correct data.', async () => {
     await loadPage();
 
+    // Submit scouting data for a random team that attended 2016nytr.
     expect(await getHeadingText()).toEqual('Team Selection');
-    // Just sending "971" to the input fields is insufficient. We need to
-    // overwrite the text that is there. If we didn't hit CTRL-A to select all
-    // the text, we'd be appending to whatever is there already.
-    await element(by.id('team_number')).sendKeys(
-        protractor.Key.CONTROL, 'a', protractor.Key.NULL,
-        '971');
+    await setTextboxByIdTo('match_number', '2');
+    await setTextboxByIdTo('team_number', '5254');
     await element(by.buttonText('Next')).click();
 
     expect(await getHeadingText()).toEqual('Auto');
@@ -81,8 +129,8 @@
     expect(await getErrorMessage()).toEqual('');
 
     // Validate Team Selection.
-    await expectReviewFieldToBe('Match number', '1');
-    await expectReviewFieldToBe('Team number', '971');
+    await expectReviewFieldToBe('Match number', '2');
+    await expectReviewFieldToBe('Team number', '5254');
 
     // Validate Auto.
     await expectNthReviewFieldToBe('Upper Shots Made', 0, '0');
@@ -105,9 +153,11 @@
     await expectReviewFieldToBe('Battery died', 'false');
     await expectReviewFieldToBe('Broke (mechanically)', 'true');
 
-    // TODO(phil): Submit data and make sure it made its way to the database
-    // correctly. Right now the /requests/submit/data_scouting endpoint is not
-    // implemented.
+    await element(by.buttonText('Submit')).click();
+    await browser.wait(EC.textToBePresentInElement(
+        element(by.css('.header')), 'Home'));
+
+    // TODO(phil): Make sure the data made its way to the database correctly.
   });
 
   it('should: load all images successfully.', async () => {
