2

そのフレームワークについてもっと学ぶために、Puppeter Sharp で Selenium アプリケーションを書き直しています。私のアプリケーションは、そのソースを変更するためにアクセスできないサイトで実行されています。私はいくつかの情報しか収集していません。

それに基づいて、次のように、 a 内の目的の要素をフィルター処理できる Selenium を使用した関数を作成しましたIEnumerable<IWebElement>

var element = Driver.FindElements(By.Id("User"))
    .First(x => 
           x.Text.ToLower().Trim() == "AAA" &&
           x.FindElement(By.Id("contact")).Text.ToLower().Trim() == "BBB")
    .FindElement(By.XPath("../input"));

しかし、Puppeteer Sharp を使用して同じことを行うコードを書くことができませんでした。私が書いた最も正確なアプローチは次のとおりです。

var users = await Page.QuerySelectorAllAsync("#User");
var baseElement = users.First(async x =>
    (await x.JsonValueAsync<string>()).ToLower().Trim() == "AAA" &&
    (await (await x.QuerySelectorAsync("#contact")).JsonValueAsync<string>()).ToLower().Trim() == "BBB");
var element = await baseElement.XPathAsync("../input");

上記のコードでもエラーが返されます。

非同期ラムダ式をデリゲート型 'Func' に変換できません。

はい、それは理にかなっていますが、linq を使用して、少なくとも読みやすく小さくするための別のアプローチを見つけることができませんでした。

編集

Html の例: 攻撃の名前と種類に基づいて無線入力を返す必要があります。見栄えが悪く、読みにくい xpath を作成してクエリを実行できることは理解していますが、メンテナンスを容易にするために、より読みやすく流暢なアプローチを試みました。

<div id="player">
    <div class="attklist">
        <h2>Choose an Attack</h2>
        <ul>
            <li class="batsel" style="cursor: pointer;">
                <input type="radio" value="1" name="selected" checked="checked" id="atkopt1">
                <label for="atkopt1">Strength
                    <br><span class="tbtn tbtn-normal">normal</span>
                </label>
            </li>
            <li style="cursor: pointer;">
                <input type="radio" value="2" name="selected" id="atkopt2">
                <label for="atkopt2">Strength
                    <br><span class="tbtn tbtn-fighting">fighting</span>
                </label>
            </li>
            <li style="cursor: pointer;">
                <input type="radio" value="3" name="selected" id="atkopt3">
                <label for="atkopt3">Spectre Slash
                    <br><span class="tbtn tbtn-ghost">ghost</span>
                </label>
            </li>
            <li style="cursor: pointer;">
                <input type="radio" value="4" name="selected" id="atkopt4">
                <label for="atkopt4">Fire Puch
                    <br><span class="tbtn tbtn-fire">fire</span>
                </label>
            </li>
        </ul>
    </div>
</div>
4

1 に答える 1