我正在使用Selenium进行一些测试。我的问题是我有4个嵌套的iframe,当我关闭一个iframe时,Selenium切换到错误的iframe。
为了帮助您理解我的问题,我有一个小略图:
因此,我的第一个框架(黑色的框架)打开了一个嵌套框架(灰色的框架),后者又打开了另一个框架(橙色的框架),然后又打开了另一个框架(白色的框架)。问题是:当我关闭白框时,硒会切换到灰色框,但通常应该切换到橙色框。
当框架关闭时,我使用driver.switchTo().parentFrame();
。每次都运行良好,但在那种情况下,它不起作用,我找不到问题。
我已经尝试了一些测试代码
if (driver.findElements(By.xpath("//iframe")).size() > 0) {
driver.switchTo().frame(driver.findElements(By.xpath("//iframe")).size() - 1);
}
但它也不起作用。
如果有人有想法或遇到相同的问题,我将很乐于尝试您的答案。
编辑:这是我的堆栈跟踪,因此在执行某些操作之前,我切换到所需的帧:
frameLocator = By.xpath: //*[@id='greyWindow']
___Before switch and before execute___
CurrentFrame =: title=defaultWindow
___After switch and before execute___
CurrentFrame = <IFRAME src=grey id=greyWindow>
frameLocator = By.xpath: //*[@class='redWindow']
___Before switch and before execute___
CurrentFrame = <IFRAME src=grey id=greyWindow>
___After switch and before execute___
CurrentFrame = <IFRAME src=red class=redWindow>
frameLocator = By.xpath: //iframe[contains(@src,'whiteWindow')]
___Before switch and before execute___
CurrentFrame = <IFRAME src=red class=redWindow>
___After switch and before execute___
CurrentFrame = <IFRAME src=whiteWindow>
Frame currently available : [[RemoteWebDriver: chrome on LINUX (5c408ef997226a10c864cbeec0a2472d)]
-> tag name: iframe] | frame.getAttribute("innerHTML") = // Nothing appear
Frame currently available : [[RemoteWebDriver: chrome on LINUX (5c408ef997226a10c864cbeec0a2472d)]
-> tag name: iframe] | frame.getAttribute("innerHTML") = // Nothing appear
//Here i just put some value and close the frame as every frame before
___Before switch and after execute___
CurrentFrame = title=defaultWindow
___After switch and after execute___
CurrentFrame = title=defaultWindow
然后我得到了nullPointerException因为当前帧不是红色窗口而是默认窗口
最佳答案
为什么不按名称或其他选择器切换到框架?
driver.switchTo().frame("name_or_id");
或者,您可以尝试将框架保存在WebElement变量中,然后切换到该变量。例如:
WebElement iframeElement = driver.findElement(By.id("name"));
driver.switchTo().frame(iframeElement);
如评论中所述,如果您需要在验证正确的列表后从列表访问iframe,则可以尝试:
List <WebElement> all_iframes = driver.findElements(By.tagName("iframe"));
for(WebElement iframe : all_iframes)
{
if(iframe.getAttribute("name") == "your required name")
{
//do some stuff
}
}