Maniraj Mkr
Maniraj Mkr

Reputation: 143

Using selenium, I need to iterate over all iframes and their child iframes on the fly

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");
    }
}

}

I need to Iterate over all iframe and its child iframe on the fly i want all tags and perform some action. using selenium.

Upvotes: 0

Views: 2393

Answers (1)

Andrew Regan
Andrew Regan

Reputation: 5113

You can't hold references to WebElements 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

Related Questions