diff --git a/src/test/reporters/html.ts b/src/test/reporters/html.ts
index 06ad68a93d..91028169af 100644
--- a/src/test/reporters/html.ts
+++ b/src/test/reporters/html.ts
@@ -229,22 +229,28 @@ class HtmlReporter {
for (const attachment of result.attachments) {
if (attachment.path) {
const sha1 = calculateSha1(attachment.path) + path.extname(attachment.path);
- fs.copyFileSync(attachment.path, path.join(this._resourcesFolder, sha1));
- attachments.push({
- ...attachment,
- body: undefined,
- sha1
- });
+ try {
+ fs.copyFileSync(attachment.path, path.join(this._resourcesFolder, sha1));
+ attachments.push({
+ ...attachment,
+ body: undefined,
+ sha1
+ });
+ } catch (e) {
+ }
} else if (attachment.body && isTextAttachment(attachment.contentType)) {
attachments.push({ ...attachment, body: attachment.body.toString() });
} else {
const sha1 = calculateSha1(attachment.body!) + '.dat';
- fs.writeFileSync(path.join(this._resourcesFolder, sha1), attachment.body);
- attachments.push({
- ...attachment,
- body: undefined,
- sha1
- });
+ try {
+ fs.writeFileSync(path.join(this._resourcesFolder, sha1), attachment.body);
+ attachments.push({
+ ...attachment,
+ body: undefined,
+ sha1
+ });
+ } catch (e) {
+ }
}
}
diff --git a/tests/playwright-test/html-reporter.spec.ts b/tests/playwright-test/html-reporter.spec.ts
new file mode 100644
index 0000000000..cf382bb8c1
--- /dev/null
+++ b/tests/playwright-test/html-reporter.spec.ts
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) Microsoft Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { test, expect } from './playwright-test-fixtures';
+import * as path from 'path';
+
+const kHTMLReporterPath = path.join(__dirname, '..', '..', 'lib', 'test', 'reporters', 'html.js');
+
+test('should not throw when attachment is missing', async ({ runInlineTest }) => {
+ const result = await runInlineTest({
+ 'playwright.config.ts': `
+ module.exports = { preserveOutput: 'failures-only' };
+ `,
+ 'a.test.js': `
+ const { test } = pwt;
+ test('passes', async ({ page }, testInfo) => {
+ const screenshot = testInfo.outputPath('screenshot.png');
+ await page.screenshot({ path: screenshot });
+ testInfo.attachments.push({ name: 'screenshot', path: screenshot, contentType: 'image/png' });
+ });
+ `,
+ }, { reporter: 'dot,' + kHTMLReporterPath });
+ expect(result.exitCode).toBe(0);
+ expect(result.passed).toBe(1);
+});