这样我试图切换到框架:
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>
以下是如何查找每个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
我正在评论你的评论:
所以你可以看到上面的代码,你可以看到浏览器上有三个iframe可用。如果我点击一个链接然后与我必须切换到iframe的元素进行交互会发生什么,我可以切换但是在点击一个元素之后,我将导航到下一页并且还有另一个iframe介绍在哪里我无法找到iframe
您需要以下事件序列:
driver
实例指向这个iframe!driver
实例仍然指向第1步的iframe!您需要使用以下命令将其重置为顶级文档:driver.switchTo().defaultContent();
。根据基于文本的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]")));