1

click()我的 php 代码中的函数有问题。它总是抛出这个异常:

致命错误:未捕获的 Facebook\WebDriver\Exception\UnknownCommandException: POST /session/f3cffab9-71ad-4e0a-baab-4a46d807ce3d/element//click

我正在运行它:

  • Windows 2008 服务器 x64
  • selenium 独立服务器 3.9.1
  • PHP 7.1

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

?>

如果我正确理解所有内容,它应该去谷歌,选择搜索栏并将字符串“test”放在那里。然后它应该选择提交按钮并提交表单。我尝试了不同的站点以及不同的命令,似乎我可以做任何事情,click除了sendKeys. 我也尝试了最新的Firefoxgeckodriver得到了相同的结果。

4

4 回答 4

1

此错误消息...

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

...意味着该click()方法失败。

如果您通过开发工具检查Google Home Page的HTML DOM,您将观察到您用作的Locator Strategy :

Facebook\WebDriver\WebDriverBy::name('btnK')

没有唯一标识Google Search按钮,但它标识了 2 个不同的元素。

快照:

谷歌搜索按钮

根据DOM 树的呈现,所需的元素没有收到点击。


解决方案

作为替代方案,您可以使用以下任一定位器策略

  • cssSelector

    div[class]:not([jsname])>center>input[name='btnK']
    
  • xpath

    //div[@class and not(@jsname)]/center/input[@name='btnK']
    

PS:考虑将Selenium更新到当前级别版本 3.141.59

于 2019-08-28T22:50:39.160 回答
0

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

致命错误:未捕获的 Facebook\WebDriver\Exception\UnknownCommandException: POST /session/f3cffab9-71ad-4e0a-baab-4a46d807ce3d/element//click

当您正确检查 POST 请求的端点时,您会注意到有一个双斜杠。相反,它应该是“元素/点击”。

所以这是 Facebook 的 webdriver 客户端中的一个错误,因此任何驱动程序都会失败。您真的使用的是最新版本的客户端吗?在 Github 上查看当前的源代码似乎一切都很好,并且代码已经将近 3 年没有更改过。

于 2019-08-28T09:23:13.183 回答
0

好吧,我解决了我的问题,结果证明它有点复杂。函数本身没有问题,click()而是函数本身没有问题findElement()图书馆本身有问题。它期望ELEMENT作为索引,$raw_element而 webdriver 本身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 协议的 webdriver 引起的。如果您想避免这个问题,请使用 chrome 和 chromedriver,或者将您的驱动程序降级到旧版本(早在 2017 年)。

于 2019-08-29T07:22:16.820 回答
0

就我而言,解决问题的方法是将旧的facebook/webdriver(1.6.0 版)升级到最新的 php-webdriver/webdriver(1.8.2 版)。

于 2020-07-02T22:16:48.957 回答