3

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

我们如何测试这个?

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

没有 javascript 注入黑客的解决方案的奖励积分。

4

1 回答 1

5

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

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

它快速连续发送EnterEsc到按钮,以便触发 JavaScript,但页面加载没有机会启动。我能看到的唯一问题是你将无法使用这个进入下一页除非您刷新并发送新表格,否则请进行测试。但无论如何,我们一次只应该测试一个功能,所以你很好;-)。


编辑(解决您的评论)

其实,是!您可以尝试通过高级用户交互 API ( JavaDocs )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>
于 2013-01-24T01:57:26.937 回答