如何根据Selenium和Java提供的HTML切换到iframe?

问题描述 投票:0回答:3

这样我试图切换到框架:

driver.switchTo().frame(driver.findElement(By.xpath(("//iframe[contains(@name,'vfFrameId')]//following::iframe[2]"))));

在完整的html代码上有三个iframe,我正在尝试切换到第三个,我能够使用xpath定位,但在运行脚本驱动程序后无法找到并抛出异常。

例外:

no such element: Unable to locate element: {"method":"xpath","selector":"//iframe[contains(@name,'vfFrameId')]//following::iframe[2]"}

HTML:

<div class="windowViewMode-normal oneContent active forcePageHost" data-aura-rendered-by="1330:0" data-aura-class="forcePageHost">
    <div class="oneAlohaPage" data-aura-rendered-by="1335:0" data-aura-class="oneAlohaPage">
        <force-aloha-page data-data-rendering-service-uid="240" data-aura-rendered-by="1338:0" force-aloha-page_aloha-page="">
            <div class="slds-template_iframe slds-card" force-aloha-page_aloha-page="">
                <iframe height="100%" width="100%" scrolling="yes" allowtransparency="true" id="vfFrameId_1536141890078" name="vfFrameId_1536141890078" allowfullscreen="true" force-aloha-page_aloha-page="" allow="geolocation *; microphone *; camera *" title="Deploy Data Set"></iframe>
            </div>
        </force-aloha-page>
    </div>
</div>

enter image description here

java selenium selenium-webdriver iframe webdriver
3个回答
0
投票

以下是如何查找每个iframe元素的索引

List <WebElement> options= driver.findElements(By.tagName("iframe"));
    for(WebElement e: options) {
        String index=e.getAttribute("index");
        System.out.println("Index for: "+e.getAttribute("name")+" is: "+index);// to print out name attribute and index
    }

如果您要从iframe切换到始终无效的iframe。您可能需要先从iframe(1)切换到默认内容,然后切换到iframe(2)

driver.switchTo().frame(your locator for 1st iframe here);// to switch to 1st iframe
// your action here
driver.switchTo().defaultContent();
driver.switchTo().frame(your locator for 2nd iframe here); // to switch to 2nd iframe

0
投票

我正在评论你的评论:

所以你可以看到上面的代码,你可以看到浏览器上有三个iframe可用。如果我点击一个链接然后与我必须切换到iframe的元素进行交互会发生什么,我可以切换但是在点击一个元素之后,我将导航到下一页并且还有另一个iframe介绍在哪里我无法找到iframe

您需要以下事件序列:

  1. 切换到您的iframe。从这一点开始,你的driver实例指向这个iframe!
  2. 单击转换到下一页的元素。
  3. 你的driver实例仍然指向第1步的iframe!您需要使用以下命令将其重置为顶级文档:driver.switchTo().defaultContent();
  4. 只有现在才能切换到刚刚导航到的页面上的新iframe。

0
投票

根据基于文本的HTML和您共享的HTML快照,如果有多个iframe可用,则不明显。因此,考虑到这个<iframe>作为一个独特的iframe,您需要在切换到<iframe>时诱导WebDriverWait,如下所示:

  • cssSelectornew WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe[id^='vfFrameId_'][name^='vfFrameId_'][title='Deploy Data Set']")));
  • xpathnew WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@id,'vfFrameId_')][starts-with(@name,'vfFrameId_')][@title='Deploy Data Set']")));

如果有多个iframe可用,我们在上面使用了相同的属性,您可以使用以下解决方案:

  • xpathnew WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//div[@class='windowViewMode-normal oneContent active forcePageHost' and @data-aura-class='forcePageHost']//following::iframe[1]")));
© www.soinside.com 2019 - 2024. All rights reserved.