selenium:test"禁用提交"行为

时间:2013-01-23 23:55:50

标签: selenium webdriver selenium-webdriver

我们正在使用Selenium WebDriver来测试具有双后预防行为的表单。有一些简单的javascript可以在点击时禁用按钮,这样用户就不会意外地发布两次相同的内容。

我们如何测试?

问题是button.click()阻塞直到下一页加载,此时我们当然无法断言上一页上的按钮。即使我们以某种方式使.click()无阻塞,也存在固有的竞争条件;如果浏览器/ javascript比测试系统快得多,它将能够在测试可以断言关于按钮的任何内容之前卸载页面。

没有javascript注入的解决方案的加分点。

1 个答案:

答案 0 :(得分:5)

基于 Esc 取消每个浏览器和操作系统中的页面加载的假设,这应该有效:

WebElement input = driver.findElement(By.tagName("input")); 
input.sendKeys(Keys.ENTER, Keys.ESCAPE);
Assert.assertFalse(input.isEnabled());

它快速连续地向该按钮发送 Enter Esc ,以便激活JavaScript,但页面加载没有机会进入。唯一的问题我可以看到,除非您刷新并发送新表单,否则您将无法使用此测试进入下一页。但我们应该一次只测试一个功能,所以你很好; - )。


编辑(以解决您的评论)

实际上,是的!您可以尝试通过The Advanced User Interactions APIJavaDocs)同时发送点击和 Esc 键。 您也可以通过这种方式实现非阻止点击。

无论如何,这种方法仍然会发送两个请求,这些请求不是最容易想象的事情,但它(有时几乎没有)通过我的测试,所以你可以尝试一下:

WebElement input = driver.findElement(By.tagName("input"));
new Actions(driver)
        .click(input)
        .sendKeys(input, Keys.ESCAPE)
        .perform();

测试环境:IE8和FF18带有本地存储的文件和Selenium 2.29.1;赢得XP SP3。 测试文件如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Test</title>
</head>
<body>
    <a href="http://google.com/">
        <input type="button" value="Hello." onclick="this.disabled='true';" />
    </a>
</body>
</html>