我如何检测和等待一个覆盖在Selenium WebDriver


How do I detect and wait for an overlay in Selenium WebDriver?

有一个旋转器叠加出现在页面顶部,我必须等待它完成加载。当它消失后,我就可以点击元素了。但是,当我执行测试以查看元素是否可单击时,它总是返回true。我必须手动添加一个硬编码的等待时间,以使旋转器消失。问题是它非常脆弱和不确定。有时它需要比硬编码时间更长的时间,并产生一个错误。当然,当它花费较少的时间时,它仍然需要等待,并且非常缓慢和浪费时间。这是代码:

echo "Finding Advanced'n";
$driver->wait(10)->until( WebDriverExpectedCondition::elementToBeClickable( WebDriverBy::partialLinkText('Advanced') ) );
sleep(3); // spinner
$driver->findElement(WebDriverBy::partialLinkText("Advanced"))->click();

这是当旋转器覆盖比预期的时间长时的错误消息:

Finding Advanced
PHP Fatal error:  Uncaught exception 'UnknownServerException' with message 'unknown error: Element is not clickable at point (89, 127). Other element would receive the click: <div id="socialLoader" class="overlay" style="display: block; left: 0px; right: 0px; top: 0px; bottom: 0px; position: absolute;">...</div>
  (Session info: chrome=42.0.2311.152)
  (Driver info: chromedriver=2.14.313457 (3d645c400edf2e2c500566c9aa096063e707c9cf),platform=Windows NT 6.3 x86_64) (WARNING: The server did not provide any stacktrace information)

我试了下面的

$driver->findElement(WebDriverBy::cssSelector('button.xBtn.remove'))->click();
sleep(1); // spinner
echo "Finding Advanced'n";
$driver->wait(10)->until( WebDriverExpectedCondition::invisibilityOfElementLocated( WebDriverBy::id('socialLoader') )); // spinner
$driver->findElement(WebDriverBy::partialLinkText("Advanced"))->click();

得到了这个


寻找先进的PHP致命错误:未捕获异常'UnknownServerException',提示消息'unknown error: Element is not clickable at point(89,127)。其他元素将收到click:…


I tried this

// sleep(1); // spinner
echo "Finding Status Active'n";
$driver->wait(10)->until( WebDriverExpectedCondition::elementToBeClickable( WebDriverBy::id('socialLoader') ) );
$driver->wait(10)->until( WebDriverExpectedCondition::invisibilityOfElementLocated( WebDriverBy::id('socialLoader') )); // spinner

得到了这个

查找活动状态
PHP致命错误:C:'Users'finance.operations'Desktop'Teads' PHP -webdriver'lib'WebDriverWait.php:69

未捕获异常'TimeOutException'

从另一个角度来看这个问题——使用WebDriverExpectedCondition::stalenessOf等待旋转器覆盖不再附加到DOM上,或者使用WebDriverExpectedCondition::invisibilityOfElementLocated等待旋转器覆盖不可见。

使用的预期条件取决于之后旋转器发生了什么——它是完全从DOM中删除还是只是变得不可见。