gpt4 book ai didi

c# - 在 iframe 内回发后,Selenium 找不到 iframe

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:43 25 4
gpt4 key购买 nike

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

最佳答案

正如您提到的,当您填写文本框“A”时,它会附加一个回传,因此我们将借助一个独特的 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>')]")));

关于c# - 在 iframe 内回发后,Selenium 找不到 iframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47429683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com