前回の続き
ishikawa-tatsuya.hatenablog.com
Selenium.Friendly.Blazor を作ったんですが、Windowsアプリ版と違って対象アプリで
- アセンブリを参照しないといけない
- App.razorに少し書き足さないといけない
という点がありました。仕方ないかなーと思ってたんですがtwitterで記事を見てくれた @jsakamotoが2の解決策を教えてくれました!
プロジェクト参照(パッケージ参照)は必須なものの、BINDING.assembly_load("...") でその参照しているアセンブリをロードでき、以降、当該アセンブリに含まれる JSInvokable な static method を JavaScript側から呼び出せることはわかりました。 pic.twitter.com/R3rDFOHRoQ
— @jsakamoto (@jsakamoto) 2022年2月25日
BINDING.assembly_load
BINDING.assembly_loadっていうのでJavaScriptからアセンブリを読み込めるようです。早速やってみました。BlazorAppFriendのコンストラクタに仕込んでみます。
public BlazorAppFriend(object webDriver) { // ※アセンブリをロード! ((dynamic)webDriver).ExecuteScript("BINDING.assembly_load('Selenium.Friendly.Blazor');"); ResourcesLocal.Initialize(); _connector = new FriendlyConnectorCore(webDriver); ResourcesLocal.Install(this); }
コンポーネントの検索
protectedoverridevoid OnInitialized() => Selenium.Friendly.Blazor.BlazorController.Initialize(this);
App.razorでこれを書き足していたのは二つ理由があって
- アセンブリのロード
- App.razorの登録
2はコンポーネントを検索するためのルートのコンポーネントが必要だったので付けてました。何となくどこかにstaticであるような気はしたのですが、どうせ1が解決できてないしなーってことで調査を保留にしてたのですが解決したので探してみました。(そして見つけた。やった!
github.com
Microsoft.AspNetCore.Components.WebAssembly.Rendering.RendererRegistry
が
private static readonly Dictionary
というフィールドを持っていてそこにApp以下Componentが入っていました(今は)
で、これをコンポーネント検索のところで使うとApp.razorの登録なしで検索することができました。
github.com
あとは Assembly を参照せずに読み込ますことができれば完璧!
なんだけど、そんなのできるんかな?
誰かいいアイデアあったら教えてください。