frameset不用切,frame需层层切!
frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。
1. 怎么切到frame中(switch_to.frame())
用switch_to.frame(reference)
来切换frame,方法如下:
protected void switchToFrame(Locator sourceLocator) {
driver.switchTo().frame(waitForElement(sourceLocator, UI.presence));
}
reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象
通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位:
-
index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位
-
WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象
2. 从frame中切回主文档(switch_to.default_content())
driver.switch_to.default_content()
方法如下:
public void switchFromFrameToWindow(WebDriver driver){
driver.switchTo().defaultContent();
}
3.嵌套frame的操作(switch_to.parent_frame())
嵌套的frame,如下:
<html>
<iframe id="frame1">
<iframe id="frame2" / >
</iframe>
</html>
一层一层切进去:
driver.switch_to.frame("frame1")
driver.switch_to.frame("frame2")
selenium给我们提供了一个方法能够从子frame切回到父frame:如下
driver.switch_to.parent_frame() # 如果当前已是主文档,则无效果