Uncaught Facebook\WebDriver\Exception\UnknownCommandException: POST ../element//click при нажатии кнопки поиска Google с использованием Selenium и IE 8
У меня проблемы с click()
функция в моем PHP-код. Это всегда выдает это исключение:
Неустранимая ошибка: Uncaught Facebook\WebDriver\Exception\UnknownCommandException: POST /session/f3cffab9-71ad-4e0a-baab-4a46d807ce3d/element// нажмите
Я запускаю это на:
- Windows 2008 Server x64
- селен автономный сервер 3.9.1
- PHP 7.1
Но это не работает с 7.0
или же 7.2
или. Я использую новейший Facebook WebDriver и новейшие IEdriver
также.
Код, который я пытаюсь запустить:
<?php
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\WebDriverDimension;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverPoint;
require_once __DIR__ . '/vendor/autoload.php';
$host = 'http://localhost:4444/wd/hub';
$driver = RemoteWebDriver::create($host, DesiredCapabilities::InternetExplorer());
// Set size
$driver->manage()->window()->setPosition(new WebDriverPoint(0,0));
$driver->manage()->window()->maximize();
$driver->get("http://www.google.com");
sleep(1);
$driver->findElement(Facebook\WebDriver\WebDriverBy::name('q'))->click();
sleep(1);
$driver->findElement(Facebook\WebDriver\WebDriverBy::name('q'))->sendKeys('test');
sleep(1);
// Click the search button
$driver->findElement(Facebook\WebDriver\WebDriverBy::name('btnK'))->click();
$driver->quit();
?>
Если я все правильно понимаю, нужно зайти в гугл, выбрать строку поиска и вставить туда строку "тест". Затем следует нажать кнопку "Отправить" и отправить форму. Я пробовал разные сайты, а также разные команды, и кажется, что я могу делать все, но click
а также sendKeys
, Я также попробовал это с самым новым Firefox
а также geckodriver
и получил тот же результат.
3 ответа
Это сообщение об ошибке...
Fatal error: Uncaught Facebook\WebDriver\Exception\UnknownCommandException: POST /session/f3cffab9-71ad-4e0a-baab-4a46d807ce3d/element//click
... подразумевает, что click()
метод не удался.
Если вы изучите HTML DOM главной страницы Google с помощью инструментов разработки, вы увидите стратегию локатора, которую вы использовали в качестве:
Facebook\WebDriver\WebDriverBy::name('btnK')
не идентифицирует кнопку поиска Google однозначно, но идентифицирует 2 разных элемента.
Снимок:
В соответствии с рендерингом DOM Tree желаемый элемент не получает щелчок.
Решение
В качестве альтернативы вы можете использовать любую из следующих стратегий локатора:
cssSelector
:div[class]:not([jsname])>center>input[name='btnK']
xpath
://div[@class and not(@jsname)]/center/input[@name='btnK']
PS: Подумайте об обновлении Selenium до текущих уровней версии 3.141.59.
В моем случае проблема была решена простым обновлением старого facebook / webdriver (версия 1.6.0) до последней версии php-webdriver / webdriver (версия 1.8.2).
Как показано в сообщении об ошибке, показанном ниже, команда WebDriver не известна:
Неустранимая ошибка: Uncaught Facebook\WebDriver\Exception\UnknownCommandException: POST /session/f3cffab9-71ad-4e0a-baab-4a46d807ce3d/element// нажмите
Когда вы правильно проверите конечную точку для запроса POST, вы заметите, что есть двойной слеш. Вместо этого должно быть "элемент / клик".
Так что это ошибка в клиенте веб-драйвера Facebook, поэтому она не будет работать ни с одним драйвером. Вы действительно используете новейшую версию клиента? Проверяя текущий источник на Github, кажется, все в порядке, и код не менялся уже почти 3 года.
Ну, я решил свою проблему, оказалось немного сложнее. Там не было никаких проблем с click()
сама функция, а скорее с findElement()
функция. Возникла проблема с самой библиотекой. Это ожидает ELEMENT
в качестве индекса в $raw_element
пока сам вебдрайвер возвращается element-with-some-id
в качестве индекса. Редактируем библиотеку следующим образом...
public function findElement(WebDriverBy $by)
{
$params = ['using' => $by->getMechanism(), 'value' => $by->getValue()];
$raw_element = $this->execute(
DriverCommand::FIND_ELEMENT,
$params
);
//my code
return $this->newElement(reset($raw_element));
//end of my code
}
... решил проблему в этом случае, однако следует отметить, что каждая функция, которая опирается на эту переменную $ raw_element, должна быть отредактирована для правильной работы. Спасибо всем за помощь в этом.
ОБНОВИТЬ
Теперь, когда я полностью понимаю проблему, она вызвана веб-драйвером, использующим протокол W3C. Если вы хотите обойти эту проблему, используйте chrome и chromedriver или установите более раннюю версию драйвера (в 2017 году).