Выполнить 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 было видно, что темный (в основном черный) полупрозрачный слой завис над всем экраном, предотвращая любые щелчки (даже при обычных попытках не в сумерках все в браузере выглядело нормально),
Смотрите также:
- /questions/22559742/kak-schelknut-element-v-selenium-webdriver-s-pomoschyu-javascript/22559752#22559752
- https://facebook.github.io/php-webdriver/1.3.0/Facebook/WebDriver/JavaScriptExecutor.html
PS Я также позже понял, что модал Facebook имел причудливый постепенный переход, когда он раздувал / появлялся, поэтому кажется, что $browser->waitFor('.layerConfirm', 4)
преждевременно стрелял, поэтому я подумал, что могу вместо этого просто использовать pause(2000)
заставить его ждать целых 2 секунды для завершения перехода (и тогда не нужно будет использовать executeScript
совсем). Но никакая пауза не позволила модалу стать полностью видимым и кликабельным.