3

我正在用 Arquillian 测试我的 JSF。

一个简单的按钮如下所示:

<h:form id="myForm">
  <a4j:commandLink value="delete" 
   ajaxSingle="true" id="delete"
   action="#{controller.delete(object)}" 
   reRender="something" status="globalStatus" 
   onclick="if(!confirm('do you really wanna delete this?')){return false;}" />
</h:form>

控制器功能将如下所示

delete(Object object){ 
  do something 
}

我的测试看起来像这样

@RunWith(Arquillian.class)
public class TestCategoryPage extends Browser 

@Test
@RunAsClient
public void delete_test(){
browser.open(URL);
browser.click("id=myForm:cbDelete");
Assert.assertTrue("something", browser.isElementPresent("xpath=//p[contains(text(), 'deleted successfull')]"));

所有其他测试都在工作,但是当我运行这个测试时,我得到以下异常:

com.thoughtworks.selenium.SeleniumException:错误:出现意外确认![你真的想删除这个吗?] 在 com.thoughtworks.selenium.HttpCommandProcessor.throwAssertionFailureExceptionOrError(HttpCommandProcessor.java:112)

有什么办法可以捕捉到这个javascript确认吗?谢谢!

4

3 回答 3

1

在“删除成功”消息之前似乎有一个确认弹出。如果是这种情况,您需要处理弹出的警报。尝试关注

driver.switchTo().alert().accept();

或者您可以使用 javascript 执行程序来覆盖确认框:

js.executeScript("window.originalConfirm = window.confirm;window.confirm = function(m) { return true; };");
于 2012-09-19T09:26:02.383 回答
1

一种选择是查看 Arquillian Graphene:https ://docs.jboss.org/author/display/ARQGRA/Getting+Started

Graphene 内置了对 ajax 等待的支持。作为 Selenium API 的包装器。

于 2012-09-06T08:56:29.157 回答
1

好吧,基本上我使用 jsexecutor 来处理 js 的“瓶颈”:

//jsCLick on element function:

public void jsClick(String cssSelector){
JavascriptExecutor js = (JavascriptExecutor) driver;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("var x = $(\'"+cssSelector+"\');");
        stringBuilder.append("x.click();");
        js.executeScript(stringBuilder.toString());
}

考虑到 Prashant Shukla 的 condiration 帖子,他建议你正确的想法,你可以按照以下方式行事:

public void jsAlertHandle(){
  JavascriptExecutor js = (JavascriptExecutor) driver;
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("window.confirm;");
            stringBuilder.append("window.confirm = function(m) { return true; };");
            js.executeScript(stringBuilder.toString());
}
jsAlertHandle();

希望现在这对你来说变得更清楚了)

于 2012-09-20T21:02:02.230 回答