我正在测试一个应用程序,该应用程序的页面上显示了许多各种水果。我需要按重量缩小它们的范围。提交权重范围会触发 AJAX 调用,该调用会弹出一个覆盖整个页面的加载指示器,直到调用成功返回。这是我失败的代码:
public MyPageObject InputWeightRange( int weight, int range = 1000 )
{
var page = PageFactory.InitElements<MyPageObject>(Driver);
var wait = new WebDriverWait( Driver, TimeSpan.FromSeconds( 10 ) );
wait.Until( driver => page._loadingIndicator.Displayed.Equals( false ) );
_upperWeight
.SendKeys( ( weight + ( range/2 ) ).ToString( CultureInfo.InvariantCulture ) ); //CultureInfo declarations to keep ReSharper happy.
_lowerWeight.SendKeys( ( weight- ( range/2 ) ).ToString( CultureInfo.InvariantCulture ) );
wait.Until(driver => page._loadingIndicator.Displayed.Equals(false));
wait.Until( driver => page._submitButton.Enabled );
_submitButton.Click();
wait.Until(driver => page._loadingIndicator.Displayed.Equals(false));
return this;
}
通常,代码有效。有时它在点击时失败,我认为是因为加载指示器也是由我在此之前在页面上执行的其他操作触发的。如您所见,我正在使用 WebDriverWait,但由于某种原因它不起作用。我从来没有在手动测试中看到加载指示器出现超过半秒。
实际的例外是:
System.InvalidOperationException was unhandled by user code
Message=unknown error: Element is not clickable at point (1234, 400). Other element would receive the click: <div id="loadingIndicator" class="loadingIndicator" style="display: block;">...</div>
编辑:请注意,该元素始终存在于 DOM 中,因此等待 Enabled 只会导致 WebDriverTimeout 异常。除了用 try/catch 或 thread.sleeps 乱扔我的代码之外,我怎样才能安全地测试这个页面以防出现异常?