我需要动态迭代所有 iframe 及其子 iframe,因为我想对所有 <img>
执行一些操作。标签。我正在使用 Selenium 。
public class logic {
static WebDriver driver;
static List<WebElement> TotaliinnerFrames=null;
logic()
{
driver=new FirefoxDriver();
driver.get("aaaa.html");
}
public static void main(String[] args)
{
logic log=new logic();
find_parent_iFrame();
}
private static void find_parent_iFrame()
{
List<WebElement> TotaliFrames = driver.findElements(By.tagName("iframe"));
System.out.println("TotaliFrames\t"+TotaliFrames.size());
for(WebElement frame:TotaliFrames)
{
System.out.println("calling main frame==============================>\t");
findLandingPage(frame);
}
if(TotaliFrames.size()>0)
{
driver.switchTo().defaultContent();
}
else
{
List<WebElement> canvas = driver.findElements(By.tagName("canvas"));
List<WebElement> img = driver.findElements(By.tagName("img"));
List<WebElement> anchor = driver.findElements(By.tagName("a"));
if(canvas.size()>0)
{
System.out.println("inside canvas");
for(WebElement canvTemp : canvas)
{
callClick(canvTemp);
}
}
if(img.size()>0)
{
System.out.println("inside img");
for(WebElement imge : img)
{
callClick(imge);
}
}
if (anchor.size()>0)
{
System.out.println("inside anchor");
for(WebElement anchorc : anchor)
{
callClick(anchorc);
}
}
}
}
private static void findLandingPage(WebElement frame)
{
driver.switchTo().frame(frame);
List<WebElement> canvas = driver.findElements(By.tagName("canvas"));
List<WebElement> img = driver.findElements(By.tagName("img"));
List<WebElement> anchor = driver.findElements(By.tagName("a"));
System.out.println("canvas\t"+canvas.size());
System.out.println("img\t"+img.size());
System.out.println("anchor\t"+anchor.size());
if(canvas.size()>0)
{
System.out.println("inside canvas");
for(WebElement canvTemp : canvas)
{
callClick(canvTemp);
}
}
if(img.size()>0)
{
System.out.println("inside img");
for(WebElement imge : img)
{
callClick(imge);
}
}
if(anchor.size()>0)
{
System.out.println("inside anchor");
for(WebElement anchorc : anchor)
{
callClick(anchorc);
}
}
TotaliinnerFrames = driver.findElements(By.tagName("iframe"));
System.out.println("TotaliinnerFrames\t"+TotaliinnerFrames.size());
int innerframesize=TotaliinnerFrames.size();
if(innerframesize>0)
{
System.out.println("TotaliinnerFrames\t"+innerframesize);
for(WebElement inframe:TotaliinnerFrames)
{
System.out.println("calling inner recursive\t");
findLandingPage(inframe);
}
TotaliinnerFrames.clear();
}
else
{
driver.switchTo().defaultContent();
}
}
private static void callClick(WebElement canvTemp)
{
try
{
canvTemp.click();
}
catch(Exception e)
{
System.out.println("Exception unable to click");
}
}
}
我需要动态迭代所有 iframe 及其子 iframe,我想要所有标签并执行一些操作。使用 Selenium 。
最佳答案
您无法跨页面加载(例如通过点击启动)保存对 WebElement
的引用,因为它们仅在其自己的页面上有效。它们不仅仅是任何旧的 Java 对象。正如您所见,您将得到 StaleElementReferenceException
。
逐页工作,而不是跨多个页面。
编辑:这里是an even better explanation .
关于java - 使用 selenium,我需要动态迭代所有 iframe 及其子 iframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35130727/