-2

你能解释一下如何用一小段代码在 Selenium WebDriver 中处理多个帧。

4

3 回答 3

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"); 下面是使用帧 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());
    }
}
于 2015-08-21T12:15:12.103 回答
0

使用 WebDriver 只能在一帧内搜索。要与另一个框架中的元素交互,您需要“切换”到它。然后驱动程序会将其上下文转移到该框架中,您将能够在其中工作。

用一小段代码

driver.switchTo().frame()方法

完成后,使用切换回主窗口

driver.switchTo().defaultContent();

此外,更多文档

于 2013-07-20T14:53:26.187 回答
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());
      }
}
于 2020-03-13T11:15:44.997 回答