如何解决试图在页面上获取所有iFrame,但遇到了ProcessEndedUnexpectedlyException尝试了异步功能,仅解析一个iFrame我怎样才能解决这个问题?
因此,我正在创建一个基础iFrame类,以通用方式从任何页面解析嵌套的iFrame,而无需利用ID,xpath或任何特定于DOM的过程。考虑到这些信息,我有两个问题:
问题1 :尽管我认为我的代码在逻辑上是合理的,但我一直遇到ProcessEndedUnexpectedlyException。这是预期的,因为我使用的是静态方法,但是您对改进我的代码有任何建议吗?
BaseiFrame类:
namespace [Confidental namespace] {
public class BaseIFrame {
protected IWebDriver _driver;
private ReadOnlyCollection<IWebElement> _iframes;
public BaseIFrame(IWebDriver _driver) {
this._driver = _driver;
_iframes = _driver.FindElements(By.TagName("frame"));
_iframesSize = _iframes.Count();
}
public ReadOnlyCollection<IWebElement> getFrames() {
return _iframes;
}
private static IEnumerable GetAllFramesRecursive<T>(IWebElement frame,IWebDriver driver)
{
var result = new Stack<IWebElement>();
BaseIFrame baseClass = new BaseIFrame(driver);
var iFrameList = baseClass._iframes;
foreach (var i in iFrameList)
{
result.Push(i);
foreach (IWebElement e in GetAllFramesRecursive<IWebElement>(i,driver))
{
result.Push(e);
}
}
return result;
}
// Public callable method for unit test
public void GetAlliFramesRecursivePublic<T>(IWebElement test,IWebDriver driver)
{
GetAllFramesRecursive<IWebElement>(test,driver);
}
}
}
BaseiFrameTests类:
[TestMethod]
public void AssertiFrameLength()
{
Login();
var expected = 0;
BaseIFrame bif = new BaseIFrame(_driver);
bif.GetAlliFramesRecursivePublic<IWebElement>(bif.getFrames()[0],_driver);
var elementSize = _driver.FindElements(By.TagName("*")).Count;
for (var i = 0; i < elementSize; i++)
{
var iframesSize = _driver.FindElements(By.TagName("frame")).Count;
expected += iframesSize;
}
var actual = bif.getFrames();
Assert.AreEqual(expected,actual.Count);
}
问题2 :为了解决上述问题,我尝试实现异步功能,因此我可以无错误地运行单元测试。不幸的是,现在我只解析页面上的单个iFrame。我该如何解决?
private static async Task<IEnumerable<T>> GetAllFramesRecursive<T>(IWebElement frame,IWebDriver driver)
{
dynamic result = new Stack<IWebElement>();
BaseIFrame baseClass = new BaseIFrame(driver);
var iFrameList = baseClass._iframes;
var iFrameCount = iFrameList.Count;
foreach (var i in iFrameList)
{
result.Push(i);
for (var j = 0; j < iFrameCount; j++)
{
result.Push(j);
await GetAllFramesRecursive<T>(i,driver);
}
}
return result;
}
// Public callable method for unit test
public void GetAlliFramesRecursivePublic<T>(IWebElement test,driver);
}
以上代码使用发布的相同单元测试。最终结果如下:
Assert.AreEqual failed. Expected:<24>. Actual:<1>.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。