diff --git a/CHANGELOG.md b/CHANGELOG.md
index cfb6c5e5e85c97035f518bac9212e173b503c2d5..9f8af223019e8cb14d070be2c85dc73edb8d6385 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+### 0.12.0-beta.10
+
+* Fix running browser tests in subdirectories.
+
 ### 0.12.0-beta.9
 
 * A browser test may use a custom HTML file. See [the README][custom html] for
diff --git a/lib/src/runner/browser/server.dart b/lib/src/runner/browser/server.dart
index 17862ebcb7fa4b844b4d49782f8f2a60442c7361..9c58885e1f404e794c461a85a730934a383975a4 100644
--- a/lib/src/runner/browser/server.dart
+++ b/lib/src/runner/browser/server.dart
@@ -206,10 +206,11 @@ void main() {
 
       // Link to the Dart wrapper on Dartium and the compiled JS version
       // elsewhere.
+      var scriptBase =
+          "${HTML_ESCAPE.convert(p.basename(test))}.browser_test.dart";
       var script = request.headers['user-agent'].contains('(Dart)')
-          ? 'type="application/dart" '
-              'src="${HTML_ESCAPE.convert(test)}.browser_test.dart"'
-          : 'src="${HTML_ESCAPE.convert(test)}.browser_test.dart.js"';
+          ? 'type="application/dart" src="$scriptBase"'
+          : 'src="$scriptBase.js"';
 
       return new shelf.Response.ok('''
 <!DOCTYPE html>
diff --git a/pubspec.yaml b/pubspec.yaml
index 3e75b4c4ba913f8a30ed13db03b9637015ecd6d2..6de13bd209de56884930d6b407afb26748ec0b81 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: test
-version: 0.12.0-beta.9
+version: 0.12.0-beta.10
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: https://github.com/dart-lang/test
diff --git a/test/runner/browser/runner_test.dart b/test/runner/browser/runner_test.dart
index 60ec848c71b4fc567e5cee3adf566e7788a48a65..5bad1c55db9965e99c69ec01e7dd49fc888937b3 100644
--- a/test/runner/browser/runner_test.dart
+++ b/test/runner/browser/runner_test.dart
@@ -298,6 +298,15 @@ void main() {
       expect(result.exitCode, equals(0));
     });
 
+    // Regression test; this broke in 0.12.0-beta.9.
+    test("on a file in a subdirectory", () {
+      new Directory(p.join(_sandbox, "dir")).createSync();
+      new File(p.join(_sandbox, "dir", "test.dart"))
+          .writeAsStringSync(_success);
+      var result = _runUnittest(["-p", "chrome", "dir/test.dart"]);
+      expect(result.exitCode, equals(0));
+    });
+
     group("with a custom HTML file", () {
       setUp(() {
         new File(p.join(_sandbox, "test.dart")).writeAsStringSync("""
diff --git a/test/runner/runner_test.dart b/test/runner/runner_test.dart
index 10d64ad94cdc765d276d3cf494ed37876cc37f88..d717b671d62247cc2ec7add3102b85ca989c50f9 100644
--- a/test/runner/runner_test.dart
+++ b/test/runner/runner_test.dart
@@ -286,6 +286,15 @@ $_usage"""));
       ]);
       expect(result.stdout, contains("All tests passed!"));
     });
+
+    // Regression test; this broke in 0.12.0-beta.9.
+    test("on a file in a subdirectory", () {
+      new Directory(p.join(_sandbox, "dir")).createSync();
+      new File(p.join(_sandbox, "dir", "test.dart"))
+          .writeAsStringSync(_success);
+      var result = _runUnittest(["dir/test.dart"]);
+      expect(result.exitCode, equals(0));
+    });
   });
 
   group("runs failing tests", () {