1

我一直在使用 Selenium(Webdriver 2.32,带有 Perl 绑定 Selenium::Remote::Driver 0.16)来成功导航基于框架的应用程序“F”:

<frameset rows=35,*>  // divide page two rows, 35px and remainder high
    <frame name="Header">  // top row is Header
    <frameset cols=182,*>  // divide second row into two columns, 182px and remainder wide
        <frame name="TOC">  // left column is TOC
        <frameset rows=*,0,0>  // right column two hidden rows
            <frame name="Main">  // (top) row is Main content
            <frame name="HiddenFrame">  // hidden stuff
            <frame name="UploadFrame">  // hidden stuff

首次进入页面时,我调用$drv->switch_to_frame(); $drv->switch_to_frame('TOC');以转到目录,在其中单击重新加载主要内容的链接。然后我打电话给$drv->switch_to_frame(); $drv->switch_to_frame('Main');我可以在主要内容中做事的地方。

现在我需要浏览一个稍微不同的页面“H”,但它不起作用:

<frameset rows=115,*>  // divide page two rows, 115px and remainder high
    <frame name="Header">  // top row is Header
    <frameset cols=180,*>  // divide second row into two columns, 180px and remainder wide
        <frameset rows=0,*>  // hidden row and remainder of column
            <frame name="DataChannelFrame">  // hidden stuff
            <frame name="TOC">  // left column is TOC
        <frame name="Main">  // (top) row is Main content

在这种情况下,无论我是否使用与以前相同的导航,Selenium 都无法在 TOC 中找到任何可单击的内容。我怀疑我实际上不在TOC中,但我不知道我在哪里。不用说,它也不会进入主要部分。

问题 1:在这两页上, Selenium 是从哪里开始的?它在哪个框架中?这是我可以依靠的东西(有记录且一致)吗?我通过反复试验找到了绕过“F”的方法,但它在“H”中不起作用。

问题 2:当我做 a$drv->switch_to_frame();时,它会“向上”多远?什么被认为是当前帧的“父”?它总是一个框架集吗?我试过$drv->switch_to_frame("relative=top");代替 (),但它在“F”或“H”上都不起作用。

问题 3:当我切换到命名框架时,它是否必须在我所在位置的子级,还是在我下方的任何深度?如果它必须是一个孩子,也许“relative=top”让我在树上太高了?

问题 4:当我在 Main(“F”应用程序)中时,我可以通过上面的导航成功到达 TOC(上一个,下到命名框架)。当框架集(TOC 的兄弟)可能是 Main 的父级时,它怎么会起作用?


更新

啊!谁会想到某些页面编码器会使用<b>带有“onClick”的标签而不是样式<a>标签?所以它到达了所需的框架,但我正在寻找的链接并不存在。

尽管如此,即使我现在可以使用它(无论如何,感谢那些回复的人),我仍然很好奇 switch_to_frame() 和 switch_to_frame('name') 的正式定义是什么。() 是否一直到“顶部”,或者只是上升一个级别(它似乎一直到顶部/默认值),并且 ('name') 会下降任意数量的级别,直到找到命名的框架?(好像是)。所以 () 后跟 ('name') 应该让我进入任何唯一命名的框架?

4

0 回答 0