frameToBeAvailableAndSwitchToIt () не помогает переключиться на фрейм - PullRequest
0 голосов
/ 13 января 2020

Я использую AJAX приложение и на нем есть некоторые фреймы, и я хочу переключиться на него, поэтому я использовал frameToBeAvailableAndSwitchToIt() метод.

Предположим, теперь я нахожусь в контексте страницы по умолчанию (т.е. не в любом из фреймов) и хочу переключиться на testFrame, используя следующий код -

   WebDriverWait wait = new WebDriverWait(driver, 30);
   wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(testFrame));

   JavascriptExecutor jsExecutor = (JavascriptExecutor)driver;
   String currentFrameName = (String) jsExecutor.executeScript("return self.name");
   System.out.println("***************** Current frame using self.name " + currentFrameName);

Возвращается пустое строка как значение currentFrameName, которое указывает на то, что мы не переключились на testFrame, даже если явный вызов ожидания завершился успешно.

Эта проблема периодически воспроизводится, что приводит к сбою тестов. Не могли бы вы предложить, как сделать это стабильным?

РЕДАКТИРОВАТЬ

Я отредактировал мой вопрос, где ранее я упоминал - я нахожусь в frameA, а затем хочу переключитесь на frameB, но это не так. Я хочу переключиться с содержимого страницы по умолчанию на фрейм. Извините за неправильную информацию.

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Вам нужно переключиться назад с предыдущего кадра, чтобы перейти к другому кадру. Использование

driver.switchTo().defaultContent();

Теперь это должно выглядеть следующим образом.

WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameA));
//Do somenthing.
driver.switchTo().defaultContent();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameB));

Надеюсь, это поможет.

0 голосов
/ 13 января 2020

Если вы находитесь в пределах frameA и хотите переключиться на frameB , это будет зависеть от выравнивания frameA и frameB .

  • Если frameB является дочерним кадром frameA , то, находясь в frameA , вы должны switchTo() дочерний frame frameB еще раз следующим образом:

    new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameA));
    new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameB));
    

Соответствующее обсуждение можно найти в Невозможно найти дочерний элемент iframe, который в родительском iframe через Selenium в Java

  • Если frameA и frameB оба являются прямым потомком Контекст просмотра верхнего уровня , тогда, находясь в frameA , вы должны switch_to() defaultContent () (который выбирает либо первый кадр на странице, либо основной документ, когда страница содержит iframes.) сначала затем во фрейм frameB следующим образом:

    new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameA));
    driver.switchTo().defaultContent(); #incase frameA and frameB are immediate child of the Top Level Content
    new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameB));
    

Вы можете найти соответствующее обсуждение в нескольких тегах iframe Selenium webdriver


tl; dr

Соответствующее подробное обсуждение можно найти в:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...