【发布时间】:2017-11-22 17:28:23
【问题描述】:
我正在尝试创建一个测试,我必须在 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?
【问题讨论】:
标签: c# selenium selenium-chromedriver