我正在尝试创建一个测试,我必须在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?
答案 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>')]")));