2013-02-06 100 views
3

我正在使用Selenium WebDriver并编写了一个小代码来查找和元素(即按钮)并单击它。 这里是按钮的HTML代码:无法在Selenium WebDriver中按名称和XPath查找元素

<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 
+0

它是否在iFrame中?你尝试完全绕过名称,并使用XPath:'//输入[@值='新的硕士健康计划']'? – Arran

+0

是在iFrame中。而这个XPath也不起作用。 – asma

+0

然后,您需要使用'SwitchTo.Frame(“iframeID”)'将焦点切换到该iFrame。 Selenium会查询顶部框架,除非您另行说明,否则将无法找到子框架中的任何内容。 – Arran

回答

3

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

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

为了解决这个问题,'切换'到当前的IFrame指示Selenium将任何请求都推送到该帧。

driver.SwitchTo().Frame()

请注意,您需要访问帧的方式,无论是它的ID,索引(顶部框架是0,下一帧下来就是1,等...)或名称。

另一个值得注意的是,任何进一步的请求将被定向到该iframe,忽略任何人,包括最上面的一个......所以如果你需要访问顶部框架,你需要切换回:

driver.Switch().DefaultContent()

+0

谢谢Arran ..这做了伎俩,现在的工作与我的预期相同。 – asma

相关问题