5

I need to get the result from the table "td". But before I can do that I need to navigate a frame that contains it. The frame is one of the frameset elements that belongs to the mainFrame. I tried to use all types of navigating the "child" subframe non of which works:

 driver.switchTo().defaultContent();
    Thread.sleep(1000);
     driver.switchTo().frame("mainFrame.0.fr_resultsNav~ResultsMaxGroupTemplate0.9766101221774707");
    driver.switchTo().frame("main.Frame.1.fr_resultsNav~ResultsMaxGroupTemplate0.8811790466176727");

// even: driver.switchTo().frame("mainFrame.0.fs_main");

The following is the brief layout of the webpage:

<frame src="banner.asp" name="topFrame" scrolling="no" noresize="noresize" id="topFrame" title="topFrame">

<frame src="" name="mainFrame" id="mainFrame" title="mainFrame" wd_frame_id_="5f4c10bc7e0960070bfda831655b8b0c">

    <frameset id="fs_main" border="0" frameborder="no" framespacing="0" rows="70,87,*">
.....................

        <frameset id="fs_content" cols="23%,*" framespacing="0" frameborder="no">
.....................
            <frameset cols="*,9" id="LeftFrameSet" framespacing="0" frameborder="no">
.....................
            <frame frameborder="0" name="fr_classification~ResultsMaxGroupTemplate0.609021034867735" title="Results Classification Frame" id="fr_classification~ResultsMaxGroupTemplate0.609021034867735" src="/lnacui2api/results/shared/waitMessage.do?wmibIdRand=61_T16938265013_rand_1363544453847" scrolling="Auto" onload="paintResultsBorder('ResultsMaxGroupTemplate0.609021034867735');">

....................

<form name="results_listview_ResultsListForm" method="post" action="/lnacui2api/results/listview/listview.do" id="results_listview_ResultsListForm">

..........

<td nowrap="" height="20"> <span id="new">&nbsp;All Results</span> (294)</td>
</form>

....................

Do I need to navigate the frameset before I can navigate a subframe? I read the documentation. All internet examples give a simple sample code: driver.switchTo().frame("mainFrame.0.child"). It does not work in this case. Please, take a look at the above script.

Buras
  • 3,069
  • 28
  • 79
  • 126

4 Answers4

10

I agree, you cannot directly switch to a child frame. Also, make sure to switch to the defaultContent (driver.switchTo.defaultContent) every time you want to switch frame. With regard to your example, driver.switchTo().frame("mainFrame.0.child") --- this could also work, but you need to get rid of unnecessary quotation marks.

Brandon Barney
  • 2,382
  • 1
  • 9
  • 18
CHEBURASHKA
  • 1,623
  • 11
  • 53
  • 85
  • 3
    Thanks! Switching back to the default content before switching to a new frame is key. For anyone working in python, the corresponding method is: `driver.switch_to_default_content()` – salo.dm Jun 19 '13 at 05:49
  • @CHEBURASHKA, link is not working. Can you please update? – zishan paya Jan 12 '16 at 10:53
8

Find the index of main frame starting from zero then use

driver.switchTo.frame(mainFrameindex);

Then find the index of sub frame in the main frame

driver.switchTo.frame(subFrameIndex);

You cannot directly switch to a child frame without first switching to the parent frame. This is how it works.

Code Enthusiastic
  • 2,827
  • 5
  • 25
  • 39
  • will this work with IFrames? I have a list of both mixed: List frames = driver.findElements(By.xpath("//iframe")); frames.addAll(driver.findElements(By.xpath("//frame"))); – White_King Feb 24 '19 at 12:21
3

Through chaining methods together, once you switchTo().defaultContent, you can create temporary lists of available frames through findElements() by tagName and go to that specific frames' index...

For example

driver.switchTo()defaultContent();
driver.switchTo().frame(driver.findElement(By.tagName("frameset")).findElements(By.tagName("frame")).get(2));
sirandy
  • 1,834
  • 5
  • 27
  • 32
Ryan
  • 31
  • 1
  • worked for me.! In my case I need to locate to nested frame: driver.switchTo().frame(driver.findElement(By.tagName("frameset")).findElements(By.tagName("frame")).get(1)); // switch to the second frame in main page driver.switchTo().frame(driver.findElement(By.tagName("frameset")).findElements(By.tagName("frame")).get(0)); //switch to the nested frame – hoapham Apr 17 '20 at 05:25
1

You can switch directly to the frame you want with the xPath. Get the Xpath through the Developer console, then:

driver.switch_to.frame(driver.find_element_by_xpath('html / frameset / frameset / frame[1]'))

Alg_D
  • 2,242
  • 6
  • 31
  • 63
  • 1
    Doesn't seem to work for me. The course I'm taking tells you cannot do that. Others on similar questions say you cannot do that. My trials seem to go this way. – 猫IT Apr 29 '19 at 23:10
  • I also find that this does NOT work.... my target is of the form: `html/frameset/frameset[1]/frame[2]`. – Yan King Yin Mar 17 '21 at 17:43