【问题标题】:How do I detect and wait for an overlay in Selenium WebDriver?如何检测并等待 Selenium WebDriver 中的覆盖?
【发布时间】:2015-07-05 09:39:25
【问题描述】:

页面顶部出现了一个微调框叠加层,我必须等待它完成加载。在它消失后,我可以单击元素。但是,当我执行测试以查看元素是否可点击时,它总是返回 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”和消息“未知错误:元素在点 (89、127) 处不可点击。其他元素会收到点击:...


我试过了

// 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”

【问题讨论】:

    标签: php selenium selenium-webdriver webdriver


    【解决方案1】:

    从不同的角度来看问题 - 等待微调器覆盖不再使用 WebDriverExpectedCondition::stalenessOf 附加到 DOM 或使用 WebDriverExpectedCondition::invisibilityOfElementLocated 不可见。

    使用哪种预期条件取决于微调器之后发生的情况 - 它是完全从 DOM 中删除还是变得不可见。

    【讨论】:

    • 应用正定位器总是更好。例如,与其等待颤动者消失,不如等待叠加层出现。负定位器仍然会像初始条件一样受到竞争条件的影响。可以这样想,当与您的应用程序交互时,人类不会等待微调器。他正在等待对话与之互动。微调器只是我们真正想要的一个副作用。
    • @JohnCartwright 这是一个很好的观点,谢谢。通过否定定位符查看这个问题也可能会发现更好的问题解决方案,或提供更好的理解。
    • 好的,我尝试了$spinner = $driver-&gt;findElement(WebDriverBy::id('socialLoader')); $driver-&gt;wait(10)-&gt;until( WebDriverExpectedCondition::stalenessOf( $spinner ) );,但它给出了错误PHP Fatal error: Uncaught exception 'TimeOutException' in .../WebDriverWait.php:69。我试过$driver-&gt;wait(10)-&gt;until( WebDriverExpectedCondition::invisibilityOfElementLocated( WebDriverBy::id('socialLoader') )); $driver-&gt;findElement(WebDriverBy::partialLinkText("Advanced"))-&gt;click();,但有时还是会出现同样的错误Element is not clickable at point. Other element would receive the click
    • @JohnCartwright 该元素已加载到覆盖下方。我想要快速加载的元素。但是由于某种原因,叠加层会自行施加并阻止任何点击。测试我寻找的元素总是返回 true,因为它存在,但不可点击。
    • 好的,我用sleep(1); $driver-&gt;wait(10)-&gt;until( WebDriverExpectedCondition::invisibilityOfElementLocated( WebDriverBy::id('socialLoader') )); 解决了这个问题,并且我在每个元素搜索上节省了 2 秒,所以这是积极的。谢谢,我不知道invisibilityOfElementLocated
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2013-12-31
    • 2013-12-03
    相关资源
    最近更新 更多