我一直在使用 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') 应该让我进入任何唯一命名的框架?