我怎么等待一个webelement消失?

时间:2013-10-11 19:44:56

标签: c# selenium-webdriver

我正在测试一个应用程序,该应用程序的页面上显示了许多不同的成果。我需要按重量缩小它们。提交权重范围会触发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 / catches或thread.sleeps乱丢我的代码之外,如何从异常中安全地测试此页面?

1 个答案:

答案 0 :(得分:0)

如果加载指示器具有任何高度/宽度属性,则尝试等待它为零或不覆盖整页的尺寸