JavaScript可以与Selenium 2交谈吗?

Bjo*_*orn 9 javascript python selenium asynchronous selenium-webdriver

我知道我可以获得Selenium 2的webdriver来运行JavaScript并获得返回值,但是发生了很多异步的事情我想让JavaScript与Selenium交谈,而不是相反.我做了一些搜索,但没有找到这样的东西.人们通常只使用implicitly_wait?这似乎很可能失败,因为不可能计时一切?完美的例子是让Selenium知道XHR何时完成或异步动画具有未确定的执行时间.

这可能吗?我们在Saucelabs上使用Selenium 2和Python.

Jim*_*ans 8

您应该查看execute_async_script()方法(Java中的JavascriptExecutor.executeAsyncScript,.NET中的IJavaScriptExecutor.ExecuteAsyncScript()),它允许您等待回调函数.回调函数会自动附加到argumentsJavaScript函数中的数组中.因此,假设您已经在页面上有一个等待所需条件的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);
Run Code Online (Sandbox Code Playgroud)

它可能更加聪明,并将回调函数直接传递给返回正确数据的事件.您可以在项目JavaDocs中找到有关executeAsyncScript()函数的更多信息,并可以在项目源代码树中找到此示例代码.有一个很好的例子,等待XHR在这个文件的测试中完成.

如果在可用于SauceLabs的Python绑定版本中尚未提供此功能,我希望它不久可用.不可否认,从某种意义上说,这是将测试用例中的"所需状态轮询"推向JavaScript,但它会使您的测试更具可读性.