Веб-драйвер Selenium — невозможно переключиться на фрейм (Java)

#java #selenium #iframe #selenium-webdriver

#java #селен #iframe #selenium-webdriver

Вопрос:

Вот картинкаНачальная страницаСтраница после нажатия кнопки — я новичок, тогда у меня проблема при использовании

GetDriver().switchTo().frame(элемент) или ожидаемые условия.frametobeavailable и switchtoit(элемент)

Вот HTML:

 <head id="ctl00_Head1">
<body>
<div id="divPleaseWait" style="display: none"/>
<div>
<a>
<div style="position: absolute; visibility: hidden;">
<div id="TB_overlay" class="TB_overlayBG"/>
<div id="TB_window" style="margin-left: -440px; width: 880px; margin-top: -295px; display: block;">
<div id="TB_title">
<iframe id="TB_iframeContent" frameborder="0" style="width:879px;height:562px;" onload="tb_showIframe()" name="TB_iframeContent303" src="CompanyDetail.aspx?" hspace="0"/>
</div>
  

И мой код

 WebDriverWait wait = new WebDriverWait(GetDriver(), time_out);
        wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.Id("TB_iframeContent")));
  

или

 GetDriver().switchTo().frame(By.Id("TB_iframeContent"));
  

но я не смог переключиться на этот iframe и нашел идентификатор в этом iframe
Это моя ошибка

Время ожидания истекло через 30 секунд ожидания доступности фрейма: [[FirefoxDriver: firefox в WINDOWS (fd412e93-d76e-4934-9fa5-a771c836ffe3)] -> идентификатор: TB_iframeContent] Информация о сборке: версия: ‘2.53.1’, редакция: ‘a36b8b1’, время: ‘2016-06-30 17:37:03’ Информация о системе: хост: ‘ABCV-VN-01-PC’, ip: ‘192.168.3.30’, os.name : ‘Windows 7’, os.arch: ‘amd64’, os.version: ‘6.1’, java.version: ‘1.8.0_51’ Информация о драйвере: org.openqa.selenium.firefox.Возможности FirefoxDriver [{applicationCacheEnabled= true, rotatable = false, handlesAlerts = true, databaseEnabled = true, версия = 47.0.1, платформа = WINDOWS, nativeEvents = false, acceptSslCerts= true, webStorageEnabled = true, locationContextEnabled=true, browserName = firefox, TakesScreenshot = true, javascriptEnabled = true, cssSelectorsEnabled= true}] Идентификатор сеанса: fd412e93-d76e-4934-9fa5-a771c836ffe3 Не удалось найти элемент: {«метод»:»идентификатор», «селектор»: «ctl00_adminMenuCompany»}

Не могли бы вы мне помочь ?!? Я действительно без ума от этого!!!!

Спасибо всем за поддержку. Я обнаружил, что в моем драйвере firefox ошибка с этой проблемой. Когда я пытаюсь использовать драйвер Chrome, все в порядке. Я думаю, мне следует обновить до selenium 3.0

Комментарии:

1. У вас есть скрытый div, который, по-видимому, содержит искомый iframe — <div style=»position: absolute; visibility: hidden;»> … Виден ли iframe в браузере, когда ваш код webdriver пытается его найти. Является ли это каким-то другим действием, которое делает div видимым?

2. Вы уверены, что идентификатор iframe не изменяется динамически??

3. В вашем локаторе отсутствуют кавычки… так и должно быть By.Id("TB_iframeContent") .

4. @Grasshopper Привет, iframe виден после нажатия на кнопку. Но, похоже, webdriver НЕ находит его. Я обнаружил, что webdriver все еще остается на странице в начале, содержит html <body> <div id=»divPleaseWait» style=»display: none»/> <div> <a> <div style=»позиция: абсолютная; видимость: скрытая;»> Затем я нажимаю кнопку, чтобы отобразить htmlЯ отправляю сверху. Не могли бы вы поделиться своей точкой зрения ?!? Вы можете взглянуть на изображение, которое я обновляю.

5. @SaurabhGaur спасибо, но это абсолютно НЕ меняет идентификатор

Ответ №1:

Я предполагаю, что, возможно IFRAME , то, что вы ищете, вложено в другое IFRAME ? Запустите этот код и посмотрите IFRAME , присутствует ли в списке то, что вы ищете.

 driver.findElement(locator).click(); // click the button to make the IFRAME visible
// you may need a wait here
List<WebElement> iframes = driver.findElements(By.tagName("iframe"));
for (WebElement iframe : iframes)
{
    System.out.println(iframe.getAttribute("outerHTML"));
}
  

Редактировать:

Вы пробовали использовать индекс фрейма? Попробуйте следующее.

 driver.findElement(locator).click(); // click the button to make the IFRAME visible
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(0));
  

Я бы предположил, что, если вышеупомянутое не сработает, я бы поставил точку останова в строке после нажатия кнопки, которая открывает IFRAME и проверяет страницу. Происходит что-то странное. Я не думаю, что вы можете опубликовать ссылку на страницу?

Комментарии:

1. Привет, JeffC, это только возврат ‘<iframe hspace=»0″ src=»CompanyDetail.aspx?» id =»TB_iframeContent» name=»TB_iframeContent964″ onload=»tb_showIframe()» style=»ширина: 879 пикселей; высота: 562 пикселей; » frameborder=»0″> </iframe>’ тогда как я переключаюсь на этот iframe. Я пытаюсь ‘GetDriver().switchTo().defaultContent(); GetDriver().switchTo().frame(Control(By.Id («TB_iframeContent»)));’но это НЕ работа

2. @YuGo Что Control(..) здесь?? И почему вы не пытаетесь as GetDriver().switchTo().defaultContent(); GetDriver().switchTo().frame("TB_iframeContent"); ?? Поскольку он принимает идентификатор и имя напрямую, нет необходимости указывать объект by для этого. Спасибо

3. @SaurabhGaur Извините, что я забыл отредактировать свой комментарий. GetDriver().switchTo().defaultContent(); GetDriver().switchTo().frame("TB_iframeContent"); возврат Current window is closed Я делаю все возможное. Но это действительно большая проблема для меня!

4. <iframe hspace="0" src="CompanyDetail.aspx?" id="TB_iframeContent" name="TB_iframeContent964" onload="tb_showIframe()" style="width:879px;height:562px;" frameborder="0"> </iframe> Имя динамически меняется, а идентификатор — НЕТ.

5. @Yugo этот элемент iframe открывается в новом окне??