Find elements inside forms and iframe using Java and Selenium WebDriver

JavaIframeSelenium

Java Problem Overview


I'm trying to access elements that are present under <form> <iFrame> <form> elements </form> </iFrame> </form>.

Could you help me on accessing these 'elements', which I'm working with Selenium Webdriver and JAVA?

Issue Encountered: Able to reach the destination page (where the above elements are present), but those elements are not recognized with my code.

Overview of XML structure:

<body>
	<form action="https://abcd/efgh/" name="outerForm" method="post" target="iFrameTitle">
		<iframe width="700" height="600" src="" title="Frame for Java Test" name="iFrameTitle" scrolling="auto" frameborder="0">
			<form id="innerFormID" name="innerForm" action="/xxx/xxxx/yyyy/zzzz/" method="post" autocomplete="off">
				<fieldset id="ncDetailsInner">
					<div id="element1">
						<label for="label1">
						<abbr title="Required field">*</abbr></label>
						<input name="label2" type="text" maxlength="30" id="cardHolder" value="" >
					</div>
		
					<div id="element2">
						<label for="label3">Label3 <abbr title="Required field">*</abbr></label>
						<div id="element3">
							<label for="label4">Label4<abbr title="Required field">*</abbr></label>
							<input id="label5" name="labelname5" type="text" maxlength="19" value="">
						</div>
			
						<div id="element4">
							<label for="label6">Label6</label>
							<input id="label7" name="labelname7" type="text" size="2" maxlength="2" value="" class="text disabled" disabled="">
						</div>
					</div>
				</fieldset>
			</form>	
		
		</iframe>
	</form>
</body>

Code Extract:

WebDriverWait wait_iframe = new WebDriverWait(driver, 20000);

wait_iframe.until(ExpectedConditions.visibilityOfElementLocated((By.id("element2"))));

calling_function(sh1.getCell(col + 10, row).getContents(), 
				sh1.getCell(col + 11, row).getContents(),
				sh1.getCell(col + 12, row).getContents(), 
				sh1.getCell(col + 14, row).getContents());						
			
public static void called_funciton(String string1, String string2,
		String string3, String string4) {
		driver.findElement(By.name("Element1 Name")).sendKeys(string1);
		driver.findElement(By.id("Element2 ID")).sendKeys(string2);
		driver.findElement(By.id("Element3 ID")).sendKeys(string3);
		driver.findElement(By.id("Element4 ID")).sendKeys(string4);
		driver.findElement(By.name("submitButton")).click();
	}

Do let me know if require any further details!

Java Solutions


Solution 1 - Java

Before you try searching for the elements within the iframe you will have to switch Selenium focus to the iframe.

Try this before searching for the elements within the iframe:

driver.switchTo().frame(driver.findElement(By.name("iFrameTitle")));

Solution 2 - Java

When using an iframe, you will first have to switch to the iframe, before selecting the elements of that iframe

You can do it using:

driver.switchTo().frame(driver.findElement(By.id("frameId")));
//do your stuff
driver.switchTo().defaultContent();

In case if your frameId is dynamic, and you only have one iframe, you can use something like:

driver.switchTo().frame(driver.findElement(By.tagName("iframe")));

Solution 3 - Java

On Selenium >= 3.41 (C#) the rigth syntax is:

webDriver = webDriver.SwitchTo().Frame(webDriver.FindElement(By.Name("icontent")));

Solution 4 - Java

By using https://github.com/nick318/FindElementInFrames You can find webElement across all frames:

SearchByFramesFactory searchFactory = new SearchByFramesFactory(driver);
SearchByFrames searchInFrame = searchFactory.search(() -> driver.findElement(By.tagName("body")));
Optional<WebElement> elem = searchInFrame.getElem();

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPraveenKSView Question on Stackoverflow
Solution 1 - JavaSDETView Answer on Stackoverflow
Solution 2 - JavaYouNIC TechnolabsView Answer on Stackoverflow
Solution 3 - JavaQuentin MartinezView Answer on Stackoverflow
Solution 4 - Javanick318View Answer on Stackoverflow