diff --git a/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java b/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java
index 474c1f3..e4f2fa3 100644
--- a/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java
+++ b/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java
@@ -31,6 +31,9 @@
 
   @Override
   protected void failed(Throwable e, Description description) {
+    // Grab all the browser logs and print them out.
+    uiTest.printConsoleLogs();
+
     // Take a screenshot for the current screen and write the html report.
     HTMLReportData data = uiTest.getCurrentHTMLReportData();
     Util.takeScreenshot((TakesScreenshot)driver, "test-failed.png", "Test Failed", data);
diff --git a/test/ui/src/test/java/io/v/webdriver/Util.java b/test/ui/src/test/java/io/v/webdriver/Util.java
index b677e80..4fb0d25 100644
--- a/test/ui/src/test/java/io/v/webdriver/Util.java
+++ b/test/ui/src/test/java/io/v/webdriver/Util.java
@@ -14,6 +14,10 @@
 import java.io.FileOutputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Enumeration;
 
 /**
  * Utility functions.
@@ -89,4 +93,27 @@
 
     htmlReportData.addScreenshotData(fullFileName, caption);
   }
+
+  /**
+   * Prints the address of each network interface on the machine.
+   * Taken from http://stackoverflow.com/questions/9481865/getting-the-ip-address-of-the-current-machine-using-java
+   */
+  public static void printIPAddresses() {
+    try {
+      Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
+      while(e.hasMoreElements())
+      {
+          NetworkInterface n = e.nextElement();
+          Enumeration<InetAddress> ee = n.getInetAddresses();
+          while (ee.hasMoreElements())
+          {
+              InetAddress i = ee.nextElement();
+              System.out.println(i.getHostAddress());
+          }
+      }
+    } catch(SocketException e) {
+      System.err.println("Could not print IP addresses");
+      e.printStackTrace();
+    }
+  }
 }
diff --git a/test/ui/src/test/java/io/v/webdriver/VanadiumUITestBase.java b/test/ui/src/test/java/io/v/webdriver/VanadiumUITestBase.java
index 549ecf7..909a6d9 100644
--- a/test/ui/src/test/java/io/v/webdriver/VanadiumUITestBase.java
+++ b/test/ui/src/test/java/io/v/webdriver/VanadiumUITestBase.java
@@ -11,15 +11,24 @@
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.chrome.ChromeDriverService;
 import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.logging.LogEntries;
+import org.openqa.selenium.logging.LogEntry;
+import org.openqa.selenium.logging.LogType;
+import org.openqa.selenium.logging.LoggingPreferences;
+import org.openqa.selenium.remote.CapabilityType;
+import org.openqa.selenium.remote.DesiredCapabilities;
 
 import io.v.webdriver.Util;
 import io.v.webdriver.htmlreport.HTMLReportData;
 import io.v.webdriver.commonpages.ChromeSignInPage;
+import io.v.webdriver.commonpages.CaveatTabPage;
 import io.v.webdriver.commonpages.ExtensionInstallationPage;
 import io.v.webdriver.commonpages.ExtensionOptionPage;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Date;
+import java.util.logging.Level;
 
 /**
  * The base class for all Vanadium UI tests.
@@ -91,6 +100,9 @@
    */
   @Before
   public void setup() throws IOException {
+    // TODO(alexfandrianto): Used to debug the IP address of the machine. Possibly remove.
+    Util.printIPAddresses();
+
     String chromeDriverBin = System.getProperty(PROPERTY_CHROME_DRIVER_BIN);
     botUsername = System.getProperty(PROPERTY_GOOGLE_BOT_USERNAME);
     botPassword = System.getProperty(PROPERTY_GOOGLE_BOT_PASSWORD);
@@ -99,16 +111,25 @@
         .usingAnyFreePort().build();
     service.stop();
     service.start();
+
+    // Set up the ability to grab the console.log from the browser.
+    DesiredCapabilities capabilities = DesiredCapabilities.chrome();
+    LoggingPreferences logPrefs = new LoggingPreferences();
+    logPrefs.enable(LogType.BROWSER, Level.ALL);
+    capabilities.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
+
+    // If an extension was chosen, use that.
     String vanadiumExtensionPath = System.getProperty(PROPERTY_VANADIUM_EXTENSION_PATH);
-    if (vanadiumExtensionPath == null) {
-      driver = new ChromeDriver(service);
-    } else {
+    if (vanadiumExtensionPath != null) {
       ChromeOptions options = new ChromeOptions();
       options.addArguments("load-extension=" + System.getProperty("vanadiumExtensionPath"));
-      driver = new ChromeDriver(service, options);
+
+      capabilities.setCapability(ChromeOptions.CAPABILITY, options);
       hasExtension = true;
     }
 
+    // Create the driver and start using it.
+    driver = new ChromeDriver(service, capabilities);
     driver.manage().window().maximize();
 
     testFailureWatcher.setup(this, driver, service);
@@ -140,6 +161,16 @@
   }
 
   /**
+   * Grab all of the log entries from the browser and print them out.
+   */
+  public void printConsoleLogs() {
+    LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
+    for (LogEntry entry : logEntries) {
+        System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage());
+    }
+  }
+
+  /**
    * Sign in and install the extension, if necessary.
    * A simple wrapper around signIn and installExtension.
    */
