如何使用Selenium WebDriver在框架集中导航子框架?

如何使用Selenium WebDriver在框架集中导航子框架?,selenium,frame,Selenium,Frame,我需要从表“td”中得到结果。但在此之前,我需要浏览一个包含它的框架。框架是属于大型机的框架集元素之一。我尝试使用所有类型的导航“子”子帧,其中不包括: driver.switchTo().defaultContent(); Thread.sleep(1000); driver.switchTo().frame("mainFrame.0.fr_resultsNav~ResultsMaxGroupTemplate0.9766101221774707"); driver.

我需要从表“td”中得到结果。但在此之前,我需要浏览一个包含它的框架。框架是属于大型机的框架集元素之一。我尝试使用所有类型的导航“子”子帧,其中不包括:

 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");
以下是网页的简要布局:

<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>

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

.....................
.....................
.....................
....................
..........
所有结果(294)
....................

在导航子帧之前,是否需要导航帧集?我看了文件。所有internet示例都给出了一个简单的示例代码:driver.switchTo().frame(“mainFrame.0.child”)。在这种情况下它不起作用。请看一下上面的脚本。

找到从零开始的主框架索引,然后使用

driver.switchTo.frame(mainFrameindex);
然后在主框架中找到子框架的索引

driver.switchTo.frame(subFrameIndex);

如果不先切换到父帧,则无法直接切换到子帧。这就是它的工作原理。

我同意,您不能直接切换到子帧。另外,确保每次要切换帧时都切换到
defaultContent
driver.switchTo.defaultContent
)。对于您的示例,
driver.switchTo().frame(“mainFrame.0.child”)
——这也可以工作,但需要去掉不必要的引号。

您可以使用xPath直接切换到所需的帧。 通过开发人员控制台获取Xpath,然后:


driver.switch_to.frame(driver.find_element_by_xpath('html/frameset/frameset/frame[1])
通过将方法链接在一起,一旦
switch to().defaultContent
,您就可以通过findElements()按标记名创建可用帧的临时列表,并转到特定帧的索引

比如说

driver.switchTo()defaultContent();
driver.switchTo().frame(driver.findElement(By.tagName("frameset")).findElements(By.tagName("frame")).get(2));

谢谢在切换到新帧之前切换回默认内容是关键。对于任何使用python的人,相应的方法是:
driver.switch_to_default_content()
@CHEBURASHKA,link不起作用。你能更新吗?这对IFrames有用吗?我有两个混合的列表:list frames=driver.findElements(By.xpath(“//iframe”);frames.addAll(driver.findElements(By.xpath(“//frame”));似乎对我不起作用。我所学的课程告诉你不能那样做。其他回答类似问题的人说你不能这么做。我的试验似乎是这样的。我还发现这不起作用。。。。我的目标是这样的:
html/frameset/frameset[1]/frame[2]
。为我工作。!在我的例子中,我需要定位到嵌套帧:driver.switchTo().frame(driver.findElement(By.tagName(“frameset”)).findElements(By.tagName(“frame”)).get(1));//切换到主页面driver.switchTo().frame(driver.findElement(按.tagName(“frameset”)).findElements(按.tagName(“frame”)).get(0))中的第二个框架//切换到嵌套帧