我们正在使用Selenium WebDriver来测试具有双后预防行为的表单。有一些简单的javascript可以在点击时禁用按钮,这样用户就不会意外地发布两次相同的内容。
我们如何测试?
问题是button.click()
阻塞直到下一页加载,此时我们当然无法断言上一页上的按钮。即使我们以某种方式使.click()
无阻塞,也存在固有的竞争条件;如果浏览器/ javascript比测试系统快得多,它将能够在测试可以断言关于按钮的任何内容之前卸载页面。
没有javascript注入的解决方案的加分点。
答案 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 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>