等待使用Selenium加载帧

时间:2014-08-08 11:00:25

标签: c# selenium

我已经看过很多关于处理Selenium中帧之间切换的帖子,但他们似乎都参考了Java'ExpectedConditions'库以获得以下方法。

ExpectedConditions.frameToBeAvailableAndSwitchToIt

我想知道在任何地方是否有任何C#实现,或者是否有人有这样的工作?

干杯

3 个答案:

答案 0 :(得分:3)

在C#绑定中没有直接的等价物,但是你自己很容易做到这一点。

请记住,Selenium是开源的,所以让我们挖出源代码。 Here is the Java ExpectedConditionshere 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")));