首页 > 解决方案 > 用于定位 ifram 的循环并切换到它不起作用

问题描述

我使用 java 代码为 iframe 定位器创建了一个循环,但它不起作用。任何人都可以看到问题吗?

调用类:

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
            WebElement searchButton = IFrameLocator.switchToIFrameWithElement(driver,driver.findElement(By.cssSelector("[href*='Search.mvc'][class*='magnify']")));

and use this after:

searchButton.click();


public class IFrameLocator {

    public static WebElement switchToIFrameWithElement(WebDriver driver, WebElement element) {
        try {
            driver.switchTo().defaultContent();
            element.isDisplayed();
        } catch (Exception continueFlow) {

            WebDriverWait wait = new WebDriverWait(driver, 20);
            List<WebElement> frames = driver.findElements(By.cssSelector("iframe"));
            for (WebElement frame : frames) {
                driver.switchTo().defaultContent();
                try {
                    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frame));
                    if (element.isDisplayed()) {
                        break;
                    }
                } catch (NoSuchElementException | StaleElementReferenceException | ElementNotInteractableException ignored) {
                }
            }
        }   return element;
    }
}

标签: javaselenium

解决方案


因为我通过 cssSelector 传递了整个 Webelement,所以它甚至没有进入循环。所以我像这样传递元素:

WebElement searchButton = IFrameLocator.switchToIFrameWithElement(driver, By.cssSelector("[href*='Search.mvc'][class*='magnify']"));

所以我更改了代码并在 2 个位置删除了 By.cssSelector,现在一切正常:

公共类 IFrameLocator {

public static WebElement switchToIFrameWithElement(WebDriver driver, By element) {
    driver.switchTo().defaultContent();

    try {
        if (driver.findElement(element).isDisplayed()) ;
        {
            System.out.println("Element is displayed on main page");
        }
    } catch (Exception continueFlow) {
        List<WebElement> frames = driver.findElements(By.cssSelector("iframe"));
        for (WebElement frame : frames) {
            driver.switchTo().defaultContent();
            System.out.println("going back to main page");
            try {
                driver.switchTo().frame(frame);
                System.out.println("switched to next frame: " + frame);
                if (driver.findElement(element).isDisplayed()) {
                    System.out.println("element is found in frame: " + frame);
                    break;
                }
            } catch (NoSuchElementException | StaleElementReferenceException | ElementNotInteractableException ignored) {
            }
        }
    }  System.out.println("returned element succesfully");
    return driver.findElement(element);
}

}


推荐阅读