我已经看过很多关于处理Selenium中帧之间切换的帖子,但他们似乎都参考了Java'ExpectedConditions'库以获得以下方法。
ExpectedConditions.frameToBeAvailableAndSwitchToIt
我想知道在任何地方是否有任何C#实现,或者是否有人有这样的工作?
干杯
答案 0 :(得分:3)
在C#绑定中没有直接的等价物,但是你自己很容易做到这一点。
请记住,Selenium是开源的,所以让我们挖出源代码。 Here is the Java ExpectedConditions和here is the C# set。
那么Java版本在做什么?好吧,我告诉你的不是很多。
try {
return driver.switchTo().frame(frameLocator);
} catch (NoSuchFrameException e) {
return null;
}
所有它正在尝试切换到你告诉它的框架,并提供它是成功的(因为,试图这样做没有例外),然后它假设它可以继续。
所以,你需要做的只是在C#中做同样的事情,所以像(未编译):
public static Func<IWebDriver, bool> WaitUntilFrameLoadedAndSwitchToIt(By byToFindFrame)
{
return (driver) =>
{
try
{
return driver.SwitchTo().Frame(driver.FindElement(byToFindFrame));
}
catch (Exception)
{
return null;
}
return true;
};
}
同样,保持相同的概念:尝试找到框架并切换到它,任何异常然后我们返回null
并强制调用者(通常是WebDriverWait
实例)再次迭代。返回true
会告诉来电者我们很高兴我们可以继续前进。
等待和等待预期条件类位于OpenQA.Selenium.Support.UI
程序集中的WebDriver.Support.dll
命名空间中。
答案 1 :(得分:0)
我刚刚提交了如此丑陋的代码。放下这里未来!
protected void SwitchToFrame(int iframe = 1)
{
var driver = GetWebDriver();
driver.SwitchTo().DefaultContent();
bool done = false, timeout = false;
int counter = 0;
do
{
counter++;
try
{
driver.SwitchTo().Frame(iframe);
done = true;
}
catch (OpenQA.Selenium.NoSuchFrameException)
{
if (counter <= Constants.GLOBAL_MAX_WAIT_SEC)
{
Wait(1);
continue;
}
else timeout = true;
}
} while (!done && !timeout);
if (timeout) throw new OpenQA.Selenium.NoSuchFrameException(iframe.ToString());
}
答案 2 :(得分:0)
这些答案很旧,我也遇到了同样的问题。我能够使用nuget中的SeleniumExtras.WaitHelpers.ExpectedConditions轻松实现这一目标。
//wait for 10 seconds max for the frame
WebDriverWaitwait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.Id("FRAMEID")));