定年後にWeb開発者目指す 2019年1月から学習開始 2023-08-28T12:16:26Z https://software.pitang1965.com/feed/atom/ WordPress https://software.pitang1965.com/wp-content/uploads/2021/06/cropped-yama512-32x32.png pitang1965 https://pitang1965.gatsbyjs.io/ <![CDATA[PlaywrightでMac OSの外観モードの切り替えはできる?]]> https://software.pitang1965.com/?p=4413 2023-08-24T09:15:38Z 2023-08-24T13:00:00Z 概要
  • Mac OSの外観モード(ライトモードやダークモード)の切り替えを自動でおこないスクリーンショットを取ることをPlaywrightを使ってできないかについて調べたメモです。

結論

  • Chromeに関してはchromium.launchにより、外観モードを切り替えることが可能です。
  • ただし、この方法はPlaywright Test(@playwright/tetからインポートしたtest)を用いた標準的な方法ではなく、素のAPIを使用した方法となります。
  • Playwrightでは、ブラウザ(Chroimum, firefox, webkit)はプロジェクトの選択によって切り替えるのが通常の方法です。
  • この切り替えの選択肢に、以下のようにダークモードのChromeとライトモードのChromeを、playwright.config.ts の設定により追加するのがよいと思われます。
/* Configure projects for major browsers */
projects: [
    {
  name: 'chromium',
  use: { ...devices['Desktop Chrome'] }
},
    {
  name: 'chrome-dark',
  use: { ...devices['Desktop Chrome'], colorScheme: 'dark' }
},
    {
  name: 'chrome-light',
  use: { ...devices['Desktop Chrome'], colorScheme: 'light' }
},
    
:

実行方法

  • VSCodeのテスト エクスプローラーから[プロファイルを使用して実行します …]をクリックし、chrome-darkやchrome-lightを選択する。
プロファイルを使用して実行します ... コマンド
  • または、以下のコマンドを使用します。
npx playwright test --project=chrome-dark
]]>
0
pitang1965 https://pitang1965.gatsbyjs.io/ <![CDATA[Playwrightでちょっと待ってからスクリーンショットを取る方法]]> https://software.pitang1965.com/?p=4409 2023-08-24T08:45:44Z 2023-08-24T12:20:00Z 概要
  • Playwrightを用いて、コードでプルダウンメニューを切り替えた結果のスクリーンショットを保存させたら、プルダウンメニューが閉じる前のスクリーンショットとなってしまいました。
  • プルダウンメニューを切り替え、メニューが閉じた後の状態のスクリーンショットを取得できるようにするための対策のメモです。

結果

  • 次の末尾の2つのawaitの行のように2段構えとしまし。
    • セレクタ(この場合はclass)の出現又は消去(この場合は消去)を待つ
    • 更に一定時間待機する
  • 1段目だとうまくいかなかったのですが、おそらくアニメーション効果のせいかなと思っています。
// ドロップダウンの切り替え
async function selectDropdownOption(page, selectorTestId, buttonText) {
  await page.getByTestId(selectorTestId).locator('svg').click();
  await page
    .locator('div')
    .filter({ hasText: new RegExp(`^${buttonText}$`) })
    .first()
    .click();
  await page.waitForSelector('.n-base-selection:not(.n-base-selection--active)');
  await page.waitForTimeout(200);
}

スクリーンショットの保存

  • スクリーンショットの保存自体はpage.screenshotで可能です。つまり、上記の関数を呼んだ後に、次を呼ぶ感じです。
await page.screenshot({path: 'screenshot.png'}); // ルートフォルダに保存される。
  • スクリーンショットの保存については公式文書に記載がありますが、以下が可能です。
    • 全画面のスクリーンショット。
    • スクロール可能な全ページのスクリーンショット。
    • 要素のスクリーンショット。
    • 画像ファイルでなくバッファにキャプチャ。
      • そこからbase64の出力などができる。
  • 保存先がルートフォルダなので、変更したい場合は例えば次のようにします。
  const screenshotFolder = isDarkMode ? 'test-results/dark' : 'test-results/light';

  // 条件1
  await selectDropdownOption(page, 'theme-color-selector', 'ライトモード');
  await selectDropdownOption(page, 'editor-color-selector', 'テーマカラーと連動する');
  await page.screenshot({ path: `${screenshotFolder}/1.png` });

  // 条件2
  await selectDropdownOption(page, 'theme-color-selector', 'ダークモード');
  await selectDropdownOption(page, 'editor-color-selector', 'テーマカラーと連動する');
  await page.screenshot({ path: `${screenshotFolder}/2.png` });
]]>
0
pitang1965 https://pitang1965.gatsbyjs.io/ <![CDATA[Playwrightに入門しました]]> https://software.pitang1965.com/?p=4403 2023-08-28T12:16:26Z 2023-08-24T10:47:00Z 概要
  • Playwrightを今週触り始めた初心者です。
  • ダークモードなどアプリのテーマ対応のテストに使えるかなと思い触りました。
  • 使い始めて気がついた点をメモしました。

