如何通过Selenium和Java提供的HTML切换到iframe?

时间:2018-09-05 10:11:38

标签: java selenium selenium-webdriver iframe webdriver

这样,我尝试切换到框架:

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

完整的html代码上有三个iframe,我尝试切换到第三个iframe,我也可以使用xpath来定位该iframe,但是在运行脚本驱动程序后无法定位该异常并引发异常

例外:

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

3 个答案:

答案 0 :(得分:0)

在这里,您可以找到每个iframe元素的索引

<input type="text" onfocus="myF();" />
<div id="mails">hii</div>

如果您要从iframe切换到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(1)

iframe(2)

答案 1 :(得分:0)

我正在根据您的评论进行工作:

  

,因此您可以在上面的代码中看到浏览器上有三个iframe。发生了什么事情,我单击一个链接然后与元素交互,我必须切换到iframe,在这里我可以切换,但是在单击元素之后,我将导航到下一页,并且在其中引入了另一个iframe我找不到iframe

您需要以下事件顺序:

  1. 切换到您的iframe。至此,您的def freq(L): st = [] L.sort() for i in L: st.append(L.count(i)) print max(st) 实例正在指向此iframe!
  2. 单击过渡到下一页的元素。
  3. 您的driver实例 still 指向步骤1中的iframe!您需要使用driver将其重置为顶层文档。
  4. 现在您只能在刚刚导航到的页面上切换到新的iframe。

答案 2 :(得分:0)

根据您共享的基于文本的HTML HTML 快照,尚不清楚是否有多个 iframe 。因此,考虑将此<iframe>作为唯一的 iframe ,您需要在切换到<iframe>时按以下步骤诱导 WebDriverWait

  • cssSelector

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe[id^='vfFrameId_'][name^='vfFrameId_'][title='Deploy Data Set']")));
    
  • xpath

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

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

  • xpath

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//div[@class='windowViewMode-normal oneContent active forcePageHost' and @data-aura-class='forcePageHost']//following::iframe[1]")));