3

我有一个带有两个提交按钮的表单,我想使用 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['cancel']

测试代码:

<?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)。

4

1 回答 1

1

clickAndWait()调用waitForPageToLoad()- ajax 表单验证通常不会触发此事件(除非页面加载),因此您的测试永远不会完成;这可能就是为什么如果你关闭 ajax 验证它可以工作。

您可能想查看 selenium 提供的其他选项(这是免费 phpunit 袖珍指南的旧链接,描述了一些其他选项 - 虽然它基于 phpunit 3.1),例如使用click()然后使用waitForCondition()一些 javascript 来运行并返回 true如果显示新文本。

于 2013-04-05T15:18:49.280 回答