【问题标题】:Execute javascript in Selenium with Facebook PHP WebDriver使用 Facebook PHP WebDriver 在 Selenium 中执行 javascript
【发布时间】:2016-12-04 08:44:12
【问题描述】:

我正在尝试跟随 this documentation 执行脚本,但我得到的只是一个错误,提示 executeScript 方法未定义。

$this->driver->navigateTo('/');
$this->driver->clickElement('#member_opt_in + label');
$this->driver->executeScript("alert('Hi');");

文档使用$session,并在页面上方说明这是速记,但根本没有解释$session 实际包含什么或如何分配它。

【问题讨论】:

  • 您使用的是哪个浏览器?可能是浏览器端出现故障

标签: php facebook selenium facebook-php-webdriver


【解决方案1】:

GitHub 上的 wiki 与当前的 php-webdriver 库不是最新的,并且指的是它的先前(2013 年之前)版本 - 但该库是从头开始重写的。

要执行 Selenium 命令,您需要 RemoteWebDriver 的实例。在readme 中可以看到一个示例。

使用$driver 变量中的RemoteWebDriver 实例,您可以执行:

$driver->get('http://google.com');

$element = $driver->findElement(WebDriverBy::cssSelector('#member_opt_in + label'));
$elemen->click();

// Execute javascript:
$driver->executeScript('alert("Hi");');
// Or to execute the javascript as non-blocking, ie. asynchronously:
$driver->executeAsyncScript('alert("Hi");');

请参阅API documentation 了解更多信息。

【讨论】:

  • 需要哪个版本?
  • @AndrewVakhniuk 好吧,任何 1.0.0+,但你为什么不试试最新的 - 1.6.0。
  • 很好的解释 Ondrej 和我也在 github 上关注了你的一些 cmets,你认为我们可以使用 executeAsyncScript 来确定 Ajax 是否停止加载吗?我试图通过stackoverflow.com/questions/64590437/… 解决这个问题
【解决方案2】:

对于使用 Laravel Dusk 的人(在我的例子中,我想单击 Facebook 模式来测试通过 Socialite 的联合登录):

use Facebook\WebDriver\WebDriverBy;

$confirmationButton = $browser->driver->findElement(WebDriverBy::cssSelector('.layerConfirm')); 
$browser->driver->executeScript("arguments[0].click();", [$confirmationButton]);

这似乎强制点击,尽管之前来自 Dusk 的屏幕截图显示黑色(大部分为黑色)半透明层悬停在整个屏幕上,阻止任何点击(即使在正常的非 Dusk 尝试中,浏览器中的所有内容看起来不错)。

另见:

附:后来我也意识到 Facebook 模态在膨胀/出现时有一个花哨的渐变过渡,所以似乎$browser->waitFor('.layerConfirm', 4) 过早地触发了,所以我想我可以改为使用pause(2000) 来强制它等待一个完整的 2转换完成的秒数(然后根本不需要使用executeScript)。但是再多的停顿也不会让模态变得完全可见和可点击。

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 2015-09-04
    • 2019-06-14
    • 2013-10-06
    • 2019-07-25
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多