无法在Selenium WebDriver By Name和XPath中找到元素

时间:2013-02-06 11:12:03

标签: c#-4.0 xpath selenium automated-tests selenium-webdriver

我正在使用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();

我找到了一个解决方案,说你一定不能实现等待。页面不等待完全加载并尝试查找元素。所以我添加了wait命令,但没有任何用处。仍然得到同样的错误:

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

1 个答案:

答案 0 :(得分:3)

由于您的元素位于IFrame中,因此您需要使用WebDriver API“切换”到该IFrame。

默认情况下,Selenium将使用“顶部”框架,因此任何“查找元素”查询都将定向到最顶层的框架,并忽略所有子框架。

要解决此问题,“切换”到当前IFrame会指示Selenium将任何请求推送到该帧。

driver.SwitchTo().Frame()

请注意,您需要一种方法来访问框架,无论是通过它的ID,索引(顶部框架是0,下一个框架是否为1等等)或名称。

另一个注意事项是,任何进一步的请求都将被定向到该IFrame,忽略任何其他请求,其中包括最重要的...所以如果您需要访问顶部框架,则需要切换回来:

driver.Switch().DefaultContent()