diff --git a/scouting/scouting_test.ts b/scouting/scouting_test.ts
index fda3834..84824ff 100644
--- a/scouting/scouting_test.ts
+++ b/scouting/scouting_test.ts
@@ -15,8 +15,9 @@
 // Protractor since they're not angular elements. We achieve this by checking
 // an invisible checkbox that's off-screen.
 async function disableAlerts() {
-  await browser.executeAsyncScript(function (callback) {
-    let block_alerts = document.getElementById('block_alerts') as HTMLInputElement;
+  await browser.executeAsyncScript(function(callback) {
+    let block_alerts =
+        document.getElementById('block_alerts') as HTMLInputElement;
     block_alerts.checked = true;
     callback();
   });
@@ -47,8 +48,11 @@
 
 // Asserts that the n'th instance of a field on the "Submit and Review"
 // screen has a specific value.
-async function expectNthReviewFieldToBe(fieldName: string, n: number, expectedValue: string) {
-  expect(await element.all(by.cssContainingText('li', `${fieldName}:`)).get(n).getText())
+async function expectNthReviewFieldToBe(
+    fieldName: string, n: number, expectedValue: string) {
+  expect(await element.all(by.cssContainingText('li', `${fieldName}:`))
+             .get(n)
+             .getText())
       .toEqual(`${fieldName}: ${expectedValue}`);
 }
 
@@ -58,8 +62,7 @@
   // 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);
+      protractor.Key.CONTROL, 'a', protractor.Key.NULL, value);
 }
 
 describe('The scouting web page', () => {
@@ -71,19 +74,23 @@
     // 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();
+    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.'));
+        element(by.css('.progress_message')),
+        'Successfully imported match list.'));
   });
 
   it('should: error on unknown match.', async () => {
     await loadPage();
 
+    await element(by.cssContainingText('.nav-link', 'Data Entry')).click();
+
     // Pick a match that doesn't exist in the 2016nytr match list.
     await setTextboxByIdTo('match_number', '3');
     await setTextboxByIdTo('team_number', '971');
@@ -96,14 +103,16 @@
 
     // 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.');
+    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();
 
+    await element(by.cssContainingText('.nav-link', 'Data Entry')).click();
+
     // Submit scouting data for a random team that attended 2016nytr.
     expect(await getHeadingText()).toEqual('Team Selection');
     await setTextboxByIdTo('match_number', '2');
@@ -156,8 +165,8 @@
     await expectReviewFieldToBe('Broke (mechanically)', 'true');
 
     await element(by.buttonText('Submit')).click();
-    await browser.wait(EC.textToBePresentInElement(
-        element(by.css('.header')), 'Success'));
+    await browser.wait(
+        EC.textToBePresentInElement(element(by.css('.header')), 'Success'));
 
     // TODO(phil): Make sure the data made its way to the database correctly.
   });
@@ -165,23 +174,27 @@
   it('should: load all images successfully.', async () => {
     await loadPage();
 
+    await element(by.cssContainingText('.nav-link', 'Data Entry')).click();
+
     // Get to the Auto display with the field pictures.
     expect(await getHeadingText()).toEqual('Team Selection');
     await element(by.buttonText('Next')).click();
     expect(await getHeadingText()).toEqual('Auto');
 
     // We expect 2 fully loaded images.
-    browser.executeAsyncScript(function (callback) {
-      let images = document.getElementsByTagName('img');
-      let numLoaded = 0;
-      for (let i = 0; i < images.length; i += 1) {
-        if (images[i].naturalWidth > 0) {
-          numLoaded += 1;
-        }
-      }
-      callback(numLoaded);
-    }).then(function (numLoaded) {
-      expect(numLoaded).toBe(2);
-    });
+    browser
+        .executeAsyncScript(function(callback) {
+          let images = document.getElementsByTagName('img');
+          let numLoaded = 0;
+          for (let i = 0; i < images.length; i += 1) {
+            if (images[i].naturalWidth > 0) {
+              numLoaded += 1;
+            }
+          }
+          callback(numLoaded);
+        })
+        .then(function(numLoaded) {
+          expect(numLoaded).toBe(2);
+        });
   });
 });
