如何在Graphene/Selenium中勾选p:selectBooleanCheckbox并等待其勾选状态
在Arquillian+Selenium/Graphene中测试p:selectBooleanCheckbox的正确姿势
嘿,我来帮你搞定这个PrimeFaces复选框的测试难题!PrimeFaces的p:selectBooleanCheckbox和原生HTML复选框的渲染逻辑不一样,加上JSF的AJAX特性,直接用原生Selenium方法容易踩坑,下面是一步步的解决方案:
先搞对元素定位
PrimeFaces会给复选框生成带特定样式的DOM结构,比如外层有ui-chkbox类的容器,对应的label和input是关联的。别直接定位隐藏的原生input[type=checkbox](容易被样式层挡住点不了),建议定位可交互的label或者外层容器:@FindBy(css = ".ui-chkbox[for='yourCheckboxClientId']") private WebElement checkboxContainer; // 或者定位label @FindBy(id = "yourCheckboxClientId_label") private WebElement checkboxLabel;用Graphene的点击方法处理AJAX
Graphene专门针对JSF/AJAX场景做了优化,Graphene.click()会自动等待组件可点击,还能处理点击后的AJAX请求,比原生Selenium的click()靠谱多了:Graphene.click(checkboxLabel);正确等待勾选状态
你提到的XHTML里checked属性始终存在,状态由属性值决定——勾选时checked="checked",未勾选时checked=""。所以不能只检查属性存在,要验证属性值:
方法一:用Graphene的Wait类Wait<WebDriver> guiWait = Graphene.waitGui().withTimeout(5, TimeUnit.SECONDS); WebElement checkboxInput = driver.findElement(By.id("yourCheckboxClientId")); guiWait.until(driver -> checkboxInput.getAttribute("checked").equals("checked"));方法二:用预定义的ExpectedConditions
WebElement checkboxInput = driver.findElement(By.id("yourCheckboxClientId")); Graphene.waitGui().until(ExpectedConditions.attributeToBe(checkboxInput, "checked", "checked"));额外提醒:等待AJAX完成
如果你的复选框点击后触发了AJAX请求(比如更新其他组件),可以显式等待AJAX结束:Graphene.waitAjax().until().element(checkboxInput).attribute("checked").equalTo("checked");
内容的提问来源于stack exchange,提问作者Kalle Richter
相关产品推荐
相关产品推荐

