установка идентификатора iframe с помощью fancybox2, чтобы разрешить переключателю webdriver switchTo () — & gt; frame (id)

я использую fancybox2 для создания фреймов, но я не вижу способа установки идентификатора создаваемого фрейма, который не позволяет мне использовать php-webdriver и selenium для тестирования содержимого фрейма.

Упрощенная версия кода:

<a href="iframe.html" class="various fancybox.iframe">iframe</a>

<script>
$(document).ready(function() {
$(".various").fancybox()
});
</script>

Что работает, но с помощью инспектора Chrome, iframe (на этот раз) был создан с идентификатором
fancybox-frame1443817733402, который выглядит случайным. Это означает, что когда я пытаюсь использовать php-webdriver для переключиться на этот кадр (щелкнув по ссылке, чтобы создать iframe), я не могу предсказать идентификатор кадра для передачи:

$frame_id = 'fancybox-frame1443817733402'; // can't predict this in advance
$driver->switchTo()->frame($frame_id);

Iframe всегда генерируется с классом fancybox-iframe но призывает

$iframe = $driver->findElement(WebDriverBy::class("fancybox-iframe"))

ничего не вернуть

Я также пытался использовать fancybox2 afterLoad обратный вызов, чтобы попытаться явно установить идентификатор iframe, прежде чем пытаться переключиться на фрейм с помощью этого идентификатора, но это также не удается (я думаю, потому что current это объект, а не элемент?)

$(".various").fancybox({
afterLoad: function(current, previous) {
//console.log(current);
current.attr('id', 'rob');
}});

Есть ли способ явно установить идентификатор iframe, чтобы я мог переключиться на него через selenium / webdriver? Или есть более простой способ сделать это?

1

Решение

Я не знаю, как установить идентификатор кадра здесь, но вы можете переключиться на кадр через xpath (например, // frame):

    protected WebElement gotoIframeByXpath(final String iframeXpath) {
if (driver.findElements(By.xpath(iframeXpath)).size() > 0) {  // find elements so an exception isn't thrown if not found
WebElement contentFrame = driver.findElement(By.xpath(iframeXpath));
driver.switchTo().frame(contentFrame);
return contentFrame;
} else {
System.out.println("Unable to find " + iframeXpath);
}
return null;
}
2

Другие решения

Для тех, кто заинтересован, следуя ответу @ EGHM выше, я так и сделал.

// this also works & is a little simpler
//$iframes = $driver->findElements(WebDriverBy::tagName('iframe'));

$iframes = $driver->findElements(WebDriverBy::xPath('//*[starts-with(@id,"fancybox-frame")]'));
$id = $iframes[0]->getAttribute('id');

$driver->switchTo()->frame($id);
echo $driver->getPageSource();
1

По вопросам рекламы [email protected]