結論

  • 各種のブラウザ操作を表示又は非表示で、コードから操作し、テストやテスト以外のことに使える。
  • テストを実行するにはコードが必要であるが、ブラウザを操作すると操作履歴がコードに落ちるのでテストを迅速に開発するのに役立てることができる。
  • とはいえ、色々ノウハウが必要そうである。今回最初に気がついた点をいくつかメモします。

Playwright Testとは?

  • Playwright Testは、エンドツーエンドテストのニーズに対応するために特別に作成されました。
  • Playwrightは、Chromium、WebKit、Firefoxを含むすべての最新のレンダリングエンジンをサポートしています
  • Windows、Linux、macOS上で、ローカルまたはCI上で、Google ChromeおよびSafariのエミュレータを使用して非表示(ヘッドレス)または表示しながらテストできます。

入門方法

  • 公式文書で以下くらいをまず読みます。本記事ではそこに書いてあることは基本説明しません。
    • Getting Started
    • Getting started – VS Code
  • 任意のプロジェクトで以下を実施します。
$ pnpm create playwright
  • サンプルのテストコードで、色々試します。最初、以下等のコマンドを実行してみます。
    • 公式文書では、コマンドをnpm 又は npx で実行しています。npxで説明しているところpnpxで試したら動かないことがありました。公式文書どおりにやるほうが無難かもしれません。
$ pnpm exec playwright test
    エンドツーエンドのテストを実行します。

$ pnpm exec playwright test --ui
    インタラクティブな UI モードを起動します。

$ pnpm exec playwright test --project=chromium
    Desktop Chrome でのみテストを実行します。

$ pnpm exec playwright test example
    特定のファイルでテストを実行します。

$ pnpm exec playwright test --debug
    デバッグモードでテストを実行します。

$ pnpm exec playwright codegen
    Codegen を使ってテストを自動生成します。
  • サンプルのテストについて、コマンドではなくVSCodeの拡張機能を入れると追加されるテストエクスプローラを用いて各種実行します。
  • その後、独自のテストを試します。
VSCodeからのPlaywrightの実行

実際に使いはじめて気づいた点など

  • 適切なロケータが出るための工夫が必要なことがある。
    • ロケータとは、ウェブページ上の特定の要素を特定・選択するための識別子や構造。例:id, class, クラスセレクタ、タグ。
    • ロケータはツールがよさげなやつを提案してくれるが、提案されたやつが画面のどこかわからないことがある。
    • 同じコンポーネントを複数使っている場合など、どちらのコンポーネントなのかをテストコードを見ても、判別できなかったりする。
    • 対応策として、例えば次のようにする。ここでのdata-testidはテストにしか使われない(影響しない)。
<n-select v-model:value="themeColor" :options="themeColorOptions" />
    ↓
<n-select v-model:value="themeColor" :options="themeColorOptions" data-testid="theme-color-selector" />
  • アクションを記録すると冗長になりがち。適宜関数化する。
    • VSCodeのテストエクスプローラの[Record new]や[Record at cursor]ボタンをクリックしたあとのブラウザ操作がコードに落ちるが、冗長になることがある。
    • 例:次のようにドロップダウンの切り替えについて1行で記述できるように関数化する。
// ドロップダウンの切り替え
async function selectDropdownOption(page, selectorTestId, buttonText) {
  await page.getByTestId(selectorTestId).locator('svg').click();
  await page
    .locator('div')
    .filter({ hasText: new RegExp(`^${buttonText}$`) })
    .first()
    .click();
    }


// 条件1
await selectDropdownOption(page, 'theme-color-selector', 'ライトモード');
await selectDropdownOption(page, 'editor-color-selector', 'テーマカラーと連動する');
// なにかテスト

// 条件2
await selectDropdownOption(page, 'theme-color-selector', 'ダークモード');
await selectDropdownOption(page, 'editor-color-selector', 'テーマカラーと連動する');
// なにかテスト
  • 要素の色を確認するテストは難しいことがある。
    • 次のような関数を用いて背景色を確認できる場合があるがが、うまくいかないこともある。
// 背景色の確認
async function expectBackgroundColor(page, selector, expectedColor) {
  const bgColor = await page.$eval(selector, (el) => {
    return getComputedStyle(el).backgroundColor;
  });
  expect(bgColor).toBe(expectedColor);
}
  • 例えば次のような場合である。
    • 色をCSS変数を用いている場合は上記方式が使用できない。
    • CSS変数の値が16進数で、得られる値がRGBの場合は変換が必要。
    • CSSがRGBでなくRGBA(透明度を指定)の場合は、実際の色は背景の色との掛け合わせになるので評価が難しい。
      • 複雑な計算で実際の色を出す。
      • RGBAの透明度の部分を無視して比較する。

これ以外にも何かと壁にぶつかり、ノウハウが必要がことがわかりました。別記事に書く予定です。

]]>
0
pitang1965 https://pitang1965.gatsbyjs.io/ <![CDATA[Sassを用いたデザインファイルを live serverで見る方法]]> https://software.pitang1965.com/?p=4397 2023-08-21T07:40:47Z 2023-08-21T11:30:00Z やりたかったことと概要
  • Sassを用いたHTMLファイルをVSCode環境からブラウザでの表示状態を確認したい。
  • そのためにVSCode拡張機能のLive Serverを用いる方法について調査した。
  • Live Sass Compiler (Glenn Marks)というVSCode拡張機能を使えばよい。

