Не находятся элементы внутри iframe при работе с PageFactory и в Selenide

С @FindBy проблема решилась следующим образом:

@Test
    public void searchTest() {
        open("baseUrl");
        onMainPage().switchToFooFrame().getFooInput().sendKeys("123425");
        onMainPage().switchToFooFrame().getFooButton().click();
    }
private MainPage onMainPage() {
    return new MainPage(WebDriverRunner.getWebDriver());
}
public class MainPage {

    private final WebDriver driver;

    @FindBy(id = "fooFrame") //фрейм
    private FooFrame fooFrame;

    @FindBy(id = "header")
    private Header header;

    public WebDriver getWebDriver() {
        return driver;
    }

    public Header getHeader() {
        return header;
    }

    public FooFrame getFooFrame() {
        return fooFrame;
    }

    public MainPage(WebDriver driver) {
        this.driver = driver;
        getWebDriver().switchTo().defaultContent();
        SelenidePageFactory.initElements(new SelenideFieldDecorator(getWebDriver()), this);
    }

    public FooFrame switchToFooFrame() {
        getWebDriver().switchTo().frame(getFooFrame().getSelf());
        FooFrame frame = new FooFrame();
        SelenidePageFactory.initElements(new SelenideFieldDecorator(getWebDriver()), frame);
        return frame;
    }
public class FooFrame extends ElementsContainer {

    @FindBy(id = "otherFrame") //фрейм
    private OtherForm otherForm;

    @FindBy(id = "fooInput")
    private SelenideElement fooInput;

    @FindBy(id = "fooButton")
    private SelenideElement fooButton;

Добрый день, сталкивался с приложением в котором фреймы-во-фреймах-во-фреймах были везде.
Selenide там не использовался, но проблему мы решили создав свой SearchContext и свой декоторатор, кратко:

  1. CustomSearchContext implements SearchContext - тут реализовать методы findElements/findElement - для поиска по дереву фреймов начиная с default content’а. (Грубо говоря тут драйвер ходит по всем доступным фреймам, свичится, ищет элемент - если не нашел - идет в следующий фрейм)

  2. CustomFieldDecorator extends DefaultFieldDecorator в котором нужно только обьявить такой конструктор:

public CustomFieldDecorator(SearchContext searchContext) {
        super(new DefaultElementLocatorFactory(searchContext));
    }

После этого пейджобджекты с фреймами(или все) нужно инитить так:

        PageFactory.initElements(new CustomFieldDecorator(new CustomSearchContext(getDriver())), this);

Второй пункт в случае с селенидом наверное не понадобится, и выйдет:

        PageFactory.initElements(new SelenideFieldDecorator(new CustomSearchContext(getDriver())), this);

Основная работа тут будет в написании findElement/findElemets который будет свичится по фреймам

Реализовал так:

@FindBy (id = "id input")
@CacheLookup
private WebElement EnterCardNumber;
public void EnterCardNumber(String string) throws InterruptedException
    {
        driver.switchTo().frame("id iframe");
        EnterCardNumber.sendKeys(string);
        driver.switchTo().defaultContent();
        Thread.sleep(One_seconds);
    }

и так для каждого iframe

Столкнулся с наличием фреймов на одном из проектов, написал класс который пробегается по фреймам и находит элемент.

Если интересно:

1 лайк