通过fancybox2设置iframe ID以允许webdriver switchTo()->frame(ID)


setting iframe ID via fancybox2 to allow webdriver switchTo()->frame(id)

我正在使用fancybox2来创建iframe,但我看不到设置iframe ID的方法,这阻止了我使用php-webdriver和selenium来测试iframe的内容。

简化版代码:

<a href="iframe.html" class="various fancybox.iframe">iframe</a>
<script>
$(document).ready(function() {
    $(".various").fancybox()
});
</script>

这工作,但使用Chrome的检查器,iframe(这一次)生成的ID为fancybox-frame1443817733402,看起来是随机的。这意味着当我尝试使用php-webdriver切换到这个帧(点击链接创建iframe),我无法预测帧的ID传入:

$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的ID之前,试图通过这个ID切换到帧,但这也失败了(我认为因为current是一个对象,而不是一个元素?)

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

是否有明确设置iframe的ID,以便我可以通过selenium/webdriver切换到它的方法?或者有更简单的方法?

我不知道这里如何设置帧id,但是您可以通过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();