JavaScript可以和Selenium 2交互吗?

2024-05-23 18:13:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道我可以让Selenium 2的webdriver运行JavaScript并获取返回值,但是发生了太多异步的事情,我希望JavaScript与Selenium对话,而不是相反。我做了一些搜索,没有找到这样的东西。人们一般只使用implicitly_wait?这似乎很可能失败,因为不可能对所有事情进行计时?最好的例子是让Selenium知道XHR何时完成,或者异步动画的执行时间不确定。在

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


Tags: selenium时间动画javascript对话事情例子saucelabs
3条回答

不是说得太直白,但是如果你想让你的应用程序与你的测试运行人员对话,那么你做得不对。在

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

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

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

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

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

但这确实是个坏主意。如果出于某种原因jQuery没有将触发器变量设置为true(或您期望的任何状态),Selenium将不受约束地坐在那里。您可以给它设置一个很长的超时时间,但是让Selenium执行getEval并等待特定元素出现有什么不同呢?在

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

您应该研究execute_async_script()方法(JavascriptExecutor.executeAsyncScript在爪哇,IJavaScriptExecutor.ExecuteAsyncScript(在.NET中为()),它允许您等待回调函数。回调函数会自动附加到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绑定版本中还不可用,那么我希望它不久就会可用。诚然,在某种意义上,这是将“poll for desired state”从您的测试用例推到JavaScript中,但它会使您的测试更具可读性。在

相关问题 更多 >