2014-01-02 3 views
1

я должен испытать «старомодный» веб-приложение, которое использует внутренний frames.Just как:Обращение InnerFrames с селеном

<html> 
.... 
<frameset name="fooSet"> 
<frame name="myFrame"> 
<html> 
..... 
<frame name="whatever"> 
..... 
</html> 
.... 
</html> 

Я использовал rekursions читать все кадры ... единственный вопрос, который я сейчас если есть способ сохранить обработчик для кадра просто как windowsHandler..like:

WebDriver driver = new HtmlUnitDriver(); 
driver.get(Constant.URL); 
WebDriver fooDriver = driver.switchTo().frame("myFrame"); 
String handler = fooDriver.getWindowHandle(); 

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

ответ

1

Нет, нет.

Фактически, обработка iframe элементов с селеном очень сложная.

У вас есть три варианта для переключения в кадр:

  1. Используя свой индекс (0, 1, ..., N-1)
  2. Используя свое имя или идентификатор (как вы это делали в пример выше)
  3. Используя WebElement объект, который вы получите от DOM

Но у вас есть только один вариант для переключения из:

  1. 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).

Смежные вопросы