<?php
namespace J7mbo\SeleniumGrid2Api;
use J7mbo\SeleniumGrid2Api\Entity\CapabilityFactory,
J7mbo\SeleniumGrid2Api\Entity\NodeFactory,
GuzzleHttp\Client as HttpClient,
GuzzleHttp\Message\Response;
/**
* Class SeleniumGrid2Api
*
* @package J7mbo\SeleniumGrid2Api
*/
class SeleniumGrid2Api
{
/**
* @var int The timeout for the request
*/
const REQUEST_TIMEOUT = 5;
/**
* @var HttpClient
*/
protected $httpClient;
/**
* @var JsonValidator
*/
protected $jsonValidator;
/**
* @var CapabilityFactory
*/
protected $capabilityFactory;
/**
* @var NodeFactory
*/
protected $nodeFactory;
/**
* @constructor
*
* @param HttpClient $httpClient
* @param JsonValidator $jsonValidator
* @param CapabilityFactory $capabilityFactory
* @param NodeFactory $nodeFactory
*/
public function __construct(
HttpClient $httpClient,
JsonValidator $jsonValidator,
CapabilityFactory $capabilityFactory,
NodeFactory $nodeFactory
)
{
$this->httpClient = $httpClient;
$this->jsonValidator = $jsonValidator;
$this->capabilityFactory = $capabilityFactory;
$this->nodeFactory = $nodeFactory;
}
/**
* Get a Node entity representing the running node
*
* @param string $host
* @param int $port
*
* @throws NotFoundException
*
* @return Entity\Node
*/
public function getNode($host = 'localhost', $port = 5555)
{
$uri = sprintf('http://%s:%d', $host, $port);
$request = $this->httpClient->createRequest('GET', sprintf(Endpoints::NODE_STATUS), $uri, [
'timeout' => self::REQUEST_TIMEOUT
]);
try
{
/** @var Response $response */
/** @noinspection PhpVoidFunctionResultUsedInspection */
$response = $this->httpClient->send($request);
if (($status = $response->getStatusCode()) !== 200)
{
throw new NotFoundException(sprintf('Status code for: %s returned %d', $uri, $status));
}
if ($this->jsonValidator->isJson($response->getBody()))
{
throw new NotFoundException(sprintf('Invalid json returned from: %s', $uri));
}
$data = json_decode($response->getBody(), true);
$capabilities = [];
foreach($data['request']['capabilities'] as $capability)
{
if ($capability['seleniumProtocol'] === 'WebDriver')
{
$capabilities[] = $this->capabilityFactory->build(
$capability['browsername'], $capability['maxInstances'], $capability['platform']
);
}
}
return $this->nodeFactory->build($capabilities, $host, $port);
}
catch (\Exception $e)
{
throw new NotFoundException($e->getMessage());
}
}
}
preferences:
25.28 ms | 405 KiB | 5 Q