C# 正在等待使用Selenium加载帧

C# 正在等待使用Selenium加载帧,c#,selenium,C#,Selenium,我在Selenium中看到过许多关于处理帧间切换的帖子,但它们似乎都引用了Java“ExpectedConditions”库中的以下方法 ExpectedConditions.frameToBeAvailableAndSwitchToIt 我想知道在任何地方是否有C#实现,或者是否有人有这样的工作 干杯在C#绑定中没有直接的等价物,但是自己做这件事很容易 请记住,Selenium是开源的,所以让我们挖掘源代码。和 那么Java版本在做什么呢?我告诉你的不多 try { return dri

我在Selenium中看到过许多关于处理帧间切换的帖子,但它们似乎都引用了Java“ExpectedConditions”库中的以下方法

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


干杯

在C#绑定中没有直接的等价物,但是自己做这件事很容易

请记住,Selenium是开源的,所以让我们挖掘源代码。和

那么Java版本在做什么呢?我告诉你的不多

try {
  return driver.switchTo().frame(frameLocator);
} catch (NoSuchFrameException e) {
  return null;
}
它所做的一切都是尝试切换到您告诉它的帧,如果它成功了(如中所示,尝试这样做也不例外),那么它就假定它可以继续

因此,您需要做的就是在C#中执行相同的操作,例如(未编译):

公共静态函数waitUntilFrameLoaded和SwitchToIt(按byToFindFrame)
{
返回(驱动程序)=>
{
尝试
{
返回driver.SwitchTo().Frame(driver.FindElement(byToFindFrame));
}
捕获(例外)
{
返回null;
}
返回true;
};
}
与中一样,保持相同的概念:尝试查找帧并切换到它,任何异常都返回
null
,并强制调用方(通常是
WebDriverWait
实例)再次迭代。返回
true
将告诉来电者我们很高兴可以继续前进


所有等待和期望条件类都位于
OpenQA.Selenium.Support.UI
名称空间中,该名称空间位于
WebDriver.Support.dll
程序集中。

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

请记住,Selenium是开源的,所以让我们挖掘源代码。和

那么Java版本在做什么呢?我告诉你的不多

try {
  return driver.switchTo().frame(frameLocator);
} catch (NoSuchFrameException e) {
  return null;
}
它所做的一切都是尝试切换到您告诉它的帧,如果它成功了(如中所示,尝试这样做也不例外),那么它就假定它可以继续

因此,您需要做的就是在C#中执行相同的操作,例如(未编译):

公共静态函数waitUntilFrameLoaded和SwitchToIt(按byToFindFrame)
{
返回(驱动程序)=>
{
尝试
{
返回driver.SwitchTo().Frame(driver.FindElement(byToFindFrame));
}
捕获(例外)
{
返回null;
}
返回true;
};
}
与中一样,保持相同的概念:尝试查找帧并切换到它,任何异常都返回
null
,并强制调用方(通常是
WebDriverWait
实例)再次迭代。返回
true
将告诉来电者我们很高兴可以继续前进


所有等待和期望条件类都位于
OpenQA.Selenium.Support.UI
命名空间中,该命名空间位于
WebDriver.Support.dll
程序集中。

我刚刚提交了一个如此丑陋的代码。为了未来而在这里降落

     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());
    }
protectedvoid SwitchToFrame(int-iframe=1)
{
var driver=GetWebDriver();
driver.SwitchTo().DefaultContent();
bool done=false,timeout=false;
int计数器=0;
做
{
计数器++;
尝试
{
驱动程序.切换到().帧(iframe);
完成=正确;
}
catch(OpenQA.Selenium.NoSuchFrameException)
{

如果(counter我刚刚犯了一个如此丑陋的代码。为了将来,我会把它放在这里

     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());
    }
protectedvoid SwitchToFrame(int-iframe=1)
{
var driver=GetWebDriver();
driver.SwitchTo().DefaultContent();
bool done=false,timeout=false;
int计数器=0;
做
{
计数器++;
尝试
{
驱动程序.切换到().帧(iframe);
完成=正确;
}
catch(OpenQA.Selenium.NoSuchFrameException)
{

如果(counter这些答案是旧的,我也有同样的问题。我能够使用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")));

这些答案都是老生常谈,我也有同样的问题。我能够使用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")));

.frametobeavailable和switchtoit()
听起来像是一个自定义方法。您可能需要自己在C中构建一些东西。#
frametobeavailable和switchtoit()
听起来像是一个自定义方法。您可能需要自己在C中构建一些东西#