Reputation: 143
I need to iterate over all iframes and their child iframes on the fly as I want to perform some action on all the <img>
tags. I am using selenium.
public class logic {
static WebDriver driver;
static List<WebElement> TotaliinnerFrames=null;
logic()
{
driver=new FirefoxDriver();
driver.get("aaaa.html");
}
public static void main(String[] args)
{
logic log=new logic();
find_parent_iFrame();
}
private static void find_parent_iFrame()
{
List<WebElement> TotaliFrames = driver.findElements(By.tagName("iframe"));
System.out.println("TotaliFrames\t"+TotaliFrames.size());
for(WebElement frame:TotaliFrames)
{
System.out.println("calling main frame==============================>\t");
findLandingPage(frame);
}
if(TotaliFrames.size()>0)
{
driver.switchTo().defaultContent();
}
else
{
List<WebElement> canvas = driver.findElements(By.tagName("canvas"));
List<WebElement> img = driver.findElements(By.tagName("img"));
List<WebElement> anchor = driver.findElements(By.tagName("a"));
if(canvas.size()>0)
{
System.out.println("inside canvas");
for(WebElement canvTemp : canvas)
{
callClick(canvTemp);
}
}
if(img.size()>0)
{
System.out.println("inside img");
for(WebElement imge : img)
{
callClick(imge);
}
}
if (anchor.size()>0)
{
System.out.println("inside anchor");
for(WebElement anchorc : anchor)
{
callClick(anchorc);
}
}
}
}
private static void findLandingPage(WebElement frame)
{
driver.switchTo().frame(frame);
List<WebElement> canvas = driver.findElements(By.tagName("canvas"));
List<WebElement> img = driver.findElements(By.tagName("img"));
List<WebElement> anchor = driver.findElements(By.tagName("a"));
System.out.println("canvas\t"+canvas.size());
System.out.println("img\t"+img.size());
System.out.println("anchor\t"+anchor.size());
if(canvas.size()>0)
{
System.out.println("inside canvas");
for(WebElement canvTemp : canvas)
{
callClick(canvTemp);
}
}
if(img.size()>0)
{
System.out.println("inside img");
for(WebElement imge : img)
{
callClick(imge);
}
}
if(anchor.size()>0)
{
System.out.println("inside anchor");
for(WebElement anchorc : anchor)
{
callClick(anchorc);
}
}
TotaliinnerFrames = driver.findElements(By.tagName("iframe"));
System.out.println("TotaliinnerFrames\t"+TotaliinnerFrames.size());
int innerframesize=TotaliinnerFrames.size();
if(innerframesize>0)
{
System.out.println("TotaliinnerFrames\t"+innerframesize);
for(WebElement inframe:TotaliinnerFrames)
{
System.out.println("calling inner recursive\t");
findLandingPage(inframe);
}
TotaliinnerFrames.clear();
}
else
{
driver.switchTo().defaultContent();
}
}
private static void callClick(WebElement canvTemp)
{
try
{
canvTemp.click();
}
catch(Exception e)
{
System.out.println("Exception unable to click");
}
}
}
Upvotes: 0
Views: 2393
Reputation: 5113
You can't hold references to WebElement
s across page loads (e.g. initiated by clicks), as they are only valid on their own page. They're not just any old Java object. You will get StaleElementReferenceException
as you've seen.
Work page by page, not across multiple pages.
Edit: here's an even better explanation.
Upvotes: 1