【问题标题】:Screenshot with Selenium Webdriver and PHPUnitSelenium Webdriver 和 PHPUnit 的屏幕截图
【发布时间】:2014-08-25 14:53:51
【问题描述】:

我知道可以通过扩展 PHPUnit_Extensions_Selenium2TestCase 来截取屏幕截图,但现在我使用的是 Facebook 的 php-webdriver,所以我只是扩展 PHPUnit_Framework_TestCase

有没有办法只用这个驱动和不扩展扩展来截屏?

谢谢。

【问题讨论】:

    标签: php selenium phpunit


    【解决方案1】:
    $driver->takeScreenshot('/path/to/image.png');
    

    【讨论】:

    • takeScreenshot() 也返回图像数据。如果您想立即使用图像而不是将其存储在磁盘上,请尝试$image = $driver->takeScreenshot();
    • 打开页面可以正常工作,但弹出页面不能正常工作
    【解决方案2】:

    我找到了这样的解决方案,可以在失败时截图:

    /**
     * {@inheritdoc}
     */
    public function tearDown()
    {
        $status = $this->getStatus();
        if ($status == \PHPUnit_Runner_BaseTestRunner::STATUS_ERROR 
            || $status == \PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) {
            $now = new \DateTime('now');
            $screenshotFileName = $this->getParameter('screenshots_directory_full_path');
            $screenshotFileName = $screenshotFileName . $now->format('Y-m-d H:i:s') . ' test ' . $this->getName() . '.png';
    
            $this->webDriver->takeScreenshot($screenshotFileName);
        }
        $this->webDriver->quit();
    }
    

    您很久以前就问过这个问题,但希望对其他人有所帮助:)

    【讨论】:

      【解决方案3】:

      以@a_sarana 所说的话为基础。在至少 >= 5 的版本中,您可以使用 phpunit 方法:

      $this->hasFailed();
      

      例子

      if($this->hasFailed())
      {
          $selenium->takeScreenshot($filename);   
      }
      

      这假设您不关心发生的故障类型。

      附注如果您最终得到空白屏幕截图,您可能需要等待页面加载。我损失了大约半天的调试工作。

      例子

      sleep(1); // one second
      

      // wait max of 2 sec check every 1/10 sec until element is viable
      $driver->wait(2, 1000)->until(
          WebDriverExpectedCondition::visibilityOfElementLocated(WebDriverBy::id("elementID")) 
      );
      

      【讨论】: