首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript可以和Selenium 2对话吗?

JavaScript可以和Selenium 2对话吗?
EN

Stack Overflow用户
提问于 2011-04-09 03:43:50
回答 4查看 4K关注 0票数 8

我知道我可以让Selenium 2的webdriver运行JavaScript并获得返回值,但是发生了如此多的异步事件,我希望JavaScript与Selenium对话,而不是相反。我做了一些搜索,但没有找到这样的东西。人们通常只使用implicitly_wait吗?这看起来很可能失败,因为不可能对所有事情都计时?最好的例子就是让Selenium知道XHR什么时候完成,或者让一个异步动画知道执行时间。

这个是可能的吗?我们在Saucelabs上使用Selenium 2和Python。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-14 03:18:05

您应该研究一下execute_async_script()方法(在Java语言中是JavascriptExecutor.executeAsyncScript,在.NET中是IJavaScriptExecutor.ExecuteAsyncScript() ),它允许您等待回调函数。回调函数会自动附加到JavaScript函数中的arguments数组中。因此,假设您在页面上已经有了一个JavaScript函数,它会一直等待到您想要的条件,您可以执行如下操作(下面的Java代码、C#和Python代码应该是相似的):

代码语言:javascript
运行
复制
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,但它会使您的测试更具可读性。

票数 8
EN

Stack Overflow用户

发布于 2011-04-12 05:43:19

理论上这是可能的,但我建议不要这么做。

该解决方案可能会在站点上运行一些jQuery,以便在JavaScript处理完成时将变量设置为true。

将Selenium设置为循环通过getEval,直到该变量为真,然后在selenium中执行一些操作。

它可以满足您的要求,但这是一个非常糟糕的想法。如果由于某种原因,您的jQuery没有将触发器变量设置为true (或您期望的任何状态),Selenium将无限期地停留在那里。您可以设置一个非常长的超时时间,但是让Selenium执行getEval并等待特定元素出现有什么不同呢?

这听起来像是你试图过度设计你的解决方案,这会给你带来更多的痛苦,在未来几乎没有额外的好处。

票数 3
EN

Stack Overflow用户

发布于 2011-04-09 04:03:52

不是太直率,但是如果你想让你的应用程序和你的测试运行者对话,那么你就做错了。

如果需要等待XHR完成,可以尝试显示微调器,然后测试微调器是否消失,以指示请求成功。

关于动画,当动画完成时,也许它的回调可以添加一个类,指示动画已经完成,然后您可以测试该类的存在。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5600048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档