【问题标题】:C# Selenium WebDriver - Solution to Wait for Outstanding HTTP RequestsC# Selenium WebDriver - 等待未完成的 HTTP 请求的解决方案
【发布时间】:2021-03-18 14:48:48
【问题描述】:

背景

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

问题

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

我假设我可能需要设置一个代理,以便我可以操纵和挂钩 HTTP 请求。我查看了BrowserUpBrowserMobProxy 项目的延续,似乎不再维护),但无法从文档中判断这种用例是否可行或有意。

【问题讨论】:

  • 好问题,我也很想听到任何答案

标签: c# selenium browsermob-proxy


【解决方案1】:

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

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

基本上,为了实现稳定的测试,您会遇到显式等待。这些年来,我经历了很多很多的障碍,以使事情以其他方式运作。我发现的唯一可取之处是Page Object Model Pattern,对于任何特定的用例,它至少将这段丑陋的代码集中在一个地方。

所以,是的。代码很丑。您需要使用显式等待。事实证明,测试代码需要与其测试的应用程序代码一样有针对性地进行架构。

【讨论】:

  • 100% 同意这个“事实证明,测试代码需要像它测试的应用程序代码一样有针对性的架构。”。它肯定被低估了。您提出了一个很好的观点,即使在从 API 获取数据之后,页面仍然需要呈现。这就是我欣赏赛普拉斯默认重试检查的方法的原因之一。虽然我在最初的问题中没有涉及到它,但我仍然有兴趣在前端挂钩 API,以操纵传入或对传出请求进行断言。
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2015-01-21
  • 2018-11-28
  • 1970-01-01
  • 2018-01-07
相关资源
最近更新 更多