Selenium 硒:测试“;“提交时禁用”;行为

Selenium 硒:测试“;“提交时禁用”;行为,selenium,webdriver,selenium-webdriver,Selenium,Webdriver,Selenium Webdriver,我们正在使用SeleniumWebDriver测试具有双重post预防行为的表单。有一些简单的javascript可以在单击时禁用按钮,这样用户就不会意外地发布相同的内容两次 我们如何测试这一点 问题是按钮。click()会一直阻塞,直到下一页加载完毕,此时我们肯定无法断言上一页上的按钮的任何内容。即使我们以某种方式将.click()设置为非阻塞,也存在固有的争用条件;如果浏览器/javascript比测试系统快得多,那么它将能够在测试能够断言关于按钮的任何内容之前卸载页面 没有javascri

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

我们如何测试这一点

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


没有javascript注入黑客的解决方案的额外积分。

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

WebElement输入=driver.findElement(按.tagName(“输入”);
输入.发送键(key.ENTER,key.ESCAPE);
Assert.assertFalse(input.isEnabled());
它会连续快速地向按钮发送Enter和Esc,这样JavaScript就会启动,但页面加载没有机会启动。我能看到的唯一问题是,除非刷新并发送新表单,否则您将无法使用此测试进入下一页。但是我们应该一次只测试一个特性,所以您很好;-)


编辑(针对您的评论)

事实上,是的!您可以尝试通过()同时发送单击和Esc键。您也可以通过这种方式实现非阻塞单击

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

WebElement输入=driver.findElement(按.tagName(“输入”);
新操作(驱动程序)
。单击(输入)
.sendKeys(输入、键、转义)
.perform();

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


试验

这是一个开始!事实上,这比一开始听起来更合理。我很惊讶你能用键盘激活
onclick
,但这很有意义。您是否希望这会产生与
不同的结果。在一般情况下,单击
?没有办法发送click+escape吗?@bukzor一般来说,在打开链接和使用按钮操作时,回车键相当于左键单击。在尝试选中复选框时,应使用空格键。这方面并没有w3c标准(我已经找到了),但您可以在浏览器中导航,而无需鼠标。另外,总有人在积极地监听按键,防止按键发生。@bukzor“点击+转义”解决方案已编辑到答案中,请看那里。谢谢!认可的。我很好奇;要进行非阻塞单击,我是否只使用定义了单击的actionchain?@bukzor Yep。有鉴于此,我提出的两种解决方案(以及您正在考虑的仅使用
click()
)在理论上都不需要Esc键,因为它们不会阻塞。祝你考试顺利!click()真的会阻塞吗?我的观察得出了相反的结论。@AshwinPrabhu It以WebDriver能猜到的最好的方式阻止了它。如果有对新页面的异步请求,则不会。如果你点击一个链接,它肯定会被阻止。@AshwinPrabhu:你是在使用RC还是WebDriver?如果只使用一个按钮就可以使用普通的html表单,那么应该看到直到页面刷新之后才能重新获得测试中的控制权。我发现,如果javascript正在执行
事件。preventDefault()
,selenium会更早返回,但这不是正常情况。@AshwinPrabhu相反,这是在中明确指出的。@Slanec感谢链接。我认为这是一种脱节。我说的是任何为响应click事件而调用的脚本。即使浏览器响应单击事件处理而进入忙碌状态,WebDriver也不会阻止。感谢您在单击页面加载时清除讨论-我没有意识到这种行为。