C# 硒罐';在iframe内部回发后找不到iframe

C# 硒罐';在iframe内部回发后找不到iframe,c#,selenium,selenium-chromedriver,C#,Selenium,Selenium Chromedriver,我正在尝试创建一个测试,在这个测试中,我必须在iframe中填写一些信息。访问iframe工作正常,我可以在框架内填写信息。问题是,当我填写一个文本框“a”时,它会附加一个回发,重新加载iframe中的内容,以根据文本框a中的信息填写另一个文本框“B” 以下是我的观察结果: 当我第一次定位iframe时,它看起来如下所示: <iframe frameborder="0" src="<removed for clearity>">...</iframe> &l

我正在尝试创建一个测试,在这个测试中,我必须在iframe中填写一些信息。访问iframe工作正常,我可以在框架内填写信息。问题是,当我填写一个文本框“a”时,它会附加一个回发,重新加载iframe中的内容,以根据文本框a中的信息填写另一个文本框“B”

以下是我的观察结果: 当我第一次定位iframe时,它看起来如下所示:

<iframe frameborder="0" src="<removed for clearity>">...</iframe>
<iframe frameborder="0" src="<removed for clearity>" cd_frame_id_="668325d5a0a2a8cb76a92b9eb819d327">...</iframe>
我可以轻松地在文本框A中输入文本:

var completed = driver.FindElement(By.Id("MainContent_txtCompletedHours")); 
completed.SendKeys("0,25");
然后我等待文本框B被填充,但在这一点上,我找不到它,也找不到iframe。我试图重新定位帧以再次切换到它,但找不到元素。它没有移动位置。它刚刚得到了cd\u frame\u id属性。下面是我尝试重新定位iframe的代码:

while (true)
{
    try
    {
        iframe = driver.FindElement(By.XPath("//div[@rawtitle=\"TIME\"]//table//tbody//tr//td//div//div//iframe"));
        driver.SwitchTo().Frame(iframe);
        invoiced = driver.FindElement(By.Id("MainContent_txtInvoiceHours")); 
        if (invoiced.Text == "0,25") // and wait for it
            break;
    }
    catch (NoSuchElementException e)
    {
        Debug.WriteLine("Could not find element, retrying...");
    }
    finally
    {
        Thread.Sleep(500);
    }
}
当我尝试获取iframe元素时,代码失败


在帧内回发之后,我如何才能再次获得iframe?

正如您在填写文本框“a”时提到的,它附带了回发,因此我们将借助一个独特的
xpath
,它标识
,如下所示:

//Ensure that you are back to the base frame
driver.SwitchTo().DefaultContent();
//SwitchTo the intended frame
driver.SwitchTo().Frame(driver.FindElement(By.XPath("//iframe[contains(@src,'<removed for clearity>')]")));
//确保回到基本帧
driver.SwitchTo().DefaultContent();
//切换到预期的帧
driver.SwitchTo().Frame(driver.FindElement(By.XPath(“//iframe[contains(@src,”)])));

我真不敢相信我没看到。当然,我必须在原始内容中才能找到框架。框架现在是完全可拆卸的。我确实有一个问题,textbox B内容显示正确,但元素的text属性为空。但这是我将研究的另一个问题。非常感谢。
//Ensure that you are back to the base frame
driver.SwitchTo().DefaultContent();
//SwitchTo the intended frame
driver.SwitchTo().Frame(driver.FindElement(By.XPath("//iframe[contains(@src,'<removed for clearity>')]")));