在iframe内回发后,Selenium无法找到iframe

时间:2017-11-22 08:11:59

标签: c# selenium selenium-chromedriver

我正在尝试创建一个测试,我必须在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>

所以发生了一些变化。

在我的C#代码中,首先找到我的框架(这是最好的方式):

var iframe = driver.FindElement(By.XPath("//div[@rawtitle=\"TIME\"]//table//tbody//tr//td//div//div//iframe"));
driver.SwitchTo().Frame(iframe);

我可以轻松地在文本框中输入文字A:

var completed = driver.FindElement(By.Id("MainContent_txtCompletedHours")); 
completed.SendKeys("0,25");

然后我等待文本框B被填充但是此时,我找不到它,我也找不到iframe。我试图再次重新定位框架再次切换到它,但我找不到该元素。它没有移动位置。它刚刚获得了cd_frame_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?

1 个答案:

答案 0 :(得分:1)

正如您在填写文本框时所提到的那样,&#39; A&#39;它附有一个回发,因此我们将采用一个独特的xpath hich帮助识别<iframe>,如下所示:

//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>')]")));