Выполнить JavaScript в Selenium с помощью Facebook PHP WebDriver

Я пытаюсь следовать этой документации для выполнения скрипта, и все, что я получаю, это ошибка, говорящая executeScript метод не определен.

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

Документация использует $sessionи говорит выше на странице, что это сокращение, но нигде не объясняет, что $session на самом деле содержит или как его назначить.

1 ответ

Вики на GitHub не соответствует текущей библиотеке php-webdriver и ссылается на ее предыдущую (до 2013 года) версию, но с тех пор библиотека была переписана с нуля.

Для выполнения команд Selenium вам нужен экземпляр RemoteWebDriver, Пример можно увидеть в readme.

С RemoteWebDriver экземпляр в $driver переменная, которую вы можете выполнить:

$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 для получения дополнительной информации.

Для людей, использующих Laravel Dusk (и в моем случае я хотел нажать на модал Facebook, чтобы проверить федеративный вход в систему через Socialite):

use Facebook\WebDriver\WebDriverBy;

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

Это, казалось, заставляло щелкать мышью, хотя ранее на скриншотах из Dusk было видно, что темный (в основном черный) полупрозрачный слой завис над всем экраном, предотвращая любые щелчки (даже при обычных попытках не в сумерках все в браузере выглядело нормально),

Смотрите также:

PS Я также позже понял, что модал Facebook имел причудливый постепенный переход, когда он раздувал / появлялся, поэтому кажется, что $browser->waitFor('.layerConfirm', 4) преждевременно стрелял, поэтому я подумал, что могу вместо этого просто использовать pause(2000) заставить его ждать целых 2 секунды для завершения перехода (и тогда не нужно будет использовать executeScript совсем). Но никакая пауза не позволила модалу стать полностью видимым и кликабельным.

Другие вопросы по тегам