8000 Merge pull request #103 from dunglas/js · chalasr/symfony@d67f9db · GitHub
[go: up one dir, main page]

Skip to content

Commit d67f9db

Browse files
authored
Merge pull request symfony#103 from dunglas/js
Add JS execution capabilities to Client
2 parents ed83ec6 + 7761c66 commit d67f9db

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/Client.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use Facebook\WebDriver\Exception\NoSuchElementException;
1717
use Facebook\WebDriver\Exception\TimeOutException;
18+
use Facebook\WebDriver\JavaScriptExecutor;
1819
use Facebook\WebDriver\Remote\RemoteWebElement;
1920
use Facebook\WebDriver\WebDriver;
2021
use Facebook\WebDriver\WebDriverBy;
@@ -38,7 +39,7 @@
3839
*
3940
* @method Crawler getCrawler()
4041
*/
41-
final class Client extends BaseClient implements WebDriver
42+
final class Client extends BaseClient implements WebDriver, JavaScriptExecutor
4243
{
4344
use ExceptionThrower;
4445

@@ -389,4 +390,22 @@ public function findElements(WebDriverBy $locator)
389390

390391
return $this->webDriver->findElements($locator);
391392
}
393+
394+
public function executeScript($script, array $arguments = [])
395+
{
396+
if (!$this->webDriver instanceof JavaScriptExecutor) {
397+
throw new \RuntimeException(sprintf('"%s" does not implement "%s".', \get_class($this->webDriver), JavaScriptExecutor::class));
398+
}
399+
400+
return $this->webDriver->executeScript($script, $arguments);
401+
}
402+
403+
public function executeAsyncScript($script, array $arguments = [])
404+
{
405+
if (!$this->webDriver instanceof JavaScriptExecutor) {
406+
throw new \RuntimeException(sprintf('"%s" does not implement "%s".', \get_class($this->webDriver), JavaScriptExecutor::class));
407+
}
408+
409+
return $this->webDriver->executeAsyncScript($script, $arguments);
410+
}
392411
}

tests/ClientTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Symfony\Component\Panther\Tests;
1515

16+
use Facebook\WebDriver\JavaScriptExecutor;
1617
use Facebook\WebDriver\Remote\RemoteWebElement;
1718
use Facebook\WebDriver\WebDriver;
1819
use Facebook\WebDriver\WebDriverExpectedCondition;
@@ -35,6 +36,7 @@ public function testCreateClient()
3536
$client = self::createPantherClient();
3637
$this->assertInstanceOf(BrowserKitClient::class, $client);
3738
$this->assertInstanceOf(WebDriver::class, $client);
39+
$this->assertInstanceOf(JavaScriptExecutor::class, $client);
3840
$this->assertInstanceOf(KernelInterface::class, self::$kernel);
3941
}
4042

@@ -47,6 +49,30 @@ public function testWaitFor()
4749
$this->assertSame('Hello', $crawler->filter('#hello')->text());
4850
}
4951

52+
public function testExecuteScript()
53+
{
54+
$client = self::createPantherClient();
55+
$client->request('GET', '/basic.html');
56+
$innerText = $client->executeScript('return document.querySelector(arguments[0]).innerText;', ['.p-1']);
57+
$this->assertSame('P1', $innerText);
58+
}
59+
60+
public function testExecuteAsyncScript()
61+
{
62+
$client = self::createPantherClient();
63+
$client->request('GET', '/basic.html');
64+
$innerText = $client->executeAsyncScript(<<<JS
65+
setTimeout(function (parentArgs) {
66+
const callback = parentArgs[parentArgs.length - 1];
67+
const t = document.querySelector(parentArgs[0]).innerText;
68+
callback(t);
69+
}, 100, arguments);
70+
JS
71+
, ['.p-1']);
72+
73+
$this->assertSame('P1', $innerText);
74+
}
75+
5076
/**
5177
* @dataProvider clientFactoryProvider
5278
*/

0 commit comments

Comments
 (0)
0