在非 ajax 页面上使用 selenium 时,是否总是需要 "wait" 来加载页面?

Do I always have to "wait" for page loads when using selenium on non-ajax pages?

我正在使用 Cucumber、Selenium 和 Xunit 为遗留 ASP.Net 应用程序编写一些 BDD 测试。页面的设计方式是,每个 "click" 都会导致从服务器获取一个新页面。如果我必须对特定页面进行自动化测试,我是否应该在每个 "click"?

之后有类似于以下的一行
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));
wait.Until(...); //Wait until something about the page is true

我不确定 Selenium 是否会隐式等待页面加载,而无需我一直明确说明这一点。处理这种情况的推荐模式是什么?

总是有一个 "some element" 的想法很麻烦,这样我就可以把它放在 Until 方法中,这会导致脆弱的测试。 ASP.Net 页面散布着许多动态控件和大量页面刷新,这使得测试代码非常难读。

我提出的解决方案: 编写一个扩展方法,它隐式地进行等待,并接受要等待的元素 ID 的参数。但我只是将上述问题重构到一个更易于管理的地方。我仍然等待被明确执行。没有办法消除吗? selenium 是否有一些明显的默认值可以在不需要这种扩展方法的情况下处理这种情况,或者这真的是一种自然的方式吗?

如果您希望您的测试可靠并且只等待确切需要的时间间隔 - 那么是的,使用 WebDriverWait 的显式等待是一个完美的解决方案。而且,它实际上是一个非常 "natural" 的解决方案 - 想想您作为用户如何定义页面加载 - 通常是在您看到所需内容时,对吗?当您查看加载页面时,您正在不断地重新评估页面的状态,检查是否出现了所需的内容。显式等待遵循相同的逻辑——默认情况下,它每 500 毫秒检查一次预期条件是否为真,但不超过你在实例化时配置的 X 秒 WebDriverWait.

如果您需要经常使用wait.until()调用并且希望遵循DRY原则,请考虑应用"Extracting Method"或其他重构方法。

您可以设置将应用于每个元素搜索的隐式等待,或引入硬编码 "artificial" 延迟,但这并不可靠并且会浪费时间 - 您最终会等待超出需要并且偶尔会出现测试失败。