Selenium не находит элемент по Xpath, а он есть на странице

Проблема заключается в том, что падает тест, когда доходит до определенного элемента. Ошибка NoSuchElementException: no such element: Unable to locate element.

Работаю с Idea/selenium/testng/java

Мой код выглядит так - Нахожу элемент и создаю метод:

By My_column_has_header = By.xpath("//div[@id=‘content’]/div[@id=‘cbHasHeader’]/child::input");

public CheckBoxes Put_My_column_has_header() {
driver.findElement(My_column_has_header).click();
return this;
}
}

Консоль

Нужно найти элемент - чекбокс My column has header и кликнуть на него.

Я сделала порядка 6-7 вариантов xpath, но безрезультатно. Xpath искала в DevTools без всяких сторонних помогаторов. Все мои xpath находились по строке поиска. Попробовала поиск родительских, дочерних элементов и др.
Попробовала сделать Thread.sleep в надежде, что элемент не успел появиться - не сработало.
Предположила, что элемент скрыт за каким-то другим элементом - тоже не сработал вариант

В чем может быть проблема и что может помочь решить проблему?

Судя по скрину, ваш элемент находится в отдельном iframe.
Нужно сперва переключить контекст внутрь этого iframe, а потом уже искать элемент внутри него.

Да, элемент находится в отдельном iframe.

По итогу получился код,

    driver.switchTo().defaultContent();
    driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@src, 'iframedAppPanel')]")));
    driver.switchTo().frame(driver.findElement(By.id("sandboxFrame")));
    driver.switchTo().frame(driver.findElement(By.id("userHtmlFrame")));

Но тест падает - не находит элементы.

Попробовала вынести элементы

By Frame = By.xpath("//iframe[contains(@src, 'iframedAppPanel')]");
By Frame1 = By.id("sandboxFrame");
By Frame2 = By.id("userHtmlFrame");

и создать метод

public CheckBoxes switchFrame() {
driver.switchTo().frame(String.valueOf(Frame));
driver.switchTo().frame(String.valueOf(Frame1));
driver.switchTo().frame(String.valueOf(Frame2));
return this;
}
хотя не уверена, что это хорошее решение, но планирую использовать метод в тестах.

консоль

Буду благодарна за помощь с кодом или пинок куда внимательней смотреть.

Какие именно элементы тест не находит? И какая ошибка выводится в логах?

код такой
WebElement Frame1 = (WebElement) By.id(“sandboxFrame”);
WebElement Frame2 = (WebElement) By.id(“userHtmlFrame”);

public CheckBoxes switchFrame() {
driver.switchTo().defaultContent();
driver.switchTo().frame(0);
driver.switchTo().frame(Frame1);
driver.switchTo().frame(Frame2);
return this;

на этапе driver.switchTo().frame(Frame1); тест падает , ошибка Ошибка NoSuchElementException: no such element: Unable to locate element.

Здесь как будто не хватает переключения сначала в

By Frame = By.xpath("//iframe[contains(@src, 'iframedAppPanel')]");

потому что //iframe[@id="sandboxFrame"] находится именно в нём (согласно скрину).

Сначала я искала By Frame = By.xpath("//iframe[contains(@src, ‘iframedAppPanel’)]"); и переключала с помощью switchTo().
Тогда xpath не находился. Была ошибка, что элемент не найден.

Потом, почитав некоторое руководство по selemium переписала код
driver.switchTo().frame(0);
driver.switchTo().frame(Frame1);
driver.switchTo().frame(Frame2);

получается, что я переключаюсь на driver.switchTo().frame(0), а дальше driver.switchTo().frame(Frame1) падает ошибка.

frame(0) - в скобках ноль, потому что у данного iframe нет id и name. Получается, что - это индекс, который определяет позицию iframe.

да простят меня боги, если я пишу ересь :roll_eyes:

Надежнее всего переключаться во фрейм по WebElement, потому что выбор локаторов обширнее нежели только id или name.

Я бы переключался в фрейм, сначала найдя его веб-элемент:

WebElement iframeAppPanel = driver.findElement(By.xpath("//iframe[contains(@src, ‘iframedAppPanel’)]"));
driver.switchTo().frame(iframeAppPanel);

Далее по аналогии нырять во внутренние фреймы.
Дебаг-режим в IDE в помощь.

между прочим цдп позволяет фреймы-детей

пока только искать по моему

Page.getFrameTree #

Returns present frame tree structure.

RETURN OBJECT

frameTree

FrameTree

Present frame tree structure.

Page.FrameTree #

Information about the Frame hierarchy.

Type: object

PROPERTIES

frame

Frame

Frame information for this tree item.

childFrames

array[ FrameTree ]

Child frames.