5

我在文档的某处读到 WebDriver API 是非阻塞的(除了一些像 driver.get 的)。因此,执行 WebElement click() 或 isDisplayed() 通常应该是异步的(当然,假设启用了本机事件)。

我有一个简单的 HTML 页面,它执行一个长操作(基本上是一个长循环)。当 JS 执行时,浏览器没有响应,这是预期的。但我也注意到,只要浏览器忙于执行脚本,WebDriver API 就像 click()/isDisplayed()/executeScript() 块一样。

由于 WebDriver 为点击发出原生事件,而不是合成的 JS 事件,我很困惑为什么 API 会阻塞。虽然目前这种行为并没有困扰我,但我想知道在对无响应的页面运行测试时是否可以依赖这种阻塞性质?我确实在我的测试中使用了条件等待,但想了解幕后发生了什么以及这是否是特定于浏览器/操作系统的?

我在 Windows 7 上使用 InternetExplorerDriver (IE9) 和 ChromeDriver (Chrome 19) 在 Selenium 2.20.0 中看到了这种行为。

4

1 回答 1

6

实际上,对于 Selenium 库的许多用户来说,使用阻塞与非阻塞 API 是一个争论点。图书馆在很多地方都会尝试“最佳猜测”来阻止,即使是在元素点击时,但不能保证。开发人员社区已经详细讨论了阻塞和非阻塞之间的这种紧张关系,并反映在其中一个常见问题解答中在项目维基中。在 IE 的情况下,驱动程序确实会尝试阻止元素点击,并且它是否成功阻止是一个竞争条件。在您的特定页面的情况下,IE 驱动程序(显然是 Chrome)正在“赢得”那场比赛,直到操作完成为止。但是,在其他情况下,驱动程序也很容易输掉比赛,因此最好在继续代码中的下一步之前使用显式等待其他页面更改。

如果将来成为问题,您可以通过设置页面加载超时来更早地进入下一条语句来缓解这种情况。这种方法的一个小挑战是目前并非所有浏览器都可以实现超时(IE 可以,我不知道 Chrome)。

于 2012-06-20T16:10:18.517 回答