请您解释一下如何使用一小段代码在Selenium WebDriver中处理多个帧。
答案 0 :(得分:1)
在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”);以下是使用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){ 尝试{ driver.switchTo()帧(帧)。 System.out.println(“导航到具有名称的框架”+框架); } catch(NoSuchFrameException e){ System.out.println(“无法找到具有id的帧”+帧 + e.getStackTrace()); } catch(例外e){ System.out.println(“无法导航到具有id的帧”+帧 + e.getStackTrace()); } } driver.switchTo()。frame(WebElement frameElement);
使用之前定位的WebElement选择框架。 参数:frameElement - 要切换到的框架元素。 返回:关注给定帧(当前帧)的驱动程序。 抛出:NoSuchFrameException - 如果给定元素既不是iframe也不是frame元素。和StaleElementReferenceException - 如果WebElement已经过时。
以下是将元素发送到和切换的示例代码。
public void switchToFrame(WebElement frameElement)
{
try
{
if (isElementPresent(frameElement))
{ 。driver.switchTo()帧(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());
}
}
有些时候,当有多个帧(帧中的帧)时,我们需要先切换到父帧,然后我们需要切换到子帧。下面是使用多个框架的代码段。
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());
}
}
答案 1 :(得分:0)
您只能使用WebDriver在一帧内搜索。要与另一帧中的元素进行交互,您需要“切换”它。然后,驱动程序将其上下文转移到该框架中,您将能够在其中工作。
带一小段代码
driver.switchTo().frame()
methods
完成后,使用
切换回主窗口driver.switchTo().defaultContent();
答案 2 :(得分:0)
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());
}
}