💡

「LSOpenURLsWithRole() failed for testcafe-browser-tools」の対処法

2021/10/24に公開

はじめに

github actionでosがmacos-latestでtestcafeをremoteブラウザモードで実行する時にこんなエラーに遭遇したことないだろうか?

この記事はこれの解決策になりうるかもしれない。

test_macos.sh
export HOSTNAME=localhost
export PORT1=1337
export PORT2=1338

testcafe remote test.js --hostname ${HOSTNAME} --ports ${PORT1},${PORT2} &
pid=$!
open -a /Applications/Firefox.app http://${HOSTNAME}:${PORT1}/browser/connect
wait $pid
Connecting 1 remote browser(s)...
Navigate to the following URL from each remote browser.
Connect URL: http://localhost:1337/browser/connect
CONNECTED Safari 14.1.2 / macOS 10.15.7
ERROR NativeBinaryHasFailedError: The find-window process failed with the 1 exit code.
Process output:
LSOpenURLsWithRole() failed for the application /Users/runner/work/sample/node_modules/testcafe-browser-tools/bin/mac/TestCafe Browser Tools.app/Contents/MacOS/testcafe-browser-tools with error -10810.

このエラーは何?

MATLABの公式ホームページの回答に以下のような記述を見つけた。日本語訳して引用すると、

このエラーは、MacOS Catalina10.15のネットワーク上の場所またはその他の保護された場所から署名されていない実行可能ファイルを実行しようとしたときに発生します。これはオペレーティングシステムの新機能であり、MacOSマシンに移動されたファイルが正常に実行されないようにすることができます。

こちらのエラーは署名されていない「TestCafe Browser Tools.app」を実行しようとした時に出ると思われるエラーであると思われる。

解決策

署名されているか調べてみよう。codesignコマンドを使って調べる事ができる。

$ codesign -dv -r- ./node_modules/testcafe-browser-tools/bin/mac/TestCafe\ Browser\ Tools.app
./node_modules/testcafe-browser-tools/bin/mac/TestCafe Browser Tools.app: code object is not signed at all

確かに署名されていないようだ。署名されていない状態はどういう状態かというと TestCafe\ Browser\ Tools.app/Contents/_CodeSignature ディレクトリが存在していない状態である。

無理やり署名してみる。それには「アドホック署名」と言われる方法を使うと良い。

$ sudo codesign -fs - ./node_modules/testcafe-browser-tools/bin/mac/TestCafe\ Browser\ Tools.app --deep

先ほどのコマンドで署名されたか調べてみると、

$ codesign -dv -r- ./node_modules/testcafe-browser-tools/bin/mac/TestCafe\ Browser\ Tools.app
Executable=/Users/yukihirop/JavaScriptProjects/sample/node_modules/testcafe-browser-tools/bin/mac/TestCafe Browser Tools.app/Contents/MacOS/testcafe-browser-tools
Identifier=com.devexpress.testcafe-browser-tools
Format=app bundle with Mach-O thin (x86_64)
CodeDirectory v=20100 size=1206 flags=0x2(adhoc) hashes=32+3 location=embedded
Signature=adhoc
Info.plist entries=15
TeamIdentifier=not set
Sealed Resources version=2 rules=13 files=1
# designated => cdhash H"********************" or cdhash H"*****************"

となって署名された。この時TestCafe\ Browser\ Tools.app/Contents/_CodeSignatureディレクトリが生成されている事が確認できるはずである。

GitHub Actionでの書き方

jobs:
  e2e-macos:
    name: E2E MacOS
    runs-on: macos-latest
    steps:
       # 省略
       run: sudo codesign -fs - ./node_modules/testcafe-browser-tools/bin/mac/TestCafe\ Browser\ Tools.app --deep && sleep 5
       run: /bin/bash ./test_macos.sh

codesignでの署名の後5秒くらい待つようにしているのは、TestCafe\ Browser\ Tools.app/Contents/_CodeSignature ディレクトリ配下のファイルが生成されるのを待つためである。待つ事なしにテストを実行すると、TestCafe\ Browser\ Tools.appが署名されてない状態で呼び出してしまうのかLSOpenURLsWithRole()エラーが起こる事が多々あった。テストの安定のためにも何秒かは待つようにしたがいいと思われる。

参考

https://stackoverflow.com/a/63355065/9434894

https://jp.mathworks.com/matlabcentral/answers/460920-why-do-i-get-the-error-lsopenurlswithrole-failed-with-error-10810-when-trying-to-install-matlab

https://wiki.lazarus.freepascal.org/Code_Signing_for_macOS

https://apple.stackexchange.com/a/166282

Discussion