2013-02-06 94 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

相關問題