C#Selenium WebDriver-等待未完成HTTP请求的解决方案



背景

在编写前端测试时,我们通常需要等到web应用程序完成获取数据和更新DOM之后,才能与页面进行交互。对于Selenium C#,这意味着要对页面的状态进行大量显式等待,这些状态是根据特定场景定制的(可能是等待加载指示符或特定元素出现(。然而,在大多数情况下,这个视觉指示器只是异步任务(如HTTP请求(的代理。其他解决方案,如Protractor和Cypress,有简单的等待HTTP请求的解决方案(这是Protractor中的默认解决方案(。

问题

我维护的其中一个框架是用C#编写的,我正试图找到一种解决方案来轻松等待任何未完成的HTTP请求,而不是针对DOM编写自定义的显式等待。有解决方案吗?如果需要,我愿意使用额外的开源解决方案。

我认为我可能需要设置一个代理,这样我就可以操纵并挂接HTTP请求。我研究了BrowserUp(BrowserMobProxy项目的延续,似乎不再维护(,但无法从文档中判断这种用例是否可能或有意。

我记得几年前试图用Ruby解决这个问题。我们决定采用JavaScript和Ruby的混合解决方案。每次发送Ajax请求时,我们都会将一个全局JavaScript变量设置为true。当所有挂起的请求都完成后,我们将其设置为false。我们仍然有不稳定的测试。即使在幕后进行一些JavaScript体操,它们也很脆弱且不一致。

即使Ajax(或后台HTTP请求(可能已经完成,JavaScript仍然需要额外的处理时间来处理响应。这只是几毫秒,但请记住,Selenium和您的浏览器在不同的线程中运行——一切都是竞争条件。由于HTTP请求已经完成,我们不断出现间歇性的测试失败,但浏览器仍在评估element.innerHTML = response.responseText的过程中,此时Selenium将尝试与请求完成后应该出现在屏幕上的元素进行交互。我们仍然需要使用明确的等待。

基本上,为了实现稳定的测试,您不得不进行显式等待。这些年来,我经历了很多困难,让事情以其他方式运转起来。我发现的唯一的可取之处是页面对象模型模式,它至少将这些丑陋的代码集中在一个地方,用于任何特定的用例。

所以,是的。代码很难看。您需要使用显式等待。事实证明,测试代码需要和它测试的应用程序代码一样有目的地构建。

相关内容

最新更新