我有一个带有两个提交按钮的表单,我想用Selenium进行测试。
查看:
<?php
$form = $this->beginWidget('CActiveForm', array(
'id' => 'profile-form',
'enableAjaxValidation' => true,
'action' => '',
'clientOptions' => array(
'validateOnSubmit' => true,
'validateOnChange' => true,
'validateOnType' => false,
),
));
?>
<input name="cancel" type="submit" value="Cancel" />
<input name="submit" type="submit" value="Save changes" />
<?php $this->endWidget(); ?>
控制器没什么特别的,您可以假设它只打印“您的个人资料已保存”或“您的个人资料未保存”,具体取决于$ _POST ['取消']获取
测试代码:
<?php
$this->open('/profile_form_url');
$submit_button_selector = 'css=#profile-form input[name="submit"]';
$cancel_button_selector = 'css=#profile-form input[name="cancel"]';
$this->clickAndWait($cancel_button_selector);
$this->assertTextPresent('Your profile was not saved');
$this->open('/profile_form_url');
$this->clickAndWait($submit_button_selector);
$this->assertTextPresent('Your profile has been saved');
问题是代码在浏览器中运行良好,但在Selenium / Firefox中运行测试时则不行。运行测试时,它只“看到”第一个按钮(取消),单击“保存更改”具有相同的效果。如果先放置保存更改按钮,则不会“看到”取消按钮。
如果关闭enableAjaxValidation,它在浏览器和Selenium中都有效,但我当然希望有一个更优雅的解决方案。例如,在单击取消时关闭AJAX验证。
不,问题不依赖于您用于按钮的定位器(xpath,css,id)。
答案 0 :(得分:1)
clickAndWait()
调用waitForPageToLoad()
- ajax表单验证通常不会触发此事件(除非页面加载),因此您的测试永远不会完成;这可能就是为什么如果你关闭ajax验证它的工作原理。
您可能希望查看selenium提供的其他选项(this is an old link to the free phpunit pocket guide,它描述了一些其他选项 - 虽然它基于phpunit 3.1),例如使用click()
然后使用waitForCondition()
一些javascript要运行,如果显示新文本,则返回true。