未捕获 Facebook\WebDriver\Exception\UnknownCommandException: POST ../element//click while clicking Google Search button using Selenium and IE 8

Uncaught Facebook\WebDriver\Exception\UnknownCommandException: POST ../element//click while clicking Google Search button using Selenium and IE 8

我在使用 php 代码中的 click() 函数时遇到问题。它总是抛出这个异常:

Fatal error: Uncaught Facebook\WebDriver\Exception\UnknownCommandException: POST /session/f3cffab9-71ad-4e0a-baab-4a46d807ce3d/element//click

我正在 运行开启它:

但它不适用于 7.07.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();

?>

如果我理解正确,应该转到 google、select 搜索栏并将字符串 "test" 放在那里。然后它应该 select 提交按钮并提交表单。我尝试了不同的站点以及不同的命令,似乎我可以做所有事情,但 clicksendKeys。我也尝试了最新的 Firefoxgeckodriver 并得到了相同的结果。

由于如下所示的错误消息指出 WebDriver 命令未知:

Fatal error: Uncaught Facebook\WebDriver\Exception\UnknownCommandException: POST /session/f3cffab9-71ad-4e0a-baab-4a46d807ce3d/element//click

当您正确检查 POST 请求的终点时,您会注意到有一个双斜线。相反,它应该是 "element/click".

所以这是 Facebook 的 webdriver 客户端中的一个错误,因此对于任何驱动程序都会失败。您真的使用最新版本的客户端吗?查看current source on Github好像没问题,代码已经快3年没改了

这个错误信息...

Fatal error: Uncaught Facebook\WebDriver\Exception\UnknownCommandException: POST /session/f3cffab9-71ad-4e0a-baab-4a46d807ce3d/element//click

...表示 click() 方法失败。

如果您检查您用作的 HTML DOM of Google Home Page through development tools, you will observe the

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 更新到当前水平 Version 3.141.59.

好吧,我解决了我的问题,事实证明它有点复杂。 click() 函数本身没有问题,但 findElement() 函数没有问题。 the library 本身有问题。它期望 ELEMENT 作为 $raw_element 中的索引,而网络驱动程序本身 returns 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 变量的函数都需要进行编辑才能使其正常工作。感谢大家帮助我解决这个问题。

更新

现在我完全明白了问题所在,是webdriver使用W3C协议引起的。如果你想避免这个问题,可以使用 chrome 和 chrome 驱动程序,或者将你的驱动程序降级到旧版本(早在 2017 年)。

在我的例子中,解决问题的方法只是将旧的 facebook/webdriver(版本 1.6.0)升级到最新的 php-webdriver/webdriver(版本 1.8.2)。