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 году).

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