未捕获 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
我正在 运行开启它:
- windows 2008 服务器 x64
- selenium 独立服务器 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();
?>
如果我理解正确,应该转到 google、select 搜索栏并将字符串 "test" 放在那里。然后它应该 select 提交按钮并提交表单。我尝试了不同的站点以及不同的命令,似乎我可以做所有事情,但 click
和 sendKeys
。我也尝试了最新的 Firefox
和 geckodriver
并得到了相同的结果。
由于如下所示的错误消息指出 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)。
我在使用 php 代码中的 click()
函数时遇到问题。它总是抛出这个异常:
Fatal error: Uncaught Facebook\WebDriver\Exception\UnknownCommandException: POST /session/f3cffab9-71ad-4e0a-baab-4a46d807ce3d/element//click
我正在 运行开启它:
- windows 2008 服务器 x64
- selenium 独立服务器 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();
?>
如果我理解正确,应该转到 google、select 搜索栏并将字符串 "test" 放在那里。然后它应该 select 提交按钮并提交表单。我尝试了不同的站点以及不同的命令,似乎我可以做所有事情,但 click
和 sendKeys
。我也尝试了最新的 Firefox
和 geckodriver
并得到了相同的结果。
由于如下所示的错误消息指出 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)。