2013-12-05 5 views
6

Я хочу выбрать вложенный iframe в iframe с модулем selenium webdriver в node-js.Выбор вложенного iframe - selenium/javascript/node-js

Например:

<iframe id="firstframe"> 
    <div id="firstdiv"></div> 
    <iframe id="secondframe"> 
    <div id="seconddiv"></div> 
    </iframe> 
</iframe> 

для узла-Js части:

driver.switchTo().defaultContent(); 
driver.switchTo().frame("firstframe"); // --> works 
driver.switchTo().frame("secondframe"); // --> NoSuchFrameError 


iframes = driver.findElements(webdriver.By.tagName('iframe')).then(function(elements){ 
      console.log(elements.length); // --> if I put this code before the switch to first frame output: 1, if I put it after output: 0) 
      }); 

Я попытался с помощью номера индекса, но это также не удалось.

Edit:

Хорошо, я понял это, но мой ответ был удален пользователем @casparOne по какой-то причине. Если кто-то еще задается вопросом, в чем проблема:

Мой код выше работает, а не локально. Настройки безопасности Chrome отказываются идти глубже в iframe в локальном файле. Следовательно, он даже не показывал исходный код для iframe.

+0

Перед тем, как переключиться на 'secondframe', попробуйте вернуться к содержимому по умолчанию. –

+0

Получение «NoSuchFrameError». –

ответ

3

Я делал это раньше нескольких раз. Попробуйте поставить паузу в 1 секунду между кадрами swtich. (Иногда) вам нужно дать Selenium (или браузеру) достаточно времени для загрузки DOM кадра, прежде чем вы попробуете другой переключатель.

+0

'driver.switchTo(). Frame (" firstframe ");' \t \t \t 'setTimeout (function() {driver.switchTo(). Frame (" secondframe ");}, 5000);' все еще получает 'NoSuchFrameError' , Я также попытался использовать '.then()' -promise после первого. –

+0

Вы можете устранить неполадки с помощью XPath, чтобы получить все элементы из имени тега dom iframe. – djangofan

+0

О нас: driver.switchTo(). Frame ("firstframe"); driver.sleep ("2000"); driver.switchTo(). Frame ("secondframe"); Webdriver js управляет обещаниями selenium, используя так называемый «поток управления», в основном это менеджер обещаний (https://code.google.com/p/selenium/wiki/WebDriverJs#Control_Flows). Попробуйте использовать «официальных» официантов вместо setTimeout. В этом случае driver.sleep должен выполнить эту работу. –

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