前提

  • 複数の.sassファイルが提供されている。
  • app.scssが提供されていて、そこでは次の調子で各scssファイルがインポートされている。
@import "./style.scss";
@import "./darkmode.scss";
:
  • 各htmlファイルは、./css/app.cssを用いてスタイリングをおこなっている。
<link rel="stylesheet" href="./css/app.css">

結果と注意点

  • ダウンロードしたhtmlからスタイルが適用された状態をLive Serverから表示できた。
    • 指定したフォルダに、各sassファイルがコンパイルされたcssファイルが生成された。
  • ただし、ダウンロードしたsassファイルがLive Sass Compilerでエラーが起きた場合は、これを解消しないとapp.cssが生成できない
    • おこなったsassファイルの修正が妥当である必要がある。

インストール

設定

setting.json

  "liveSassCompile.settings.formats": [
    {
      "format": "expanded", <-- ここをcompressedに変更するか、変更した設定を配列に追加すれば、圧縮されたCSSが生成できる。
      "extensionName": ".css",
      "savePath": "/任意の場所/css",
    }
  ]

.gitignore

お好みで以下の設定をおこなう。

任意の場所/css/*.css
任意の場所/css/*.map

参考


Live SASS Compiler v6.0 – Deep dive – Installation, Intro, Settings & Commands
]]>
0
pitang1965 https://pitang1965.gatsbyjs.io/ <![CDATA[React NativeでGoogle Mapを表示する]]> https://software.pitang1965.com/?p=4355 2023-07-30T06:30:44Z 2023-07-30T05:37:32Z 概要

Google Maps APIを使用してAndroidアプリを作成する基本的な手順をメモします。

  1. Google Cloud Platformのプロジェクトを作成
  2. Google Maps APIを有効化
  3. APIキーの取得
  4. Google Maps APIの利用

Google Cloud Platformのプロジェクトを作成

私は既にGoogle Cloud Platform (GCP)のアカウントがありましたが、アカウントを作成する手順から説明します。

  1. Google Cloud Platform のアカウントを作成する。
  2. GCPのアカウントにログインします。
    • 上記の続きの場合は既にログインしています。
  3. 新しいプロジェクトを作成します。
    • 下図の[新しいプロジェクト]をクリックします。
    • プロジェクト名を入力する。

Google Maps APIを有効化

  1. さきほど作ったプロジェクトを同じダイアログボックスで選択する。
  2. クイックアクセス又はナビゲーションメニューから[APIとサービス]を選択する。
  3. [+ APIとサービスの有効化]をクリックする。
  4. APIライブラリから以下のAPIを検索し、有効化する。全体に対してAPIキーが発行されるので、どこか安全なところにメモしておく。
    • Places API (New)
    • Maps Elevation API
    • Geolocation API
    • Maps JavaScript API
  5. 認証情報の[APIの制限」で、上記4のAPIにキーを制限する。
  6. [保存]ボタンをクリックする。設定が有効になるまで最大で5分かかるらしい。

Google Maps APIの利用

  1. 課金を有効にする
    • 「課金を有効にする」のガイドを参考に、 [お支払い]ページに移動する。
    • プロジェクトを選択する。
    • [予算とアラート]を開く。
    • [+予算を作成] をクリックする。
    • [名前] フィールドに、予算の名前を入力する。
    • [目標金額]を設定する。例:0円
  2. APIキーの制限を設定する
    • ナビゲーションメニューから[APIとサービス]の[認証情報]を選択する。
    • Maps API Keyをクリックする。
    • 「アプリケーションの制限の設定」を「Androidアプリ」にする。
    • [保存]をクリックする

Google Mapをプロジェクトに追加するコード

プロジェクトの作成

以下のコマンドで生成します。

$ yarn create expo-app MyProject

React Nativeの設定

iOS及びAndoroidのためのReact Native Mapviewコンポーネントの react-native-maps をインストールする。

$ yarn add react-native-maps

APIキーの設定

app.jsonandroidの下に次の様に設定します。

      "config": {
        "googleMaps": {
          "apiKey": "xxxxx"
        }
      }

MapViewの追加

ホーム画面にGoogle Mapを表示するためのコードは例えば次になります。

import { StatusBar } from 'expo-status-bar';
import { StyleSheet, Text, View } from 'react-native';
import MapView, { PROVIDER_GOOGLE } from 'react-native-maps';

export default function App() {
  return (
    <View style={styles.container}>
      <Text>Chill Parking</Text>
      <MapView
        style={styles.map}
        provider={PROVIDER_GOOGLE}
        initialRegion={{
          latitude: 35.714,
          longitude: 139.4256,
          latitudeDelta: 0.0461,
          longitudeDelta: 0.0210,
        }}
      />
      <StatusBar style='auto' />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
  map: {
    width: '100%',
    height: '80%',
  },
});
MapView
]]>
0