投稿者 えんぴー  (社会人) 投稿日時 2024/5/16 13:08:27
魔界の仮面弁士様

回答ありがとうございます。
大文字のPREですね、失礼しました。



 IJavaScriptExecutor jsExecutor = (IJavaScriptExecutor)driver;
 jsExecutor.ExecuteScript("$(arguments[0]).change();", selectElement3);//変わらず
 jsExecutor.ExecuteScript("arguments[0].dispatchEvent(new Event('change'))", selectElement3);//変わらず
 jsExecutor.ExecuteScript("$(arguments[0]).trigger('select')");//変わらず
 jsExecutor.ExecuteScript("$(arguments[0]).trigger('change.select2');", selectElement3);//変わらず



>選択結果を受け取れる select2:select イベントなら .trigger({type:'select2:select',params:{data:data}})
これについては、dataをどのようにしたら良いかわからずテスト出来ませんでした。

どうにもHTML側(JQuery側)が分かってないので動作できなさそうです。
select2も良く分かっておらず申し訳ありません。

ただ、1つだけ兆しが見えました。

 driver.FindElement(By.XPath("//*[@id=\"select2-SelectID-results\"]/li[2]")).Click();



このIDは、プルダウンをクリックしたときに動的?に作られるもののようです。
これを実行したら、2つ目のリストが選択されて連動するリストも自動選択されました!

ただ、選択したいのがリスト何番目にあるのか、簡単には取得できなさそうでした。

また、【1】の所で、なぜかSendkeyがエラーになります。
ググッてそのまま利用させていただいている要素待機やwaitも効果がありませんでした。
OpenQA.Selenium.ElementNotInteractableException: 'element not interactable

ただ、クリックして要素を表示することができれば
「select2-SelectID-results」というIDが表示されます。
このIDをもとに
「」というXPASHをClickすると、連動して選択されることがわかりました。

問題点としては
・ID「SelectID」の要素クリックに失敗する(SelectElementのSelectByTextは出来てる)
 ※クリックできれば「」のIDが表示になる
 OpenQA.Selenium.ElementNotInteractableException: 'element not interactable

・要素表示待ちを組み込んでみたが、上記エラーが変わらない

・select2-SelectID-resultsのリスト一覧およびリスト番号が分からない




//-------一部抜粋-----
                SelectElement selectElement3 = new SelectElement(driver.FindElement(By.Id("SelectID")));
                selectElement3.SelectByText(AfterTenS);//問題なくデータ入力できてる
                pagewait();
               
                var ClickData = driver.FindElement(By.Id("SelectID"),1000);
                ClickData.SendKeys(OpenQA.Selenium.Keys.Enter);//なぜかSendKeysがエラーになる【1】
                pagewait();
                driver.FindElement(By.XPath("//*[@id=\"select2-SelectID-results\"]/li[2]")).Click();// 4

//------------

//待機用
        static void pagewait()
        {
            //</html>を見つけるまで待機
            try
            {
                WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(0.01));
                IWebElement firstResult = wait.Until(e => e.FindElement(By.XPath("/html")));

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

        }





別のクラス
    public static class WebDriverExtensions
    {
        public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
        {
            if (timeoutInSeconds > 0)
            {
                var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
                return wait.Until(drv => drv.FindElement(by));
            }
            return driver.FindElement(by);
        }
    }