你能解释一下如何用一小段代码在 Selenium WebDriver 中处理多个帧。
3 回答
在 Selenium 中使用 iFrames,我们根据需要有不同的方法来处理帧。请看以下处理框架的方法
driver.switchTo().frame(int arg0);
按其(从零开始的)索引选择一个框架。也就是说,如果一个页面有多个框架(多于 1 个),则第一个框架的索引为“0”,第二个框架的索引为“1”,依此类推。
一旦选择或导航了框架,WebDriver 接口上的所有后续调用都会对该框架进行。即驱动程序的焦点现在将在框架上。我们尝试在页面上执行的任何操作都将不起作用,并且在我们导航/切换到 Frame 时抛出未找到的元素。
参数: 索引 -(从零开始)索引 返回:驱动程序专注于给定帧(当前帧) 抛出:NoSuchFrameException - 如果未找到该帧。
示例:如果 iframe id=webklipper-publisher-widget-container-frame,可以写成 driver.switchTo().frame("webklipper-publisher-widget-container-frame"); 下面是使用帧 ID 处理 switchToFrame 的代码片段。
public void switchToFrame(int frame) {
try {
driver.switchTo().frame(frame);
System.out.println("Navigated to frame with id " + frame);
} catch (NoSuchFrameException e) {
System.out.println("Unable to locate frame with id " + frame
+ e.getStackTrace());
} catch (Exception e) {
System.out.println("Unable to navigate to frame with id " + frame
+ e.getStackTrace());
}
}driver.switchTo().frame(String arg0);
按名称或 ID 选择框架。通过匹配名称属性定位的帧总是优先于那些通过 ID 匹配的帧。参数: name 或 Id - 框架的名称或框架元素的 id。返回:驱动程序专注于给定帧(当前帧) 抛出:NoSuchFrameException - 如果未找到该帧
下面是使用框架名称的示例代码片段。
public void switchToFrame(String frame) { try { driver.switchTo().frame(frame); System.out.println("导航到名称为" + frame); } catch (NoSuchFrameException e) { System.out.println("无法找到带有 id 的框架" + frame + e.getStackTrace()); } catch (Exception e) { System.out.println("无法导航到带有 id 的框架" + frame + e.getStackTrace()); } } driver.switchTo().frame(WebElement frameElement);
使用之前定位的 WebElement 选择一个框架。参数: frameElement - 要切换到的框架元素。返回:驱动程序专注于给定帧(当前帧)。抛出: NoSuchFrameException - 如果给定元素既不是 iframe 也不是框架元素。并且 StaleElementReferenceException - 如果 WebElement 已经过时。
下面是将元素发送到和开关的示例代码。
public void switchToFrame(WebElement frameElement)
{
try
{
if (isElementPresent(frameElement))
{ driver.switchTo().frame(frameElement);
System.out.println("Navigated to frame with element "+ frameElement);
} else {
System.out.println("Unable to navigate to frame with element "+ frameElement);
}
} catch (NoSuchFrameException e) {
System.out.println("Unable to locate frame with element " + frameElement + e.getStackTrace());
} catch (StaleElementReferenceException e) {
System.out.println("Element with " + frameElement + "is not attached to the page document" + e.getStackTrace());
} catch (Exception e) {
System.out.println("Unable to navigate to frame with element " + frameElement + e.getStackTrace());
}
}
有时当有多个Frame(Frame in side a frame)时,我们需要先切换到父框架,然后再切换到子框架。下面是处理多个帧的代码片段。
public void switchToFrame(String ParentFrame, String ChildFrame) {
try {
driver.switchTo().frame(ParentFrame).switchTo().frame(ChildFrame);
System.out.println("Navigated to innerframe with id " + ChildFrame
+ "which is present on frame with id" + ParentFrame);
} catch (NoSuchFrameException e) {
System.out.println("Unable to locate frame with id " + ParentFrame
+ " or " + ChildFrame + e.getStackTrace());
} catch (Exception e) {
System.out.println("Unable to navigate to innerframe with id "
+ ChildFrame + "which is present on frame with id"
+ ParentFrame + e.getStackTrace());
}
}
处理完框架后,最重要的是回到网页。如果我们不切换回默认页面,驱动程序将抛出异常。下面是切换回默认内容的代码片段。
public void switchtoDefaultFrame() {
try {
driver.switchTo().defaultContent();
System.out.println("Navigated back to webpage from frame");
} catch (Exception e) {
System.out
.println("unable to navigate back to main webpage from frame"
+ e.getStackTrace());
}
}
使用 WebDriver 只能在一帧内搜索。要与另一个框架中的元素交互,您需要“切换”到它。然后驱动程序会将其上下文转移到该框架中,您将能够在其中工作。
用一小段代码
完成后,使用切换回主窗口
driver.switchTo().defaultContent();
此外,更多文档。
public void switchToFrame(String ParentFrame, String ChildFrame) {
try {
driver.switchTo().frame(ParentFrame).switchTo().frame(ChildFrame);
System.out.println("Navigated to inner frame with id " + ChildFrame
+ "which is present on frame with id" + ParentFrame);
}
catch (NoSuchFrameException e) {
System.out.println("Unable to locate frame with id " +ParentFrame + " or "
+ ChildFrame + e.getStackTrace());
} catch (Exception e) {
System.out.println("Unable to navigate to inner frame with id "
+ ChildFrame + "which is present on frame with id"
+ ParentFrame + e.getStackTrace());
}
}