当没有

时间:2017-04-10 11:58:27

标签: php selenium exception phpunit

我正在尝试为Web应用程序设置测试 - 我在Docker和PHPUnit 5.7.19中使用带有VNC的Selenium独立3.2服务器。

然而一行

$this->webDriver->findElement(WebDriverBy::xpath($main_button_xpath))->click();

有时会抛出(但有时它不会)异常,因为它不应该 - 我通过VNC观察它并且看到了目标按钮并且它出现在屏幕上并且它仍然抛出异常。自从我将Selenium服务器从2.57升级以来,这些错误就开始出现了。

您是否知道如何更好地修复或调试它?

非常感谢

编辑:例外

The element reference is stale. Either the element is no longer attached to the DOM or the page has been refreshed.
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '3.2.0', revision: '8c03df6', time: '2017-03-02 09:34:51 -0800'
System info: host: 'dbcbaf52ae71', ip: '172.17.0.3', os.name: 'Linux', os.arch: 'amd64', os.version: '3.10.0-514.10.2.el7.x86_64', java.version: '1.8.0_121'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{moz:profile=/tmp/rust_mozprofile.JUP1ydgC8zCR, rotatable=false, timeouts={implicit=0, page load=300000, script=30000}, pageLoadStrategy=normal, platform=ANY, specificationLevel=0, moz:accessibilityChecks=false, acceptInsecureCerts=false, browserVersion=52.0, platformVersion=3.10.0-514.10.2.el7.x86_64, moz:processID=17210, browserName=firefox, platformName=linux}]
Session ID: 47bf2157-c7a8-47ea-a82a-3ab3ddd0ee61

1 个答案:

答案 0 :(得分:0)

你尝试过像这样的事吗?

$wait = new \Facebook\WebDriver\WebDriverWait($driver, 5, 250);
$condition = \Facebook\WebDriver\WebDriverExpectedCondition::presenceOfElementLocated(Facebook\WebDriver\WebDriverBy::xpath($main_button_xpath));

$btn = $wait->until($condition);
$btn->click();

更新:

进行迭代尝试的方法可能看起来像下面发布的那样。我仍然认为这只是可能帮助,具体取决于页面上发生的事情。

$limit = 20; // might be different
$staleException = NULL;

for($i = 1; $i <= 20; $i++){
    try{
        // assuming $webDriver is ready to use and $main_button_xpath, too
        $webDriver->findElement(WebDriverBy::xpath($main_button_xpath))->click();
        $staleException = NULL;
        break;
    } catch (\Facebook\WebDriver\Exception\StaleElementReferenceException $ex) {
        $staleException = $ex;
        usleep(250000); // 250 milliseconds wait
    }
}

if($staleException){
    throw $staleException;
}

并回答你的评论:是的,我相信没有正确的解决方案,它的清洁和整洁的代码感。为了避免这类事情,我们假设知道这些有关网页上html和js发生情况的低级细节,以便了解选择什么样的防御策略。我认为不会有另一种通用解决方案&#34;除了针对每件棘手的事情(或棘手的事物,无论如何)发生的一系列策略。