1+ import { test , expect } from '@playwright/test' ;
2+
3+ test . describe ( '記事詳細ページ' , ( ) => {
4+ let articleUrl : string ;
5+
6+ test . beforeEach ( async ( { page } ) => {
7+ // まず記事一覧ページに行き、最初の記事のURLを取得
8+ await page . goto ( '/' ) ;
9+ const firstArticleLink = page . locator ( 'a[href*="/articles/"]' ) . first ( ) ;
10+ await expect ( firstArticleLink ) . toBeVisible ( ) ;
11+ articleUrl = await firstArticleLink . getAttribute ( 'href' ) || '/articles/test' ;
12+ } ) ;
13+
14+ test ( '記事詳細ページが正しく表示される' , async ( { page } ) => {
15+ await page . goto ( articleUrl ) ;
16+
17+ // ページが正常に読み込まれることを確認
18+ await expect ( page ) . not . toHaveTitle ( '404' ) ;
19+
20+ // 記事のコンテンツが存在することを確認(最初に見つかった要素のみ)
21+ const articleContent = page . locator ( 'article' ) . or (
22+ page . locator ( '[data-testid="article-content"]' )
23+ ) . or (
24+ page . locator ( 'main' )
25+ ) . first ( ) ;
26+
27+ await expect ( articleContent ) . toBeVisible ( ) ;
28+ } ) ;
29+
30+ test ( '記事タイトルが表示される' , async ( { page } ) => {
31+ await page . goto ( articleUrl ) ;
32+
33+ // H1タグまたはタイトルが表示されることを確認(最初に見つかった要素のみ)
34+ const title = page . locator ( 'h1' ) . or (
35+ page . locator ( '[data-testid="article-title"]' )
36+ ) . first ( ) ;
37+
38+ await expect ( title ) . toBeVisible ( ) ;
39+ await expect ( title ) . not . toBeEmpty ( ) ;
40+ } ) ;
41+
42+ test ( '記事の日付が表示される' , async ( { page } ) => {
43+ await page . goto ( articleUrl ) ;
44+
45+ // 日付要素が存在することを確認
46+ const dateElement = page . locator ( '[data-testid="article-date"]' ) . or (
47+ page . locator ( 'time' )
48+ ) . or (
49+ page . locator ( '*' ) . filter ( { hasText : / \d { 4 } [ - / ] \d { 1 , 2 } [ - / ] \d { 1 , 2 } / } ) . first ( )
50+ ) ;
51+
52+ // 日付が存在する場合のみテスト
53+ const dateCount = await dateElement . count ( ) ;
54+ if ( dateCount > 0 ) {
55+ await expect ( dateElement . first ( ) ) . toBeVisible ( ) ;
56+ }
57+ } ) ;
58+
59+ test ( '記事の本文が表示される' , async ( { page } ) => {
60+ await page . goto ( articleUrl ) ;
61+
62+ // 記事本文のコンテンツが存在することを確認
63+ const content = page . locator ( 'div' ) . filter ( { hasText : / \w + / } ) . first ( ) ;
64+
65+ await expect ( content ) . toBeVisible ( ) ;
66+ } ) ;
67+
68+ test ( 'ホームページに戻るナビゲーションが機能する' , async ( { page } ) => {
69+ await page . goto ( articleUrl ) ;
70+
71+ // ホームページリンクまたはロゴをクリック
72+ const homeLink = page . locator ( 'a[href="/"]' ) . or (
73+ page . locator ( '[data-testid="home-link"]' )
74+ ) . first ( ) ;
75+
76+ // ホームリンクが存在する場合のみテスト
77+ const homeLinkCount = await homeLink . count ( ) ;
78+ if ( homeLinkCount > 0 ) {
79+ await homeLink . click ( ) ;
80+ await expect ( page ) . toHaveURL ( '/' ) ;
81+ }
82+ } ) ;
83+ } ) ;
0 commit comments