我知道我可以让Selenium 2的webdriver运行JavaScript并获得返回值,但是发生了如此多的异步事件,我希望JavaScript与Selenium对话,而不是相反。我做了一些搜索,但没有找到这样的东西。人们通常只使用implicitly_wait
吗?这看起来很可能失败,因为不可能对所有事情都计时?最好的例子就是让Selenium知道XHR什么时候完成,或者让一个异步动画知道执行时间。
这个是可能的吗?我们在Saucelabs上使用Selenium 2和Python。
发布于 2011-04-14 03:18:05
您应该研究一下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,但它会使您的测试更具可读性。
发布于 2011-04-12 05:43:19
理论上这是可能的,但我建议不要这么做。
该解决方案可能会在站点上运行一些jQuery,以便在JavaScript处理完成时将变量设置为true。
将Selenium设置为循环通过getEval,直到该变量为真,然后在selenium中执行一些操作。
它可以满足您的要求,但这是一个非常糟糕的想法。如果由于某种原因,您的jQuery没有将触发器变量设置为true (或您期望的任何状态),Selenium将无限期地停留在那里。您可以设置一个非常长的超时时间,但是让Selenium执行getEval并等待特定元素出现有什么不同呢?
这听起来像是你试图过度设计你的解决方案,这会给你带来更多的痛苦,在未来几乎没有额外的好处。
发布于 2011-04-09 04:03:52
不是太直率,但是如果你想让你的应用程序和你的测试运行者对话,那么你就做错了。
如果需要等待XHR完成,可以尝试显示微调器,然后测试微调器是否消失,以指示请求成功。
关于动画,当动画完成时,也许它的回调可以添加一个类,指示动画已经完成,然后您可以测试该类的存在。
https://stackoverflow.com/questions/5600048
复制相似问题