Javascript 如何防止元素从DOM错误中分离?

Javascript 如何防止元素从DOM错误中分离?,javascript,ajax,jsf,primefaces,cypress,Javascript,Ajax,Jsf,Primefaces,Cypress,cypress/jsf和两个PrimeFaces自动完成有一个计时问题。我们对设施的输入取决于所选元素。当选择一个元素时,将发送一个ajax请求并更新facility字段。(参见下面的代码示例-xhtml) 我们的cypress测试首先选择一个元素,然后想要选择一个设施。但是,无法清除facility输入字段,因为它与DOM分离。错误消息是:“CypresError:超时重试:cy.clear()失败,因为此元素已从DOM分离。”我们已经等待ajax请求(使用cy.route),但问题仍然存在。

cypress/jsf和两个PrimeFaces自动完成有一个计时问题。我们对设施的输入取决于所选元素。当选择一个元素时,将发送一个ajax请求并更新facility字段。(参见下面的代码示例-xhtml)

我们的cypress测试首先选择一个元素,然后想要选择一个设施。但是,无法清除facility输入字段,因为它与DOM分离。错误消息是:“CypresError:超时重试:cy.clear()失败,因为此元素已从DOM分离。”我们已经等待ajax请求(使用cy.route),但问题仍然存在。(参见下面的代码示例-javascript)

如何防止使用依赖输入字段分离错误

<!-- element -->
<p:outputLabel id="elementLabel" for="element" value="#{i18n.element}" />
<p:autoComplete id="element" value="#{bean.selectedElement}"
                  dropdown="true"completeMethod="#{bean.completeElement}"
                  var="element" itemValue="#{element}" itemLabel="#{element}">
    <p:ajax event="itemSelect" listener="#{bean.updateFacility()}" 
    partialSubmit="true" process="@this" update="facility"/>
</p:autoComplete>

<!-- facility -->
<p:outputLabel id="facilityLabel" for="facility" value="#{i18n.facility}" />
<p:autoComplete id="facility" value="#{bean.selectedFacility}" required="false"
                dropdown="true" completeMethod="#{bean.completeFacility}"
                var="facility" itemValue="#{facility}" itemLabel="#{facility}" >
</p:autoComplete>

关于cypress,我无法帮助您,但我在开发primefaces selenium()时遇到了同样的问题。当我查找一个“普通的”selenium元素时,随后进行AJAX更新并尝试使用它->我得到了一个“分离的元素”异常。我解决了这个问题以始终获取代理元素,代理元素在每个方法调用上都会像
click()
一样懒洋洋地查找组件。也许cypress中也有类似的东西,比如元素代理或惰性机制。你能试着用这一行来代替吗
cy.get(inputField).should('be.visible').clear().type('Dummy 1').parent()
@tandraschko我认为cypress中没有已知的元素代理或惰性机制。“cy.get”应该是一种延迟获取机制。我们尝试了:cy.get(inputField).should(“be.visible”);cy.get(inputField.clear();cy.get(inputField).type(searchField);上面的代码不起作用(同样的问题)。@ManuelAbascal我们尝试添加“.parent()”,但它没有解决我们的问题。@Emjey Waiting确实收到了效果。新更新万岁!:)
cy.route({
    method: 'POST', url: '/app/dummy.xhtml'
}).as('request')
cy.selectOptionLoadingAlias('#element_input', '#element_1', '@request')
cy.selectOptionLoadingAlias('#facility_input', '#facility_1', '@request')

Cypress.Commands.add("selectOptionLoadingAlias", (inputField, selectOption, alias) => {
    cy.get(inputField).should('be.visible').clear().type('Dummy 1')

    cy.wait(alias).then((xhr) => { 
        // we checked that xhr is the correct request (update for element/facility)
        cy.get(selectOption).click()
        cy.get(selectOption).should('not.be.visible')
    })
})