How to switch between frames in Selenium WebDriver using Java

后端 未结 7 1708
轮回少年
轮回少年 2020-11-22 13:31

I am using java with WebDriver.I have to switch between two frames. I have recorded the test case in selenium IDE and in that I got the values as selectFrame relative=top se

相关标签:
7条回答
  • 2020-11-22 13:44

    WebDriver's driver.switchTo().frame() method takes one of the three possible arguments:

    • A number.

      Select a frame by its (zero-based) index. That is, if a page has three frames, the first frame would be at index 0, the second at index 1 and the third at index 2. Once the frame has been selected, all subsequent calls on the WebDriver interface are made to that frame.

    • A name or ID.

      Select a frame by its name or ID. Frames located by matching name attributes are always given precedence over those matched by ID.

    • A previously found WebElement.

      Select a frame using its previously located WebElement.

    Get the frame by it's id/name or locate it by driver.findElement() and you'll be good.

    0 讨论(0)
  • 2020-11-22 13:45

    Need to make sure once switched into a frame, need to switch back to default content for accessing webelements in another frames. As Webdriver tend to find the new frame inside the current frame.

    driver.switchTo().defaultContent()
    
    0 讨论(0)
  • 2020-11-22 13:55

    First you have to locate the frame id and define it in a WebElement

    For ex:- WebElement fr = driver.findElementById("id");

    Then switch to the frame using this code:- driver.switchTo().frame("Frame_ID");

    An example script:-

    WebElement fr = driver.findElementById("theIframe");
    
    driver.switchTo().frame(fr);
    
    Then to move out of frame use:- driver.switchTo().defaultContent();
    
    0 讨论(0)
  • 2020-11-22 13:57

    You can also use:

    driver.switch_to.frame(0)
    

    (0) being the first iframe on the html.

    to switch back to the default content:

    driver.switch_to.default_content()
    
    0 讨论(0)
  • 2020-11-22 14:02

    This code is in groovy, so most likely you will need to do some rework. The first param is a url, the second is a counter to limit the tries.

    public boolean selectWindow(window, maxTries) {
        def handles
        int tries = 0
        while (true) {
            try {
                handles = driver.getWindowHandles().toArray()
                for (int a = handles.size() - 1; a >= 0 ; a--) { // Backwards is faster with FF since it requires two windows
                    try {
                        Log.logger.info("Attempting to select window: " + window)
                        driver.switchTo().window(handles[a]);
                        if (driver.getCurrentUrl().equals(window))
                            return true;
                        else {
                            Thread.sleep(2000)
                            tries++
                        }
                        if (tries > maxTries) {
                            Log.logger.warn("Cannot select page")
                            return false
                        }
                    } catch (Exception ex) {
                        Thread.sleep(2000)
                        tries++
                    }
                }
            } catch (Exception ex2) {
                Thread.sleep(2000)
                tries++
            }
        }
        return false;
    }
    
    0 讨论(0)
  • 2020-11-22 14:05

    There is also possibility to use WebDriverWait with ExpectedConditions (to make sure that Frame will be available).

    1. With string as parameter

      (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name"));
      
    2. With locator as a parameter

      (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frame-id")));
      

    More info can be found here

    0 讨论(0)
提交回复
热议问题