如何在selenium web驱动程序中处理多个帧?

时间:2013-07-20 13:50:15

标签: selenium selenium-webdriver webdriver

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

3 个答案:

答案 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();

另外,more documentation

答案 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());
      }
}