好的,我正在寻找一个可靠的答案,这暗示了我这一点。我正在尝试制定一个程序来处理查找嵌入在其他框架内的框架内的元素。我一直遇到的问题是我试图搜索的框架会在两行代码内保持陈旧状态。
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
try
{
if (IsElementPresent(driver, by))
{
locator = driver.FindElement(by);
return locator;
}
else
{
List<IWebElement> iframe = new List<IWebElement>(driver.FindElements(By.TagName("frame")));
if (iframe.Count > 1) // <- Frame Check
{
foreach (IWebElement frame in iframe)
{
driver.SwitchTo().Frame(frame);
if (IsElementPresent(driver, by))
{
locator = driver.FindElement(by);
return locator;
}
else
{
List<IWebElement> imbedFrame = new List<IWebElement>(frame.FindElements(By.TagName("frame")));
if (imbedFrame.Count > 1) // <- Imbedded Frame Check
{
foreach (IWebElement innerFrame in imbedFrame)
{
driver.SwitchTo().Frame(innerFrame);
if (IsElementPresent(driver, by))
{
locator = driver.FindElement(by);
return locator;
}
}
}
}
}
}
}
}
catch (StaleElementReferenceException SRE)
{
getStaleElemById(driver, by);
}
public static IWebElement getStaleElemById(IWebDriver driver, By by)
{
try
{
return driver.FindElement(by);
}
catch (StaleElementReferenceException e)
{
if (IsElementPresent(driver, by))
{
IWebElement locator = driver.FindElement(by);
return locator;
}
else
{
return getStaleElemById(driver, by);
}
}
catch (NoSuchElementException NSE)
{
return getStaleElemById(driver, by);
}
}
在我的“ else”块中,如果在页面上没有最初找到该元素,它将首先在该页面上搜索框架。当找到它们时,从第一个开始,如果找不到元素,它将搜索嵌入在框架中的框架。到它尝试在“针对帧中的每一帧”块的帧中搜索帧时,该帧已经过时。
我不能只回想一下对框架的分配,因为我仍然处于foreach循环之内,该循环取决于与“框架”的初始关系。有什么方法可以刷新DOM或以某种方式确保我的框架保持活动状态?