当前位置: 首页 > 知识库问答 >
问题:

另一个 Web 驱动程序异常: 元素不再附加到 DOM

郗浩言
2023-03-14

我有一个网页,其中包含一些JavaScript并执行一些Ajax调用。当尝试使用Selenium测试它时,我随机得到“PHPUnit_Extensions_Selenium2TestCase_WebDriverException:Element不再附加到DOM”消息,可能是5次运行中的一次。

现在我意识到了Ajax调用和测试引擎之间的竞争问题,我已经采取了措施来保护它,但仍然存在一些问题。我的场景是这样的:我更改select元素1的值,它触发Ajax调用,删除select元素2的所有选项子元素,并基于Ajax响应生成新的选项子元素。测试代码

    $this->select($this->byId('select1'))->selectOptionByValue('value1');
    $this->myWaitForElementToAppear('#select2>option[value="value2"]');
    $this->select($this->byId('select2'))->selectOptionByValue('value2');

最后一行触发错误。下面是myWaitForElementToAppear方法:

public function myWaitForElementToAppear($selector, $limit = 5) {
    $start = time();
    while(true) {
        if($start + $limit < time()) {
            break;
        }
        try {
            $this->byCssSelector($selector);
            break;
        } catch(PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e) {}
    }
}

如果我没有弄错的话,myWaitForElementToAppear方法应该确保jQuery在退出之前已经添加了所需的选项,从而允许在下一行使用它。我应该补充一点,我已经确保这里不会发生超时(因为我的方法允许它发生),并且我确信情况不是这样

编辑:我应该补充一点,在我的WaitForElementToAppear呼叫之后放睡眠(1)可以解决问题,但我不明白为什么需要额外的一秒钟。难道不应该打电话给我的“等待”吗?

共有1个答案

吴涵育
2023-03-14

这里有一些解释:

首先,time()的精度非常低,只返回已经过去的整秒数,这使得整个事情变得非常模糊。其次,PHP必须在等待时坐在那里循环数千次,基本上什么也不做。一个更好的解决方案是使用两个脚本睡眠函数之一,睡()和睡(),它们将暂停执行的时间作为唯一参数。

从php.net:

sleep和usleep的想法是让cpu运行几个空闲周期,这样其他程序就可以有一些自己的周期运行。什么导致更好的响应时间和更低的整体系统负载。因此,如果你必须等待什么,就去睡几秒钟,而不是占据cpu,除了等待什么也不做。

您可以在PHPUnit中使用waitUntil:

/* waitElementToDisappear */
$this->waitUntil(function($testCase) {
    try {
        $input = $testCase->byCssSelector("#select2>option[value="value2"]");
    } catch (PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e) {
        if (PHPUnit_Extensions_Selenium2TestCase_WebDriverException::NoSuchElement == $e->getCode()) {
            return true;
        }
    }
}, 5000);

/* waitElementToAppear */
$this->waitUntil(function($testCase) {
    try {
        $input = $testCase->byCssSelector("#select2>option[value="value2"]");
        return true;
    } catch (PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e) {}
}, 5000);
 类似资料:
  • 我对自动化测试完全陌生。在参考了一些教程之后,我创建了一个自动测试用例。我尝试自动化的测试用例是在单击表的一个标题后检查排序是否正常工作。 我的自动测试用例失败,出现以下异常: 以下是代码: 例外情况来自此行: 有人能告诉我isse的原因以及如何解决吗? 非常感谢您的帮助

  • 我正在使用PageObject/PageFactory设计模式来实现UI自动化。使用Selenium2.0WebDriver.JAVA,我随机得到错误:org.openqa.Selenium。StaleElementReferenceException:当我尝试以下逻辑时,元素不再附加到DOM: 错误随机发生在if语句行,正如您所看到的,我已经尝试了一些方法来避免这种情况,比如睡眠少量时间,或者再

  • 我是的新手。试图定位一个元素并单击它。 但不断低于错误:

  • 我是Selenium新手:我有这个源代码,正在尝试使用带有selenium web驱动程序的xpath单击一个按钮。这是尝试单击的按钮(html中的最后一行): 我使用这个xpath:,它让我无法找到元素。 知道我为什么以及如何去做吗?

  • 问题内容: 我想将一个DIV元素移到另一个元素中。例如,我要移动此对象(包括所有子对象): 到这个: 这样我有: 问题答案: 曾经尝试过普通的JavaScript … 吗?

  • 我必须点击页面上的某个按钮。但是,当我检索所有具有特定类名的元素时。当我尝试执行每个元素或单击时,所有检索到的元素都会抛出一个过时的引用异常。我不能双击任何一个。它找到了正确的元素,但抛出了所有元素的例外。注释掉的代码就是我试图选择并点击相应按钮的地方。我附上了表格的照片。请注意,每次单击或执行按钮时,页面都会发生更改。选择上传BOM按钮是您需要特别注意的。网站