3

私は Selenium WebDriver を使用しており、要素 (ボタンなど) を見つけてクリックするための小さなコードを作成しました。ボタンの HTML コードは次のとおりです。

<input type="submit" name="j_id0:j_id2:j_id3:j_id4:j_id7" value="New Master Health Program" onclick="AddLink()" class="btn">

テスト ケースの C# コードは次のとおりです。

IWebElement newMasterHealthProgramsLink = driver.FindElement(By.Name("j_id0:j_id2:j_id3:j_id4:j_id7"));
newMasterHealthProgramsLink.Click();

XPathも使用してみました:

IWebElement newMasterHealthProgramsLink = driver.FindElement(By.XPath("//input[@id='j_id0:j_id2:j_id3:j_id4:j_id5']"));
newMasterHealthProgramsLink.Click();

これを実装していてはならないという解決策を見つけました。ページは完全に読み込まれるのを待たずに、要素を見つけようとします。そのため、待機コマンドを追加しましたが、何も起こりませんでした。それでも同じエラーが発生します:

TestAutomation.Driver.Login:
OpenQA.Selenium.NoSuchElementException : The element could not be found
4

1 に答える 1

3

要素は IFrame 内にあるため、WebDriver API を使用してその IFrame に「切り替える」必要があります。

デフォルトでは、Selenium は「トップ」フレームを使用するため、「エレメント検索」クエリはすべて最上位フレームに送信され、子 IFrame は無視されます。

これを解決するために、現在の IFrame に「切り替える」と、Selenium がそのフレームにリクエストを押し込むように指示されます。

driver.SwitchTo().Frame()

ID、インデックス (一番上のフレームは 0、次のフレームは 1 など)、または名前のいずれかによって、フレームにアクセスする方法が必要になることに注意してください。

もう1つの注意点は、それ以降のリクエストはそのIFrameに送信され、上部のフレームを含む他のものを無視することです...したがって、上部のフレームにアクセスする必要がある場合は、元に戻す必要があります:

driver.Switch().DefaultContent().

于 2013-02-06T14:45:44.913 に答える