【问题标题】:PHPUnit throws exceptions when there should be nonePHPUnit 在应该没有异常时抛出异常
【发布时间】:2017-09-05 11:04:19
【问题描述】:

我正在尝试为 Web 应用程序设置测试 - 我在 Docker 和 PHPUnit 5.7.19 中有带 VNC 的 Selenium 独立 3.2 服务器。

不过一行

$this->webDriver->findElement(WebDriverBy::xpath($main_button_xpath))->click();

有时会抛出(但有时不会)不应该的异常 - 我已经通过 VNC 观看了它,目标按钮被看到并出现在屏幕上,但它仍然抛出异常。自从我从 2.57 升级 Selenium 服务器后,这些错误开始出现。

您知道如何更好地修复或调试它吗?

非常感谢

编辑:例外

The element reference is stale. Either the element is no longer attached to the DOM or the page has been refreshed.
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '3.2.0', revision: '8c03df6', time: '2017-03-02 09:34:51 -0800'
System info: host: 'dbcbaf52ae71', ip: '172.17.0.3', os.name: 'Linux', os.arch: 'amd64', os.version: '3.10.0-514.10.2.el7.x86_64', java.version: '1.8.0_121'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{moz:profile=/tmp/rust_mozprofile.JUP1ydgC8zCR, rotatable=false, timeouts={implicit=0, page load=300000, script=30000}, pageLoadStrategy=normal, platform=ANY, specificationLevel=0, moz:accessibilityChecks=false, acceptInsecureCerts=false, browserVersion=52.0, platformVersion=3.10.0-514.10.2.el7.x86_64, moz:processID=17210, browserName=firefox, platformName=linux}]
Session ID: 47bf2157-c7a8-47ea-a82a-3ab3ddd0ee61

【问题讨论】:

  • 您有实际异常消息和堆栈跟踪的示例吗?
  • @segFault 添加了异常

标签: php selenium exception phpunit


【解决方案1】:

你有没有尝试过这样做?

$wait = new \Facebook\WebDriver\WebDriverWait($driver, 5, 250);
$condition = \Facebook\WebDriver\WebDriverExpectedCondition::presenceOfElementLocated(Facebook\WebDriver\WebDriverBy::xpath($main_button_xpath));

$btn = $wait->until($condition);
$btn->click();

更新:

进行迭代尝试的方法可能看起来像下面发布的那样。我仍然相信这只是可能有所帮助,具体取决于页面上发生的情况。

$limit = 20; // might be different
$staleException = NULL;

for($i = 1; $i <= 20; $i++){
    try{
        // assuming $webDriver is ready to use and $main_button_xpath, too
        $webDriver->findElement(WebDriverBy::xpath($main_button_xpath))->click();
        $staleException = NULL;
        break;
    } catch (\Facebook\WebDriver\Exception\StaleElementReferenceException $ex) {
        $staleException = $ex;
        usleep(250000); // 250 milliseconds wait
    }
}

if($staleException){
    throw $staleException;
}

并回答您的评论:是的,我相信没有适当的解决方案,即干净整洁的代码。为了避免此类事情,我们应该了解页面上的 html 和 js 发生的这些低级细节,以便了解选择哪种防御策略。我认为除了针对每件棘手的事情(或棘手类型的事情,无论如何)发生的一系列策略之外,不会有另一个“通用解决方案”。

【讨论】:

  • 会尝试,但为什么会发生这种情况?它在更新到 3.2 之前完美运行
  • 查看了您对异常详细信息的更新。我猜wait 能力不会解决问题。看起来它确实找到了元素,但随后又失去了它。页面上有复杂的JS吗?
  • 我明白了。由于某些 js 活动(分离、移动或类似的事情),在检索其引用和实际单击之间的元素可能会发生某些事情。如果是这种情况,快速修复可能只是在循环中继续重试一些合理数量的尝试。
  • 好的,谢谢,请记住这一点。但是从你说的方式来看,似乎没有合适的解决方案:) 有没有办法多次尝试但仍然只捕获最后一个异常? (我最近才开始学习PHP)
  • 请查看更新。抱歉有点晚了,我没能早点回来
猜你喜欢
  • 2020-12-21
  • 2011-08-06
  • 2013-05-24
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多