Compare commits

..

11 Commits

Author SHA1 Message Date
James
de0eb1dceb make desired cap's env as json 2020-10-08 14:36:12 +01:00
James
36e74f63b6 bugfix 2020-10-08 12:30:22 +01:00
James
374ddd1560 allow selenium host/port to be specified in env 2020-10-08 12:11:02 +01:00
James
7d3fb69463 add link crawler 2020-02-16 09:04:19 +00:00
James
abb4354362 dont error if no SeleniumBrowserUrl 2020-02-11 20:30:44 +00:00
James
e03444314b fix take screenshot for all results but success 2020-02-10 18:03:33 +00:00
James
ffccf63792 fix to accept browser args key and val 2020-02-01 18:20:34 +00:00
James
61899f1013 fix: browser args exploded on wrong delimeter 2020-02-01 17:42:03 +00:00
James
d515b270f6 Revert "fix: not taking screenshots for errored tests. needs to be better"
This reverts commit 208bedc7ff.
2020-02-01 14:56:05 +00:00
James
208bedc7ff fix: not taking screenshots for errored tests. needs to be better 2020-01-29 18:09:38 +00:00
James
ba63cceeb1 fix screenshot filename 2019-09-23 12:20:11 +01:00
4 changed files with 178 additions and 9 deletions

View File

@ -9,7 +9,8 @@
],
"require": {
"phpunit/phpunit-selenium": "^4.1",
"facebook/webdriver": "^1.7"
"php-webdriver/webdriver": "^1.7",
"spatie/crawler": "^4.6"
},
"autoload": {
"psr-4": {

View File

@ -9,20 +9,32 @@ namespace JHodges\PHPUnitBase;
abstract class BrowserTest extends \PHPUnit_Extensions_Selenium2TestCase{
public function setUp(){
$this->setHost('localhost');
$this->setPort(4444);
$args=explode(',',getenv('SeleniumBrowserArgs'));
$args[]='screenshot';
$this->setDesiredCapabilities(['moz:firefoxOptions'=>['args'=>$args]]);
$this->setBrowserUrl(getenv('SeleniumBrowserUrl'));
if(! $host=getenv('SeleniumHost')){
$host='localhost';
}
if(! $port=(int)getenv('SeleniumPort')){
$port=4444;
}
if($dcj=getenv('SeleniumDesiredCapabilities')){
$dc=json_decode($dcj,true);
if($dc===null){
throw new \Exception("Invalid JSON: $dcj");
}
$this->setDesiredCapabilities($dc);
}
$this->setHost($host);
$this->setPort($port);
if($url=getenv('SeleniumBrowserUrl')){
$this->setBrowserUrl($url);
}
$this->setBrowser(getenv('SeleniumBrowser'));
}
public function tearDown(){
if ($this->hasFailed()) {
if ($this->getStatus()!==0) {
if($path=getenv('SeleniumScreenshotPath')){
$filedata = $this->currentScreenshot();
file_put_contents($path.get_class($this).':'.$this->getName().'.png', $filedata);
file_put_contents($path.get_class($this).'::'.$this->getName().'.png', $filedata);
}
}
$this->stop();

101
src/CrawlObserver.php Normal file
View File

@ -0,0 +1,101 @@
<?php
namespace JHodges\PHPUnitBase;
use GuzzleHttp\Exception\RequestException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
use Spatie\Crawler\CrawlObserver as BaseCrawlObserver;
class CrawlObserver extends BaseCrawlObserver
{
public $results=[];
/**
* Called when the crawler will crawl the url.
*
* @param \Psr\Http\Message\UriInterface $url
*/
public function willCrawl(UriInterface $url)
{
}
/**
* Called when the crawler has crawled the given url successfully.
*
* @param \Psr\Http\Message\UriInterface $url
* @param \Psr\Http\Message\ResponseInterface $response
* @param \Psr\Http\Message\UriInterface|null $foundOnUrl
*/
public function crawled(
UriInterface $url,
ResponseInterface $response,
?UriInterface $foundOnUrl = null
){
$code=$response->getStatusCode();
$type=$response->getHeader('Content-Type')[0]??null;
// Retrieve both Redirect History headers
$fullRedirectReport = [];
if($response->getHeader('X-Guzzle-Redirect-History')){
$redirectUriHistory = $response->getHeader('X-Guzzle-Redirect-History'); // retrieve Redirect URI history
$redirectCodeHistory = $response->getHeader('X-Guzzle-Redirect-Status-History'); // retrieve Redirect HTTP Status history
$fullRedirectReport=[$redirectUriHistory,$redirectCodeHistory];
}
$this->results[]=[
'link'=>(String)$url,
'code'=>$code,
'type'=>$type,
'parent'=>(string)$foundOnUrl,
'redirects'=>$fullRedirectReport,
];
}
/**
* Called when the crawler had a problem crawling the given url.
*
* @param \Psr\Http\Message\UriInterface $url
* @param \GuzzleHttp\Exception\RequestException $requestException
* @param \Psr\Http\Message\UriInterface|null $foundOnUrl
*/
public function crawlFailed(
UriInterface $url,
RequestException $requestException,
?UriInterface $foundOnUrl = null
){
if($response=$requestException->getResponse()){
$code=$response->getStatusCode();
$type=$response->getHeader('Content-Type')[0]??null;
}else{
$code='???';
$type='';
}
// Retrieve both Redirect History headers
$fullRedirectReport = [];
if($response && $response->getHeader('X-Guzzle-Redirect-History')){
$redirectUriHistory = $response->getHeader('X-Guzzle-Redirect-History'); // retrieve Redirect URI history
$redirectCodeHistory = $response->getHeader('X-Guzzle-Redirect-Status-History'); // retrieve Redirect HTTP Status history
$fullRedirectReport=[$redirectUriHistory,$redirectCodeHistory];
}
$this->results[]=[
'link'=>(String)$url,
'code'=>$code,
'type'=>$type,
'parent'=>(string)$foundOnUrl,
'redirects'=>$fullRedirectReport,
];
}
/**
* Called when the crawl has ended.
*/
public function finishedCrawling() {
//print_r($this->results);
}
}

55
src/CrawlTest.php Normal file
View File

@ -0,0 +1,55 @@
<?php
namespace JHodges\PHPUnitBase;
use \PHPUnit\Framework\TestCase;
use GuzzleHttp\RequestOptions;
use GuzzleHttp\Psr7\Uri;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
use Spatie\Crawler\Crawler;
use Spatie\Crawler\CrawlUrl;
use Spatie\Crawler\CrawlInternalUrls;
abstract class CrawlTest extends TestCase{
/**
* @return string the source domain
**/
abstract protected function getUrl();
public function testCrawl(){
$observer=new CrawlObserver();
Crawler::create([
RequestOptions::ALLOW_REDIRECTS => [
'track_redirects' => true,
],
])
->setCrawlObserver($observer)
->setCrawlProfile(new CrawlInternalUrls( $this-> getUrl() ))
//->addToCrawlQueue( CrawlUrl::create(new Uri('https://another_entry_point??')) )
->startCrawling( $this-> getUrl() )
;
$this->assertTrue(true);
return $observer->results;
}
/**
* @depends testCrawl
*/
public function testBrokenLinks($results){
$errors='';
foreach($results as $result){
if($result['code']!=200){
$errors.="{$result['code']} {$result['link']} (found on {$result['parent']})\n";
}
}
if($errors){
throw new \Exception("\n".$errors);
}else{
$this->assertTrue(true);
}
}
}