@@ -179,4 +210,12 @@
     ExtensionOptionPage extensionOptionPage = new ExtensionOptionPage(driver, reportData);
     extensionOptionPage.go();
   }
+
+  /**
+   * UI tests will commonly need to bypass a caveat page.
+   */
+  protected void handleCaveatTab(HTMLReportData reportData) throws Exception {
+    CaveatTabPage caveatTabPage = new CaveatTabPage(driver, reportData);
+    caveatTabPage.bless();
+  }
 }
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/CaveatTabPage.java b/test/ui/src/test/java/io/v/webdriver/commonpages/CaveatTabPage.java
new file mode 100644
index 0000000..543ad95
--- /dev/null
+++ b/test/ui/src/test/java/io/v/webdriver/commonpages/CaveatTabPage.java
@@ -0,0 +1,96 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.webdriver.commonpages;
+
+import com.google.common.base.Function;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.TakesScreenshot;
+import org.openqa.selenium.TimeoutException;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import io.v.webdriver.RobotHelper;
+import io.v.webdriver.Util;
+import io.v.webdriver.htmlreport.HTMLReportData;
+
+import java.awt.AWTException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+import java.util.Set;
+
+/**
+ * Vanadium extension caveat tab page.
+ *
+ * @author jingjin@google.com
+ */
+public class CaveatTabPage extends PageBase {
+  public CaveatTabPage(WebDriver driver,
+      HTMLReportData htmlReportData) throws UnsupportedEncodingException {
+    super(driver, "", htmlReportData);
+  }
+
+  private static final int WAIT_TIME = 60; // 60s wait time
+
+  public void bless() {
+    log("Waiting for Caveat Tab...");
+    Util.takeScreenshot((TakesScreenshot)driver, "waiting-caveats.png", "Waiting for Caveats", htmlReportData);
+    final String mainTabHandle = driver.getWindowHandle();
+    // Wait until the corresponding tab is there, which means we should get two window handles.
+    // Wait at most 1 minute, then try again once.
+
+
+    String selectCaveatsTabHandle = null;
+    try {
+      log("Attempt #1");
+      selectCaveatsTabHandle = waitForCaveatTab(mainTabHandle);
+    } catch(TimeoutException e) {
+      log("Timeout occurred");
+      e.printStackTrace();
+    }
+    if (selectCaveatsTabHandle == null) {
+      Util.takeScreenshot((TakesScreenshot)driver, "found-caveats.png", "Found Caveats? No", htmlReportData);
+      log("Attempt #2");
+      // Refresh the page and try again.
+      driver.navigate().refresh(); 
+      selectCaveatsTabHandle = waitForCaveatTab(mainTabHandle);
+    } else {
+      Util.takeScreenshot((TakesScreenshot)driver, "found-caveats.png", "Found Caveats? Yes", htmlReportData);
+    }
+
+    driver.switchTo().window(selectCaveatsTabHandle);
+
+    log("Accept blessing");
+    // We need to click on the "Bless" button in the "select caveats" page.
+    WebElement btnBless =
+        wait.until(ExpectedConditions.elementToBeClickable(By.id("submit-caveats")));
+    Util.takeScreenshot((TakesScreenshot)driver, "select-caveats.png", "Selecting Caveats", htmlReportData);
+    btnBless.click();
+    driver.switchTo().window(mainTabHandle);
+  }
+
+  // Attempts to wait until the caveat tab page shows up.
+  // Returns the handle to it.
+  private String waitForCaveatTab(final String mainTabHandle) throws TimeoutException {
+    return new WebDriverWait(driver, WAIT_TIME).until(new Function<WebDriver, String>() {
+      @Override
+      public String apply(WebDriver input) {
+        Set<String> handles = driver.getWindowHandles();
+        if (handles.size() != 2) {
+          return null;
+        }
+        for (String handle : handles) {
+          if (!handle.equals(mainTabHandle)) {
+            return handle;
+          }
+        }
+        return null;
+      }
+    });
+  }
+}
