0.はじめに
タイトルの通り、以下の記事(Azure DevOpsのドキュメント)にあるサンプルが動かなかったので、ちょっとだけ頑張ったお話。。。
UI test with Selenium
頑張ったといっても、自分はSeleniumを今まで一切やってなかったので、経験値のある人からすればすぐに解決する話なのかもしれないけど・・・
1.やったこと
記事に従ってプロジェクトを作って、ソースをコピーして、テストを実行しただけ。
環境は、以下の通り。
OS: windows 10 x64
IDE: Visual Studio Community 2019
2.サンプルのテスト内容
そもそもサンプルがどういうテストなのか。
サンプルがやっていることは、以下。(もしかしたら微妙に違うかもしれないけど、外部の動作を見たらこんな感じだと思う・・・)
(1) Bingのページ(http://www.bing.com/)を開く
(2) 検索ボックスに「Azure Pipelines」と入力する。
(3) 検索ボタンがクリックされない。
(4) 検索結果のうち、タイトルに「Microsoft Azure」が含まれている最初のリンクをクリック。
(5) 表示したページのタイトルに「Azure Pipelines」が含まれていたらテスト成功。
3.サンプルが動かなかったところ
2つあった。
(1) 検索ボタンがクリックされない。
driver.FindElement(By.Id("sb_form_go")).Click();
のところ。
エラー内容は「OpenQA.Selenium.ElementNotInteractableException: 'element not interactable」。
(2) 検索結果のリンクがクリックされない。
driver.FindElement(By.XPath("//ol[@id='b_results']/li/h2/a/strong[3]")).Click();
のところ。
エラー内容は「OpenQA.Selenium.NoSuchElementException: 'no such element: Unable to locate element: {"method":"xpath","selector":"//ol[@id='b_results']/li/h2/a/strong[3]"}」。
まあ、サンプルが動かない、まあ、ね・・・・稀によくありますよね。
環境とか、いろいろありますから・・・・ねぇぇぇええ・・・・
4.直してみた
Seleniumの勉強をするためにサンプルから学ぼうとしたのに、まさかサンプルの修正から始めることになるとは・・・・
それぞれの問題について、以下のように修正した。結果、デバッガで動かしたときには無事動作した。
(1) 検索ボタンがクリックされない問題
問題の一行を、以下のように修正したら動いた。
//driver.FindElement(By.Id("sb_form_go")).Click();
IWebElement element = driver.FindElement(By.Id("sb_form_go"));
IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
executor.ExecuteScript("arguments[0].click();", element);
JavaScriptで要素をクリックさせる、という処理らしい。色々調べてたら出てきた。
ちなみに、「element not interactable」で調べてみたけど、ちょっと今回のケースには当てはまらない記事が多くて、探すのに時間がかかった・・・・
なんでここでこんなに苦労しなきゃいけないんだ・・・・サンプルのくせに・・・・
もしかして、スパルタで鍛え上げる方針なのか・・・・?
これくらい自分で解決できない奴は、この世界に足を踏み入れるんじゃない、と・・・・?
もっと優しくしてよ・・・
(2) 検索結果のリンクがクリックされない問題
以下のように修正したら動いた。
//driver.FindElement(By.XPath("//ol[@id='b_results']/li/h2/a/strong[3]")).Click();
driver.FindElement(By.XPath("//ol[@id='b_results']/li/h2/a[contains(text(), 'Microsoft Azure')]")).Click();
これは、検索結果のHTMLの構造が変わったのかな?あまり苦労しなかったですね。
エラーメッセージ見るに、「要素みつけられませんでした!!!」って感じだったし。
検索結果のソースを表示して、HTMLの構造見て、「こうやればいけんじゃね?」でなんとか。
自分、XPathもここではじめて知ったので、ちょっと修正に小一時間かかりましたけども。
今まで、JavaScriptとかHTMLとか全然やってなかったから・・・許して・・・
5.まだ解決してないこと
2つある。
(1) コピってきたコードがよくわからない
executor.ExecuteScript("arguments[0].click();", element);
これの、arguments[0]ってのがイマイチよくわからない。
elementはFindElementで取得したIWebDriverのインスタンス?で、インスタンスがリストに入ってるってことなのかな?
それで、0番目の要素をクリックするJavaScriptを実行する、的な・・・?
今度調べてみよう・・・
(2) デバッグじゃないと成功しない
さっき太字で強調した通り、このコード、デバッグじゃないと動かない。
普通に実行すると失敗する。
こういうときは、処理が速すぎて要素の特定とかが追い付いていない印象。
sikulixやってたときも直面した。
適当にwaitとかやれば解決しそうだけど、ちょっと場当たり的な修正って感じがあるような・・・
これも、それっぽいメソッドとかないか調べてみよう・・・・
今日はこんなところ。
はぁ・・・・疲れるなぁ、サンプルなのに・・・・