我知道我可以得到Selenium 2的webdriver来运行
JavaScript并获得返回值,但异步的东西正在发生,我希望JavaScript与Selenium交谈,而不是相反.我做了一些搜索,没有找到这样的东西.人们一般使用implicitly_wait吗?这似乎可能会失败,因为不可能时间一切?完美的例子是让Selenium知道什么时候XHR完成或异步动画与不确定的执行时间.
这可能吗?我们在Saucelabs上使用Selenium 2和Python.
解决方法
您应该查看execute_async_script()方法(Java中的JavaScriptExecutor.executeAsyncScript,.NET中的IJavaScriptExecutor.ExecuteAsyncScript()),它允许您等待回调函数.回调函数自动附加到JavaScript函数中的arguments数组中.所以,假设你的页面上已经有一个JavaScript函数等待,直到你想要的条件,你可以做一些类似以下(Java代码下面,C#和Python代码应该是类似的):
String script = "var callback = arguments[arguments.length - 1];" + "callback(myJavaScriptFunctionThatWaitsUntilReady());"; driver.manage().timeouts().setScriptTimeout(15,TimeUnit.SECONDS); ((JavascriptExecutor)driver).executeAsyncScript(script);
可能会更加聪明,并将回调函数直接传递给返回正确数据的事件.您可以在项目JavaDocs中找到有关executeAsyncScript()函数的更多信息,并可以在项目源代码树中找到示例代码.在this file的测试中,等待XHR完成的一个很好的例子.
如果在SauceLabs可用的Python绑定版本中尚不可用,我希望它很久以前可用.诚然,从某种意义上说,这是将您的测试用例中的“所需状态投票”推送到JavaScript中,但这将使您的测试更易读.