У меня есть набор тестов, в котором использовался Thycidides/jbehave, и он работал нормально (хотя и против более старой версии FireFox, потому что разработка переключилась на Sernity BDD). Теперь я перешел на новый Serenity BDD (все еще jbehave) и обновил FireFox, но внезапно столкнулся с ошибкой при попытке переключиться на фрейм на определенной странице/тесте.
На нашем сайте МНОГО фреймов, но переключение фреймов работает на всех страницах/тестах, за исключением одной страницы/теста (который, похоже, имеет ту же структуру фреймов, что и другие рабочие тесты). Когда я пытаюсь переключиться на определенный фрейм (который, как я знаю, там есть), я получаю «Элемент принадлежит другому фрейму, чем текущий — переключитесь на содержащий его фрейм, чтобы использовать его» (и ссылку на stale_element_reference) (SerenityManagedException. detachedCopyOf), что не имеет особого смысла в том, что я пытаюсь сделать. Я написал некоторый альтернативный код, который запускал все кадры, чтобы убедиться, что кадр, на который я переключался, присутствует и есть.
"Базовая" структура фрейма:
<html>
<head>
</head>
<frameset cols="5,*" border="0" frameborder="no" framespacing="0">
<frameset rows="145,*" border="0" frameborder="no" framespacing="0">
<frame name="kalender" src="../calendar/Month.jsp" marginwidth="0" marginheight="0" noresize="" scrolling="no">
<frame name="dagskalender" src="../calendar/NewTimeReg.jsp" marginwidth="10" marginheight="20" noresize="" scrolling="no">
</frameset>
<frameset rows="50,*,1" border="0" frameborder="NO" framespacing="0">
<frameset cols="63,175,*,35" border="0" frameborder="NO" framespacing="0">
<frame name="dagbund" src="Mail.jsp" marginwidth="0" marginheight="0" noresize="" scrolling="NO">
<frame name="soeg" src="../search/main/Cont.jsp" marginwidth="0" marginheight="0" noresize="" scrolling="no">
<frame name="topbar" src="TopBarMid.jsp" marginwidth="0" marginheight="0" noresize="" scrolling="no">
<frame name="topbarende" src="TopBarRight.jsp" marginwidth="0" marginheight="0" noresize="" scrolling="no">
</frameset>
<frame name="main" src="../startpage/Fram.jsp?null" marginwidth="0" marginheight="0" noresize="">
<frameset cols="33%,33%,33%,*" border="0" frameborder="NO" framespacing="0">
<frame name="skjult" src="Blank.jsp" marginwidth="0" marginheight="0" noresize="" scrolling="no">
<frame name="skjult2" src="Blank2.jsp" marginwidth="0" marginheight="0" noresize="" scrolling="no">
<frame name="skjult3" src="Blank3.jsp" marginwidth="0" marginheight="0" noresize="" scrolling="no">
<frame name="AppletLoader" src="" marginwidth="0" marginheight="0" noresize="" scrolling="no">
</frameset>
</frameset>
</frameset>
</html>
Я пытаюсь переключиться на «основной» фрейм, поэтому я сначала переключаюсь на содержимое по умолчанию, а затем пытаюсь переключиться на «основной»
getDriver().switchTo().defaultContent();
String SAML = System.getProperty("login.user.saml").toString();
if(SAML.equalsIgnoreCase("false")) // some sites have a extra parent frame
{
staticlogger.info( "Switching to 'system' frame..." );
getDriver().switchTo().frame("system"); //disable step if SAML-login
}
staticlogger.info( "Switching to 'main' frame..." );
getDriver().switchTo().frame("main");
staticlogger.info("Переключение на основной кадр..." ); является последним, который выполняется, поэтому он терпит неудачу в getDriver().switchTo().frame("main");
Приведенный ниже код находит «основной», что означает, что он должен присутствовать в активном фрейме и также переключаться, потому что findElements возвращается только из активного фрейма:
List<WebElement> ele = getDriver().findElements(By.tagName("frame"));
for(WebElement el : ele)
{
staticlogger.info( "Frame: " + el.getAttribute("name") + " ID: " + el.getAttribute("id"));
if(el.getAttribute("name").equalsIgnoreCase("main"))
{
staticlogger.info( "Switching to 'main' frame..." );
getDriver().switchTo().frame(el);
}
}
У кого-нибудь есть идея или обходной путь для решения этой ошибки? Невозможно опубликовать полный HTML-код сайтов, поскольку они содержат конфиденциальные данные/код.