я использую 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? Или есть более простой способ сделать это?
Я не знаю, как установить идентификатор кадра здесь, но вы можете переключиться на кадр через 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;
}
Для тех, кто заинтересован, следуя ответу @ 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();