Capybara で要素が「存在する」「存在しない」をテストする方法

結論

have_selector マッチャを用いる。

expect(page).to have_selector "#submit"
expect(page).not_to have_selector "#cancel"

補足

非表示要素を取り扱う際などは *options で様々な設定が可能です。

chaika.hatenablog.com

Cypress にて「ある要素が持つテキストを配列として取得してその内容をテストする」方法

前提

以下のような HTML があるとして、この4つの文字列を配列として扱い、期待通りであるかどうかをチェックするテストを書きたいとします。

<div class="hoge fuga">ああああ</div>
<div class="hoge fuga">いいいい</div>
<div class="hoge fuga">うううう</div>
<div class="hoge fuga">ええええ</div>

結論

jQuery のメソッドを使います*1

具体的には以下のようになります。

    // jQuery のオブジェクトであることが分かるように、変数名の先頭に $ を付けるのが慣習のようだ
    cy.get('.hoge.fuga').then(($hoge_fuga_elements) => {
      const texts = $hoge_fuga_elements.map((_index, item) => {
        // 各要素に対して jQuery の text() を実行している
        return Cypress.$(item).text()
      })

      // jQuery オブジェクトのラップを外して、単なる文字列が要素となる Array にする
      const gotTexts = texts.get()

      const expectedTexts = [
        'ああああ',
        'いいいい',
        'うううう',
        'ええええ',
      ]

      // Cypress のオブジェクトではないので expect を用いて比較している(そして配列なので deep.equal する)
      expect(gotTexts).to.deep.equal(expectedTexts)
    })
  })
})

補足

  • Cypress では、操作対象のオブジェクトが Cypress のオブジェクト*2なのか、jQuery のオブジェクトなのか、それ以外なのか、を意識することが大切なようです
    • それによってマッチャの選択も変わります
    • theneach などのコールバック関数内では注意が必要です
    • Cypress のオブジェクトに引き戻してやるには wrap メソッドでラップしてあげます
  • コンポーネントのテストも可能になったことで、ここらへんの仕様は今後重要になりそうです

*1:そのために "Cypress.$" を用いています https://docs.cypress.io/api/utilities/$

*2:この表現は正確でないかもしれない

Discord.js でスラッシュコマンドの登録を解除する方法

結論

空のコマンドの配列 [] を登録する。

discord.js Guideこちらのページ の例でいうと、次のようになります(関連箇所だけを抜粋)。

rest.put(Routes.applicationGuildCommands(clientId, guildId), { body: [] })
    .then(() => console.log('Successfully registered application commands.'))
    .catch(console.error);

原文では rest.put(Routes.applicationGuildCommands(clientId, guildId), { body: commands }) としているところ、空の配列を送っています。

ffmpeg を用いて動画のタイトル(メタデータ)を設定する方法

結論

$ ffmpeg -i input_video.mp4 -metadata title="ここに動画のタイトルが入る" -c copy output_video.mp4

確認方法

確認するためには ffprobe コマンドを用います。

$ ffprobe output_video.mp4
(省略)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output_video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    title           : ここに動画のタイトルが入る
(省略)

補足

  • コマンドラインオプションが metadata title=... となっていることから想像がつくように、他のメタデータも同様にして設定できます
  • 動画だけでなく音声も同様にしてメタデータを設定できます
Powered by はてなブログ