Нет, нет.
Фактически, обработка iframe
элементов с селеном очень сложная.
У вас есть три варианта для переключения в кадр:
- Используя свой индекс (0, 1, ..., N-1)
- Используя свое имя или идентификатор (как вы это делали в пример выше)
- Используя
WebElement
объект, который вы получите от DOM
Но у вас есть только один вариант для переключения из:
driver.switchTo().defaultContent()
И как только вы перешли из кадра, вы на самом деле потушил «весь путь».
Итак, если вы считаете, что вы рекурсивно просматриваете фреймы с помощью простой DFS, скорее всего, вы ошибались.
Способ, которым я нашел это, «оставлять хлебные крошки». Другими словами, перед переключением в кадр я «запоминаю» весь путь от корня DOM до этого фрейма.
После отключения, потому что я «вернулся в корневой каталог», я выполняю весь путь к кадру (за исключением переключения на этот фрейм, конечно), а затем продолжаю рамку рядом с ней.
Помните, что после того, как вы переключились на кадр, все предыдущие объекты WebElement
, которые вы хранили, стали «устаревшими», поэтому вам придется их снова найти после выключения.
P.S .: Я обнаружил, что почти все сайты хранят рекламу внутри тегов iframe
, поэтому я сомневаюсь, что это «старая мода».
Во всяком случае, вот код, который я использовал (в Java):
private void searchFrames(List<Integer> route)
{
doWhateverYouWannaDoHere();
if (route.size() < MAX_DEPTH)
{
int numOfFrames = webDriver.findElements(By.tagName("iframe")).size();
for (int i=0; i<numOfFrames; i++)
{
try
{
webDriver.switchTo().frame(i);
List<Integer> newRoute = new ArrayList<Integer>(route);
newRoute.add(i);
searchFrames(newRoute);
webDriver.switchTo().defaultContent();
for (int j : route)
webDriver.switchTo().frame(j);
}
catch (NoSuchFrameException error)
{
break;
}
catch (Exception error)
{
}
}
}
}
Для того, чтобы начать процедуру, вызовите searchFrames(new ArrayList<Integer>())
.
Надеюсь, что это поможет ...
ОБНОВЛЕНИЕ:
Этот метод выполняет нужное действие не только внутри каждого кадра, но также и в самой DOM. Если вы хотите избежать самой DOM, переместите вызов на метод 'doWhateverYouWannaDoHere' после первой строки в предложении try
, т. Е. После webDriver.switchTo().frame(i)
.